tqt wallet>info: use QStackedWidget, one stack item for each keystore - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit c313c702fda3d6859d3b1a94a7e2cbccf5289df7 DIR parent 5215582b83a7709ca6baadd1e1c5fd5fd1e449e9 HTML Author: SomberNight <somber.night@protonmail.com> Date: Fri, 28 Aug 2020 20:10:58 +0200 qt wallet>info: use QStackedWidget, one stack item for each keystore Instead of single mpk_text widget for each ks and changing the contents when switching, create an mpk_text widget for each ks and switch between those. This allows putting the "show xpub on device" button inside mpk_text. Diffstat: M electrum/gui/qt/main_window.py | 55 +++++++++++++++++-------------- M electrum/gui/qt/util.py | 2 +- M electrum/plugins/bitbox02/qt.py | 25 +++++++------------------ 3 files changed, 39 insertions(+), 43 deletions(-) --- DIR diff --git a/electrum/gui/qt/main_window.py b/electrum/gui/qt/main_window.py t@@ -46,7 +46,7 @@ from PyQt5.QtWidgets import (QMessageBox, QComboBox, QSystemTrayIcon, QTabWidget QHBoxLayout, QPushButton, QScrollArea, QTextEdit, QShortcut, QMainWindow, QCompleter, QInputDialog, QWidget, QSizePolicy, QStatusBar, QToolTip, QDialog, - QMenu, QAction) + QMenu, QAction, QStackedWidget) import electrum from electrum import (keystore, ecc, constants, util, bitcoin, commands, t@@ -2354,25 +2354,10 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger): if self.wallet.is_deterministic(): keystores = self.wallet.get_keystores() - mpk_text = ShowQRTextEdit() - mpk_text.setMaximumHeight(150) - mpk_text.addCopyButton(self.app) - - der_path_hbox = QHBoxLayout() - der_path_hbox.setContentsMargins(0, 0, 0, 0) - - der_path_hbox.addWidget(QLabel(_("Derivation path") + ':')) - der_path_text = QLabel() - der_path_text.setTextInteractionFlags(Qt.TextSelectableByMouse) - der_path_hbox.addWidget(der_path_text) - der_path_hbox.addStretch() + ks_stack = QStackedWidget() def select_ks(index): - ks = keystores[index] - mpk_text.setText(ks.get_master_public_key()) - mpk_text.repaint() # macOS hack for #4777 - der_path_text.setText(ks.get_derivation_prefix() or _("unknown")) - der_path_text.repaint() # macOS hack for #4777 + ks_stack.setCurrentIndex(index) # only show the combobox in case multiple accounts are available if len(keystores) > 1: t@@ -2387,18 +2372,40 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger): on_click = lambda clayout: select_ks(clayout.selected_index()) labels_clayout = ChoicesLayout(_("Select keystore"), labels, on_click) vbox.addLayout(labels_clayout.layout()) - labels_clayout.selected_index() + + for ks in keystores: + ks_w = QWidget() + ks_vbox = QVBoxLayout() + ks_vbox.setContentsMargins(0, 0, 0, 0) + ks_w.setLayout(ks_vbox) + + mpk_text = ShowQRTextEdit(ks.get_master_public_key()) + mpk_text.setMaximumHeight(150) + mpk_text.addCopyButton(self.app) + run_hook('show_xpub_button', mpk_text, ks) + + der_path_hbox = QHBoxLayout() + der_path_hbox.setContentsMargins(0, 0, 0, 0) + + der_path_hbox.addWidget(QLabel(_("Derivation path") + ':')) + der_path_text = QLabel(ks.get_derivation_prefix() or _("unknown")) + der_path_text.setTextInteractionFlags(Qt.TextSelectableByMouse) + der_path_hbox.addWidget(der_path_text) + der_path_hbox.addStretch() + + ks_vbox.addWidget(QLabel(_("Master Public Key"))) + ks_vbox.addWidget(mpk_text) + ks_vbox.addLayout(der_path_hbox) + + ks_stack.addWidget(ks_w) select_ks(0) - vbox.addWidget(QLabel(_("Master Public Key"))) - vbox.addWidget(mpk_text) - vbox.addLayout(der_path_hbox) + vbox.addWidget(ks_stack) vbox.addStretch(1) btn_export_info = run_hook('wallet_info_buttons', self, dialog) - btn_show_xpub = run_hook('show_xpub_button', self, dialog, labels_clayout) btn_close = CloseButton(dialog) - btns = Buttons(btn_export_info, btn_show_xpub, btn_close) + btns = Buttons(btn_export_info, btn_close) vbox.addLayout(btns) dialog.setLayout(vbox) dialog.exec_() DIR diff --git a/electrum/gui/qt/util.py b/electrum/gui/qt/util.py t@@ -735,7 +735,7 @@ class ButtonsWidget(QWidget): def __init__(self): super(QWidget, self).__init__() - self.buttons = [] + self.buttons = [] # type: List[QToolButton] def resizeButtons(self): frameWidth = self.style().pixelMetric(QStyle.PM_DefaultFrameWidth) DIR diff --git a/electrum/plugins/bitbox02/qt.py b/electrum/plugins/bitbox02/qt.py t@@ -13,6 +13,7 @@ from PyQt5.QtCore import Qt, QMetaObject, Q_RETURN_ARG, pyqtSlot from electrum.gui.qt.util import ( WindowModalDialog, OkButton, + ButtonsTextEdit, ) from electrum.i18n import _ t@@ -49,31 +50,19 @@ class Plugin(BitBox02Plugin, QtPluginBase): @only_hook_if_libraries_available @hook - def show_xpub_button(self, main_window, dialog, labels_clayout): + def show_xpub_button(self, mpk_text: ButtonsTextEdit, keystore): # user is about to see the "Wallet Information" dialog # - add a button to show the xpub on the BitBox02 device - wallet = main_window.wallet - if not any(type(ks) == self.keystore_class for ks in wallet.get_keystores()): - # doesn't involve a BitBox02 wallet, hide feature + if type(keystore) != self.keystore_class: return - btn = QPushButton(_("Show on BitBox02")) - def on_button_click(): - selected_keystore_index = 0 - if labels_clayout is not None: - selected_keystore_index = labels_clayout.selected_index() - keystores = wallet.get_keystores() - selected_keystore = keystores[selected_keystore_index] - if type(selected_keystore) != self.keystore_class: - main_window.show_error("Select a BitBox02 xpub") - return - selected_keystore.thread.add( - partial(self.show_xpub, keystore=selected_keystore) + keystore.thread.add( + partial(self.show_xpub, keystore=keystore) ) - btn.clicked.connect(lambda unused: on_button_click()) - return btn + device_name = "{} ({})".format(self.device, keystore.label) + mpk_text.addButton("eye1.png", on_button_click, _("Show on {}").format(device_name)) class BitBox02_Handler(QtHandlerBase):