From 1162f45bd5f6965a4a8ba7d4b5af25ef63d398f8 Mon Sep 17 00:00:00 2001 From: ThomasV Date: Tue, 15 Apr 2025 12:22:57 +0200 Subject: [PATCH] plugins: minor tweaks - add icon to PluginDialog - add icon to psbt_nosr - rename 'PSBT Nostr' as 'Nostr Multisig' --- electrum/gui/qt/plugins_dialog.py | 22 +++++++++++++----- electrum/plugins/labels/manifest.json | 1 + electrum/plugins/psbt_nostr/manifest.json | 5 ++-- .../plugins/psbt_nostr/nostr_multisig.png | Bin 0 -> 11898 bytes 4 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 electrum/plugins/psbt_nostr/nostr_multisig.png diff --git a/electrum/gui/qt/plugins_dialog.py b/electrum/gui/qt/plugins_dialog.py index af84beb93..d88dda556 100644 --- a/electrum/gui/qt/plugins_dialog.py +++ b/electrum/gui/qt/plugins_dialog.py @@ -9,6 +9,7 @@ from PyQt6.QtCore import Qt from electrum.i18n import _ from .util import WindowModalDialog, Buttons, CloseButton, WWLabel, insert_spaces, MessageBoxMixin, EnterButton +from .util import read_QIcon_from_bytes, IconLabel if TYPE_CHECKING: @@ -25,8 +26,9 @@ class PluginDialog(WindowModalDialog): author = metadata.get('author', '') description = metadata.get('description', '') requires = metadata.get('requires') - version = metadata.get('version', 'n/a') + version = metadata.get('version') zip_hash = metadata.get('zip_hash_sha256', None) + icon_path = metadata.get('icon') WindowModalDialog.__init__(self, window, 'Plugin') self.setMinimumSize(400, 250) @@ -37,17 +39,26 @@ class PluginDialog(WindowModalDialog): self.status_button = status_button p = self.plugins.get(name) # is enabled vbox = QVBoxLayout(self) + name_label = IconLabel(text=display_name, reverse=True) + if icon_path: + name_label.icon_size = 64 + icon = read_QIcon_from_bytes(self.plugins.read_file(name, icon_path)) + name_label.setIcon(icon) + vbox.addWidget(name_label) form = QFormLayout(None) - form.addRow(QLabel(_('Name') + ':'), QLabel(display_name)) - form.addRow(QLabel(_('Author') + ':'), QLabel(author)) - form.addRow(QLabel(_('Description') + ':'), WWLabel(description)) - form.addRow(QLabel(_('Version') + ':'), QLabel(version)) + if author: + form.addRow(QLabel(_('Author') + ':'), QLabel(author)) + if description: + form.addRow(QLabel(_('Description') + ':'), WWLabel(description)) + if version: + form.addRow(QLabel(_('Version') + ':'), QLabel(version)) if zip_hash: form.addRow(QLabel('Hash [sha256]:'), WWLabel(insert_spaces(zip_hash, 8))) if requires: msg = '\n'.join(map(lambda x: x[1], requires)) form.addRow(QLabel(_('Requires') + ':'), WWLabel(msg)) vbox.addLayout(form) + vbox.addStretch() close_button = CloseButton(self) close_button.setText(_('Close')) buttons = [close_button] @@ -297,7 +308,6 @@ class PluginsDialog(WindowModalDialog, MessageBoxMixin): self.show_list() def show_list(self): - from .util import read_QIcon_from_bytes, IconLabel descriptions = self.plugins.descriptions descriptions = sorted(descriptions.items()) grid = self.grid diff --git a/electrum/plugins/labels/manifest.json b/electrum/plugins/labels/manifest.json index c7e7f44fc..8883fd17b 100644 --- a/electrum/plugins/labels/manifest.json +++ b/electrum/plugins/labels/manifest.json @@ -1,6 +1,7 @@ { "name": "labels", "fullname": "LabelSync", + "author": "The Electrum Developers", "description": "Save your wallet labels on a remote server, and synchronize them across multiple devices where you use Electrum. Labels, transactions IDs and addresses are encrypted before they are sent to the remote server.", "icon":"labelsync.png", "available_for": ["qt", "qml", "cmdline"] diff --git a/electrum/plugins/psbt_nostr/manifest.json b/electrum/plugins/psbt_nostr/manifest.json index b8b2d47a4..9d0c60f98 100644 --- a/electrum/plugins/psbt_nostr/manifest.json +++ b/electrum/plugins/psbt_nostr/manifest.json @@ -1,8 +1,9 @@ { - "name": "psbt_nostr", - "fullname": "PSBT over Nostr", + "name": "nostr_multisig", + "fullname": "Nostr Multisig", "description": "This plugin facilitates the use of multi-signatures wallets. It sends and receives partially signed transactions from/to your cosigner wallet. PSBTs are sent and retrieved from Nostr relays.", "author": "The Electrum Developers", "available_for": ["qt"], + "icon":"nostr_multisig.png", "version": "0.0.1" } diff --git a/electrum/plugins/psbt_nostr/nostr_multisig.png b/electrum/plugins/psbt_nostr/nostr_multisig.png new file mode 100644 index 0000000000000000000000000000000000000000..32709f62ac6a125667dbd33c940f16ca4bfe0b31 GIT binary patch literal 11898 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

-E~ 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