1
0

qml: swap: like on desktop, use pkh of nostr pubkey as color

This commit is contained in:
Sander van Grieken
2025-07-11 16:33:40 +02:00
parent 62a30c5688
commit 78a7c85f49
2 changed files with 20 additions and 5 deletions

View File

@@ -87,10 +87,13 @@ ElDialog {
Layout.preferredHeight: constants.paddingLarge Layout.preferredHeight: constants.paddingLarge
Layout.preferredWidth: 1 Layout.preferredWidth: 1
} }
Image { Rectangle {
Layout.rowSpan: 5 Layout.rowSpan: 5
Layout.alignment: Qt.AlignTop Layout.alignment: Qt.AlignVCenter
source: Qt.resolvedUrl('../../icons/network.png') Layout.fillHeight: true
Layout.preferredWidth: 10
color: model.color
} }
Label { Label {
text: qsTr('Pubkey') text: qsTr('Pubkey')
@@ -118,6 +121,7 @@ ElDialog {
Label { Label {
Layout.fillWidth: true Layout.fillWidth: true
text: model.timestamp text: model.timestamp
wrapMode: Text.Wrap
} }
Label { Label {
text: qsTr('Max Forward') text: qsTr('Max Forward')

View File

@@ -5,6 +5,7 @@ from typing import Union, Optional, TYPE_CHECKING, Sequence
from PyQt6.QtCore import (pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtEnum, QAbstractListModel, Qt, from PyQt6.QtCore import (pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtEnum, QAbstractListModel, Qt,
QModelIndex) QModelIndex)
from PyQt6.QtGui import QColor
from electrum.i18n import _ from electrum.i18n import _
from electrum.bitcoin import DummyAddress from electrum.bitcoin import DummyAddress
@@ -14,6 +15,7 @@ from electrum.util import (NotEnoughFunds, NoDynamicFeeEstimates, profiler, get_
wait_for2) wait_for2)
from electrum.submarine_swaps import NostrTransport, SwapServerTransport from electrum.submarine_swaps import NostrTransport, SwapServerTransport
from electrum.fee_policy import FeePolicy from electrum.fee_policy import FeePolicy
from electrum.crypto import sha256
from electrum.gui import messages from electrum.gui import messages
@@ -34,7 +36,7 @@ class QESwapServerNPubListModel(QAbstractListModel):
# define listmodel rolemap # define listmodel rolemap
_ROLE_NAMES= ('npub', 'server_pubkey', 'timestamp', 'percentage_fee', 'mining_fee', _ROLE_NAMES= ('npub', 'server_pubkey', 'timestamp', 'percentage_fee', 'mining_fee',
'min_amount', 'max_forward_amount', 'max_reverse_amount', 'pow_bits') 'min_amount', 'max_forward_amount', 'max_reverse_amount', 'pow_bits', 'color')
_ROLE_KEYS = range(Qt.ItemDataRole.UserRole, Qt.ItemDataRole.UserRole + len(_ROLE_NAMES)) _ROLE_KEYS = range(Qt.ItemDataRole.UserRole, Qt.ItemDataRole.UserRole + len(_ROLE_NAMES))
_ROLE_MAP = dict(zip(_ROLE_KEYS, [bytearray(x.encode()) for x in _ROLE_NAMES])) _ROLE_MAP = dict(zip(_ROLE_KEYS, [bytearray(x.encode()) for x in _ROLE_NAMES]))
@@ -59,7 +61,7 @@ class QESwapServerNPubListModel(QAbstractListModel):
service = self._services[index.row()] service = self._services[index.row()]
role_index = role - Qt.ItemDataRole.UserRole role_index = role - Qt.ItemDataRole.UserRole
value = service[self._ROLE_NAMES[role_index]] value = service[self._ROLE_NAMES[role_index]]
if isinstance(value, (bool, list, int, str)) or value is None: if isinstance(value, (bool, list, int, str, QColor)) or value is None:
return value return value
return str(value) return str(value)
@@ -68,6 +70,14 @@ class QESwapServerNPubListModel(QAbstractListModel):
self._services = [] self._services = []
self.endResetModel() self.endResetModel()
@staticmethod
def str_to_color(color_input: str) -> QColor:
input_hash = int.from_bytes(sha256(color_input), byteorder="big")
r = (input_hash & 0xFF0000) >> 16
g = (input_hash & 0x00FF00) >> 8
b = input_hash & 0x0000FF
return QColor(r, g, b)
def offer_to_model(self, x: 'SwapOffer'): def offer_to_model(self, x: 'SwapOffer'):
return { return {
'npub': x.server_npub, 'npub': x.server_npub,
@@ -79,6 +89,7 @@ class QESwapServerNPubListModel(QAbstractListModel):
'max_reverse_amount': x.pairs.max_reverse, 'max_reverse_amount': x.pairs.max_reverse,
'timestamp': age(x.timestamp), 'timestamp': age(x.timestamp),
'pow_bits': x.pow_bits, 'pow_bits': x.pow_bits,
'color': self.str_to_color(x.server_pubkey),
} }
def updateModel(self, items: Sequence['SwapOffer']): def updateModel(self, items: Sequence['SwapOffer']):