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.
This commit is contained in:
SomberNight 2020-08-28 20:10:58 +02:00
parent 5215582b83
commit c313c702fd
No known key found for this signature in database
GPG key ID: B33B5F232C6271E9
3 changed files with 39 additions and 43 deletions

View file

@ -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,
@ -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:
@ -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_()

View file

@ -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)

View file

@ -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 _
@ -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):