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)