URI: 
       tqt.py - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
       tqt.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)