tbip39_recovery_dialog.py - electrum - Electrum Bitcoin wallet
HTML git clone https://git.parazyd.org/electrum
DIR Log
DIR Files
DIR Refs
DIR Submodules
---
tbip39_recovery_dialog.py (2977B)
---
1 # Copyright (C) 2020 The Electrum developers
2 # Distributed under the MIT software license, see the accompanying
3 # file LICENCE or http://www.opensource.org/licenses/mit-license.php
4
5 from PyQt5.QtCore import Qt
6 from PyQt5.QtWidgets import QWidget, QVBoxLayout, QGridLayout, QLabel, QListWidget, QListWidgetItem
7
8 from electrum.i18n import _
9 from electrum.network import Network
10 from electrum.bip39_recovery import account_discovery
11 from electrum.logging import get_logger
12
13 from .util import WindowModalDialog, MessageBoxMixin, TaskThread, Buttons, CancelButton, OkButton
14
15
16 _logger = get_logger(__name__)
17
18
19 class Bip39RecoveryDialog(WindowModalDialog):
20 def __init__(self, parent: QWidget, get_account_xpub, on_account_select):
21 self.get_account_xpub = get_account_xpub
22 self.on_account_select = on_account_select
23 WindowModalDialog.__init__(self, parent, _('BIP39 Recovery'))
24 self.setMinimumWidth(400)
25 vbox = QVBoxLayout(self)
26 self.content = QVBoxLayout()
27 self.content.addWidget(QLabel(_('Scanning common paths for existing accounts...')))
28 vbox.addLayout(self.content)
29 self.ok_button = OkButton(self)
30 self.ok_button.clicked.connect(self.on_ok_button_click)
31 self.ok_button.setEnabled(False)
32 vbox.addLayout(Buttons(CancelButton(self), self.ok_button))
33 self.finished.connect(self.on_finished)
34 self.show()
35 self.thread = TaskThread(self)
36 self.thread.finished.connect(self.deleteLater) # see #3956
37 self.thread.add(self.recovery, self.on_recovery_success, None, self.on_recovery_error)
38
39 def on_finished(self):
40 self.thread.stop()
41
42 def on_ok_button_click(self):
43 item = self.list.currentItem()
44 account = item.data(Qt.UserRole)
45 self.on_account_select(account)
46
47 def recovery(self):
48 network = Network.get_instance()
49 coroutine = account_discovery(network, self.get_account_xpub)
50 return network.run_from_another_thread(coroutine)
51
52 def on_recovery_success(self, accounts):
53 self.clear_content()
54 if len(accounts) == 0:
55 self.content.addWidget(QLabel(_('No existing accounts found.')))
56 return
57 self.content.addWidget(QLabel(_('Choose an account to restore.')))
58 self.list = QListWidget()
59 for account in accounts:
60 item = QListWidgetItem(account['description'])
61 item.setData(Qt.UserRole, account)
62 self.list.addItem(item)
63 self.list.clicked.connect(lambda: self.ok_button.setEnabled(True))
64 self.content.addWidget(self.list)
65
66 def on_recovery_error(self, exc_info):
67 self.clear_content()
68 self.content.addWidget(QLabel(_('Error: Account discovery failed.')))
69 _logger.error(f"recovery error", exc_info=exc_info)
70
71 def clear_content(self):
72 for i in reversed(range(self.content.count())):
73 self.content.itemAt(i).widget().setParent(None)