electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

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)