From 78a7c85f496d36f899f5d73306404786ff8c36b5 Mon Sep 17 00:00:00 2001 From: Sander van Grieken Date: Fri, 11 Jul 2025 16:33:40 +0200 Subject: [PATCH] qml: swap: like on desktop, use pkh of nostr pubkey as color --- .../gui/qml/components/NostrSwapServersDialog.qml | 10 +++++++--- electrum/gui/qml/qeswaphelper.py | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/electrum/gui/qml/components/NostrSwapServersDialog.qml b/electrum/gui/qml/components/NostrSwapServersDialog.qml index 5b455dc7d..384789e0f 100644 --- a/electrum/gui/qml/components/NostrSwapServersDialog.qml +++ b/electrum/gui/qml/components/NostrSwapServersDialog.qml @@ -87,10 +87,13 @@ ElDialog { Layout.preferredHeight: constants.paddingLarge Layout.preferredWidth: 1 } - Image { + Rectangle { Layout.rowSpan: 5 - Layout.alignment: Qt.AlignTop - source: Qt.resolvedUrl('../../icons/network.png') + Layout.alignment: Qt.AlignVCenter + Layout.fillHeight: true + Layout.preferredWidth: 10 + color: model.color + } Label { text: qsTr('Pubkey') @@ -118,6 +121,7 @@ ElDialog { Label { Layout.fillWidth: true text: model.timestamp + wrapMode: Text.Wrap } Label { text: qsTr('Max Forward') diff --git a/electrum/gui/qml/qeswaphelper.py b/electrum/gui/qml/qeswaphelper.py index 323e0648e..8a9c0c194 100644 --- a/electrum/gui/qml/qeswaphelper.py +++ b/electrum/gui/qml/qeswaphelper.py @@ -5,6 +5,7 @@ from typing import Union, Optional, TYPE_CHECKING, Sequence from PyQt6.QtCore import (pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtEnum, QAbstractListModel, Qt, QModelIndex) +from PyQt6.QtGui import QColor from electrum.i18n import _ from electrum.bitcoin import DummyAddress @@ -14,6 +15,7 @@ from electrum.util import (NotEnoughFunds, NoDynamicFeeEstimates, profiler, get_ wait_for2) from electrum.submarine_swaps import NostrTransport, SwapServerTransport from electrum.fee_policy import FeePolicy +from electrum.crypto import sha256 from electrum.gui import messages @@ -34,7 +36,7 @@ class QESwapServerNPubListModel(QAbstractListModel): # define listmodel rolemap _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_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()] role_index = role - Qt.ItemDataRole.UserRole 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 str(value) @@ -68,6 +70,14 @@ class QESwapServerNPubListModel(QAbstractListModel): self._services = [] 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'): return { 'npub': x.server_npub, @@ -79,6 +89,7 @@ class QESwapServerNPubListModel(QAbstractListModel): 'max_reverse_amount': x.pairs.max_reverse, 'timestamp': age(x.timestamp), 'pow_bits': x.pow_bits, + 'color': self.str_to_color(x.server_pubkey), } def updateModel(self, items: Sequence['SwapOffer']):