URI: 
       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)