qt.py (3613B)
1 from functools import partial 2 import traceback 3 import sys 4 from typing import TYPE_CHECKING 5 6 from PyQt5.QtCore import QObject, pyqtSignal 7 from PyQt5.QtWidgets import (QHBoxLayout, QLabel, QVBoxLayout) 8 9 from electrum.plugin import hook 10 from electrum.i18n import _ 11 from electrum.gui.qt.util import ThreadedButton, Buttons, EnterButton, WindowModalDialog, OkButton 12 13 from .labels import LabelsPlugin 14 15 if TYPE_CHECKING: 16 from electrum.gui.qt import ElectrumGui 17 from electrum.gui.qt.main_window import ElectrumWindow 18 from electrum.wallet import Abstract_Wallet 19 20 class QLabelsSignalObject(QObject): 21 labels_changed_signal = pyqtSignal(object) 22 23 24 class Plugin(LabelsPlugin): 25 26 def __init__(self, *args): 27 LabelsPlugin.__init__(self, *args) 28 self.obj = QLabelsSignalObject() 29 self._init_qt_received = False 30 31 def requires_settings(self): 32 return True 33 34 def settings_widget(self, window: WindowModalDialog): 35 return EnterButton(_('Settings'), 36 partial(self.settings_dialog, window)) 37 38 def settings_dialog(self, window: WindowModalDialog): 39 wallet = window.parent().wallet 40 if not wallet.get_fingerprint(): 41 window.show_error(_("{} plugin does not support this type of wallet.") 42 .format("Label Sync")) 43 return 44 d = WindowModalDialog(window, _("Label Settings")) 45 hbox = QHBoxLayout() 46 hbox.addWidget(QLabel("Label sync options:")) 47 upload = ThreadedButton("Force upload", 48 partial(self.push, wallet), 49 partial(self.done_processing_success, d), 50 partial(self.done_processing_error, d)) 51 download = ThreadedButton("Force download", 52 partial(self.pull, wallet, True), 53 partial(self.done_processing_success, d), 54 partial(self.done_processing_error, d)) 55 vbox = QVBoxLayout() 56 vbox.addWidget(upload) 57 vbox.addWidget(download) 58 hbox.addLayout(vbox) 59 vbox = QVBoxLayout(d) 60 vbox.addLayout(hbox) 61 vbox.addSpacing(20) 62 vbox.addLayout(Buttons(OkButton(d))) 63 return bool(d.exec_()) 64 65 def on_pulled(self, wallet): 66 self.obj.labels_changed_signal.emit(wallet) 67 68 def done_processing_success(self, dialog, result): 69 dialog.show_message(_("Your labels have been synchronised.")) 70 71 def done_processing_error(self, dialog, exc_info): 72 self.logger.error("Error synchronising labels", exc_info=exc_info) 73 dialog.show_error(_("Error synchronising labels") + f':\n{repr(exc_info[1])}') 74 75 @hook 76 def init_qt(self, gui: 'ElectrumGui'): 77 if self._init_qt_received: # only need/want the first signal 78 return 79 self._init_qt_received = True 80 # If the user just enabled the plugin, the 'load_wallet' hook would not 81 # get called for already loaded wallets, hence we call it manually for those: 82 for window in gui.windows: 83 self.load_wallet(window.wallet, window) 84 85 @hook 86 def load_wallet(self, wallet: 'Abstract_Wallet', window: 'ElectrumWindow'): 87 self.obj.labels_changed_signal.connect(window.update_tabs) 88 self.start_wallet(wallet) 89 90 @hook 91 def on_close_window(self, window): 92 try: 93 self.obj.labels_changed_signal.disconnect(window.update_tabs) 94 except TypeError: 95 pass # 'method' object is not connected 96 self.stop_wallet(window.wallet)