URI: 
       tInstall wizard: simplify create_or_restore - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 384b8cd5f24731c5998091d65efef886daa76a43
   DIR parent 85b48191da27e37276259a03604c88b869c0769a
  HTML Author: Neil Booth <kyuupichan@gmail.com>
       Date:   Sun, 10 Jan 2016 22:57:31 +0900
       
       Install wizard: simplify create_or_restore
       
       - Use ChoiceLayout to organize the layouts
       - Do wallet filtering in wizard.py as it's GUI independent.
       - Only pass the descriptions.
       
       Diffstat:
         M gui/qt/installwizard.py             |      66 ++++++++-----------------------
         M lib/wizard.py                       |      22 +++++++++++++---------
       
       2 files changed, 29 insertions(+), 59 deletions(-)
       ---
   DIR diff --git a/gui/qt/installwizard.py b/gui/qt/installwizard.py
       t@@ -171,57 +171,24 @@ class InstallWizard(WindowModalDialog, WizardBase):
                self.show()
        
            def query_create_or_restore(self, wallet_kinds):
       -        """Ask the user what they want to do, and to what wallet kind.
       -        wallet_kinds is an array of tuples (kind, description).
       -        Return a tuple (action, kind).  Action is 'create' or 'restore',
       -        and kind is one of the wallet kinds passed."""
       -        vbox = QVBoxLayout()
       -
       -        main_label = QLabel(_("Electrum could not find an existing wallet."))
       -        vbox.addWidget(main_label)
       -
       -        grid = QGridLayout()
       -        grid.setSpacing(5)
       -
       -        gb1 = QGroupBox(_("What do you want to do?"))
       -        vbox.addWidget(gb1)
       -        vbox1 = QVBoxLayout()
       -        gb1.setLayout(vbox1)
       -
       -        b1 = QRadioButton(gb1)
       -        b1.setText(_("Create new wallet"))
       -        b1.setChecked(True)
       +        """Ask the user what they want to do, and which wallet kind.
       +        wallet_kinds is an array of translated wallet descriptions.
       +        Return a a tuple (action, kind_index).  Action is 'create' or
       +        'restore', and kind the index of the wallet kind chosen."""
        
       -        b2 = QRadioButton(gb1)
       -        b2.setText(_("Restore a wallet or import keys"))
       +        actions = [_("Create a new wallet"),
       +                   _("Restore a wallet or import keys")]
        
       -        group1 = QButtonGroup()
       -        group1.addButton(b1)
       -        group1.addButton(b2)
       -        vbox1.addWidget(b1)
       -        vbox1.addWidget(b2)
       -
       -        gb2 = QGroupBox(_("Wallet type:"))
       -        vbox.addWidget(gb2)
       -
       -        vbox2 = QVBoxLayout()
       -        gb2.setLayout(vbox2)
       -
       -        group2 = QButtonGroup()
       -
       -        for i, (wtype,name) in enumerate(wallet_kinds):
       -            if not filter(lambda x:x[0]==wtype, electrum.wallet.wallet_types):
       -                continue
       -            button = QRadioButton(gb2)
       -            button.setText(name)
       -            vbox2.addWidget(button)
       -            group2.addButton(button)
       -            group2.setId(button, i)
       -
       -            if i==0:
       -                button.setChecked(True)
       +        main_label = QLabel(_("Electrum could not find an existing wallet."))
       +        actions_clayout = ChoicesLayout(_("What do you want to do?"), actions)
       +        wallet_clayout = ChoicesLayout(_("Wallet kind:"), wallet_kinds)
        
       +        vbox = QVBoxLayout()
       +        vbox.addWidget(main_label)
       +        vbox.addLayout(actions_clayout.layout())
       +        vbox.addLayout(wallet_clayout.layout())
                vbox.addStretch(1)
       +
                OK = OkButton(self, _('Next'))
                vbox.addLayout(Buttons(CancelButton(self), OK))
                self.set_layout(vbox)
       t@@ -231,9 +198,8 @@ class InstallWizard(WindowModalDialog, WizardBase):
                if not self.exec_():
                    raise UserCancelled
        
       -        action = 'create' if b1.isChecked() else 'restore'
       -        wallet_type = wallet_kinds[group2.checkedId()][0]
       -        return action, wallet_type
       +        action = ['create', 'restore'][actions_clayout.selected_index()]
       +        return action, wallet_clayout.selected_index()
        
            def verify_seed(self, seed, is_valid=None):
                while True:
   DIR diff --git a/lib/wizard.py b/lib/wizard.py
       t@@ -19,7 +19,7 @@
        from electrum import WalletStorage
        from electrum.plugins import run_hook
        from util import PrintError
       -from wallet import Wallet
       +from wallet import Wallet, wallet_types
        from i18n import _
        
        MSG_GENERATING_WAIT = _("Electrum is generating your addresses, please wait...")
       t@@ -64,10 +64,10 @@ class WizardBase(PrintError):
                raise NotImplementedError
        
            def query_create_or_restore(self, wallet_kinds):
       -        """Ask the user what they want to do, and to what wallet kind.
       -        wallet_kinds is an array of tuples (kind, description).
       -        Return a tuple (action, kind).  Action is 'create' or 'restore',
       -        and kind is one of the wallet kinds passed."""
       +        """Ask the user what they want to do, and which wallet kind.
       +        wallet_kinds is an array of translated wallet descriptions.
       +        Return a a tuple (action, kind_index).  Action is 'create' or
       +        'restore', and kind the index of the wallet kind chosen."""
                raise NotImplementedError
        
            def query_multisig(self, action):
       t@@ -186,21 +186,25 @@ class WizardBase(PrintError):
                a wallet and return it.'''
                self.remove_from_recently_open(storage.path)
        
       -        action, kind = self.query_create_or_restore(WizardBase.wallet_kinds)
       +        # Filter out any unregistered wallet kinds
       +        registered_kinds = zip(*wallet_types)[0]
       +        kinds, descriptions = zip(*[pair for pair in WizardBase.wallet_kinds
       +                                    if pair[0] in registered_kinds])
       +        action, kind_index = self.query_create_or_restore(descriptions)
        
                assert action in WizardBase.user_actions
       -        assert kind in [k for k, desc in WizardBase.wallet_kinds]
        
       +        kind = kinds[kind_index]
                if kind == 'multisig':
                    wallet_type = self.query_multisig(action)
                elif kind == 'hardware':
       -            wallet_types, choices = self.plugins.hardware_wallets(action)
       +            hw_wallet_types, choices = self.plugins.hardware_wallets(action)
                    if action == 'create':
                        msg = _('Select the hardware wallet to create')
                    else:
                        msg = _('Select the hardware wallet to restore')
                    choice = self.query_choice(msg, choices)
       -            wallet_type = wallet_types[choice]
       +            wallet_type = hw_wallet_types[choice]
                elif kind == 'twofactor':
                    wallet_type = '2fa'
                else: