timproved install wizard - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 3e14b7dd725f2cb28585c2d6e8a74875370ac980 DIR parent 1606bd310612a9626c0221f1fa322a10984097ea HTML Author: thomasv <thomasv@gitorious> Date: Tue, 3 Sep 2013 14:32:56 +0200 improved install wizard Diffstat: M gui/installwizard.py | 132 ++++++++++++++++++++++++++----- M gui/password_dialog.py | 2 +- M lib/wallet.py | 11 +++++++---- 3 files changed, 119 insertions(+), 26 deletions(-) --- DIR diff --git a/gui/installwizard.py b/gui/installwizard.py t@@ -23,14 +23,56 @@ class InstallWizard(QDialog): def restore_or_create(self): + + d = QDialog() + d.setModal(1) + + grid = QGridLayout() + grid.setSpacing(5) + msg = _("Wallet file not found.")+"\n"+_("Do you want to create a new wallet, or to restore an existing one?") - r = QMessageBox.question(None, _('Message'), msg, _('Create'), _('Restore'), _('Cancel'), 0, 2) - if r==2: return None - return 'restore' if r==1 else 'create' + label = QLabel(msg) + label.setWordWrap(True) + grid.addWidget(label, 0, 0) + + gb = QGroupBox() + + b1 = QRadioButton(gb) + b1.setText(_("Create new wallet")) + b1.setChecked(True) + + b2 = QRadioButton(gb) + b2.setText(_("Restore wallet from seed")) + + b3 = QRadioButton(gb) + b3.setText(_("Restore wallet from master public key")) + + grid.addWidget(b1,1,0) + grid.addWidget(b2,2,0) + grid.addWidget(b3,3,0) + + vbox = QVBoxLayout() + vbox.addLayout(grid) + vbox.addLayout(ok_cancel_buttons(d, _('Next'))) + d.setLayout(vbox) + + if not d.exec_(): + return + + if b1.isChecked(): + return 'create' + elif b2.isChecked(): + return 'restore' + else: + return 'watching' + def verify_seed(self, wallet): r = self.seed_dialog(False) + if not r: + return + if r != wallet.seed: QMessageBox.warning(None, _('Error'), 'incorrect seed', 'OK') return False t@@ -68,7 +110,7 @@ class InstallWizard(QDialog): grid.addWidget(HelpButton(_('Keep the default value unless you modified this parameter in your wallet.')), 2, 3) vbox.addLayout(grid) - vbox.addLayout(ok_cancel_buttons(d)) + vbox.addLayout(ok_cancel_buttons(d, _('Next'))) d.setLayout(vbox) if not d.exec_(): return t@@ -99,7 +141,52 @@ class InstallWizard(QDialog): def network_dialog(self): - return NetworkDialog(self.interface, self.config, None).do_exec() + + d = QDialog() + d.setModal(1) + + grid = QGridLayout() + grid.setSpacing(5) + + label = QLabel(_("Network") + ":") + grid.addWidget(label, 0, 0) + + gb = QGroupBox() + + b1 = QRadioButton(gb) + b1.setText(_("Auto connect")) + b1.setChecked(True) + + b2 = QRadioButton(gb) + b2.setText(_("Select server manually")) + + b3 = QRadioButton(gb) + b3.setText(_("Stay offline")) + + grid.addWidget(b1,1,0) + grid.addWidget(b2,2,0) + grid.addWidget(b3,3,0) + + vbox = QVBoxLayout() + vbox.addLayout(grid) + vbox.addLayout(ok_cancel_buttons(d, _('Next'))) + d.setLayout(vbox) + + if not d.exec_(): + return + + if b2.isChecked(): + return NetworkDialog(self.interface, self.config, None).do_exec() + + elif b1.isChecked(): + self.config.set_key('auto_cycle', True, True) + return + + else: + self.config.set_key("server", None, True) + self.config.set_key('auto_cycle', False, True) + return + def show_seed(self, wallet): t@@ -153,15 +240,12 @@ class InstallWizard(QDialog): action = self.restore_or_create() if not action: exit() - # select a server. - s = self.network_dialog() - if s is None: - self.config.set_key("server", None, True) - self.config.set_key('auto_cycle', False, True) + #if not self.config.get('server'): + self.network_dialog() wallet = Wallet(self.storage) - if action =='create': + if action == 'create': wallet.init_seed(None) self.show_seed(wallet) if self.verify_seed(wallet): t@@ -181,22 +265,28 @@ class InstallWizard(QDialog): if not seed: return wallet.gap_limit = gap + wallet.init_seed(str(seed)) + wallet.save_seed() - if len(seed) == 128: - wallet.seed = '' - wallet.init_sequence(str(seed)) - else: - wallet.init_seed(str(seed)) - wallet.save_seed() + elif action == 'watching': + # ask for seed and gap. + sg = self.seed_dialog() + if not sg: + return + seed, gap = sg + if not seed: + return + wallet.gap_limit = gap + wallet.seed = '' + wallet.init_sequence(str(seed)) + + else: raise # start wallet threads wallet.start_threads(self.interface, self.blockchain) - # if it is a creation, use 5 - # if restore, use 4 then 5 - - if action == 'restore' and s is not None: + if action == 'restore': try: keep_it = self.restore_wallet(wallet) wallet.fill_addressbook() DIR diff --git a/gui/password_dialog.py b/gui/password_dialog.py t@@ -69,7 +69,7 @@ class PasswordDialog(QDialog): wallet = self.wallet if not wallet.seed: - QMessageBox.information(parent, _('Error'), _('No seed'), _('OK')) + QMessageBox.information(self.parent, _('Error'), _('No seed'), _('OK')) return if not self.exec_(): return DIR diff --git a/lib/wallet.py b/lib/wallet.py t@@ -158,8 +158,8 @@ class Wallet: self.first_addresses = storage.get('first_addresses',{}) - #if self.seed_version != SEED_VERSION: - # raise ValueError("This wallet seed is deprecated. Please restore from seed.") + if self.seed_version < 4: + raise ValueError("This wallet seed is deprecated.") self.load_accounts() t@@ -254,6 +254,7 @@ class Wallet: k5, c5, K5, cK5 = bip32_private_derivation(master_k, master_c, "m/", "m/5'/") self.master_public_keys = { + "m/": (master_c, master_K, master_cK), "m/0'/": (c0, K0, cK0), "m/1'/": (c1, K1, cK1), "m/2'/": (c2, K2, cK2), t@@ -419,8 +420,10 @@ class Wallet: return s[0] == 1 def get_master_public_key(self): - raise - return self.storage.get("master_public_key") + if self.seed_version == 4: + return self.storage.get("master_public_key") + else: + return self.storage.get("master_public_keys")["m/"] def get_master_private_key(self, account, password): master_k = pw_decode( self.master_private_keys[account], password)