URI: 
       tnew icons to show hardware wallet pairing in status bar - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit b07d3466c01e6ca83490b1573cb936ca2a36b663
   DIR parent 62b47ca3b323dd6f8fe8f3e9291846ad00afb271
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Sat, 27 Aug 2016 11:30:53 +0200
       
       new icons to show hardware wallet pairing in status bar
       
       Diffstat:
         M icons.qrc                           |       2 ++
         M icons/keepkey.png                   |       0 
         A icons/keepkey_unpaired.png          |       0 
         A icons/trezor_unpaired.png           |       0 
         M lib/plugins.py                      |       3 +++
         M plugins/keepkey/qt.py               |       3 ++-
         M plugins/trezor/plugin.py            |       4 ----
         M plugins/trezor/qt.py                |       3 ++-
         M plugins/trezor/qt_generic.py        |      22 ++++++++++++++++++----
       
       9 files changed, 27 insertions(+), 10 deletions(-)
       ---
   DIR diff --git a/icons.qrc b/icons.qrc
       t@@ -15,6 +15,7 @@
            <file>icons/file.png</file>
            <file>icons/hot_seed.png</file>
            <file>icons/keepkey.png</file>
       +    <file>icons/keepkey_unpaired.png</file>
            <file>icons/key.png</file>
            <file>icons/lock.png</file>
            <file>icons/microphone.png</file>
       t@@ -28,6 +29,7 @@
            <file>icons/status_lagging.png</file>
            <file>icons/seal.png</file>
            <file>icons/speaker.png</file>
       +    <file>icons/trezor_unpaired.png</file>
            <file>icons/trezor.png</file>
            <file>icons/trustedcoin.png</file>
            <file>icons/unconfirmed.png</file>
   DIR diff --git a/icons/keepkey.png b/icons/keepkey.png
       Binary files differ.
   DIR diff --git a/icons/keepkey_unpaired.png b/icons/keepkey_unpaired.png
       Binary files differ.
   DIR diff --git a/icons/trezor_unpaired.png b/icons/trezor_unpaired.png
       Binary files differ.
   DIR diff --git a/lib/plugins.py b/lib/plugins.py
       t@@ -385,6 +385,7 @@ class DeviceMgr(ThreadJob, PrintError):
        
            def client_for_keystore(self, plugin, handler, keystore, force_pair):
                with self.lock:
       +            plugin.update_status(handler, False)
                    devices = self.scan_devices()
                    xpub = keystore.xpub
                    derivation = keystore.get_derivation()
       t@@ -392,6 +393,8 @@ class DeviceMgr(ThreadJob, PrintError):
                    if client is None and force_pair:
                        info = self.select_device(plugin, handler, keystore, devices)
                        client = self.force_pair_xpub(plugin, handler, info, xpub, derivation, devices)
       +            if client:
       +                plugin.update_status(handler, True)
                    return client
        
            def client_by_xpub(self, plugin, xpub, handler, devices):
   DIR diff --git a/plugins/keepkey/qt.py b/plugins/keepkey/qt.py
       t@@ -3,7 +3,8 @@ from keepkey import KeepKeyPlugin
        
        
        class Plugin(qt_plugin_class(KeepKeyPlugin)):
       -    icon_file = ":icons/keepkey.png"
       +    icon_paired = ":icons/keepkey.png"
       +    icon_unpaired = ":icons/keepkey_unpaired.png"
        
            @classmethod
            def pin_matrix_widget_class(self):
   DIR diff --git a/plugins/trezor/plugin.py b/plugins/trezor/plugin.py
       t@@ -353,7 +353,3 @@ class TrezorCompatiblePlugin(HW_PluginBase):
            def get_tx(self, tx_hash):
                tx = self.prev_tx[tx_hash]
                return self.electrum_tx_to_txtype(tx)
       -
       -    @staticmethod
       -    def is_valid_seed(seed):
       -        return True
   DIR diff --git a/plugins/trezor/qt.py b/plugins/trezor/qt.py
       t@@ -3,7 +3,8 @@ from trezor import TrezorPlugin
        
        
        class Plugin(qt_plugin_class(TrezorPlugin)):
       -    icon_file = ":icons/trezor.png"
       +    icon_unpaired = ":icons/trezor_unpaired.png"
       +    icon_paired = ":icons/trezor.png"
        
            @classmethod
            def pin_matrix_widget_class(self):
   DIR diff --git a/plugins/trezor/qt_generic.py b/plugins/trezor/qt_generic.py
       t@@ -193,15 +193,26 @@ def qt_plugin_class(base_plugin_class):
                for keystore in wallet.get_keystores():
                    if type(keystore) != self.keystore_class:
                        continue
       -            tooltip = self.device + ' ' + keystore.label
       -            button = StatusBarButton(QIcon(self.icon_file), tooltip,
       +            tooltip = self.device + ' ' + (keystore.label or '')
       +            button = StatusBarButton(QIcon(self.icon_unpaired), tooltip,
                                             partial(self.settings_dialog, window, keystore))
                    window.statusBar().addPermanentWidget(button)
       -            keystore.handler = self.create_handler(window)
       +            handler = self.create_handler(window)
       +            handler.button = button
       +            keystore.handler = handler
                    keystore.thread = TaskThread(window, window.on_error)
                    # Trigger a pairing
                    keystore.thread.add(partial(self.get_client, keystore))
        
       +        window.connect(window, SIGNAL('keystore_status'), self._update_status)
       +
       +    def update_status(self, handler, paired):
       +        handler.win.emit(SIGNAL('keystore_status'), handler, paired)
       +
       +    def _update_status(self, handler, paired):
       +        icon = self.icon_paired if paired else self.icon_unpaired
       +        handler.button.setIcon(QIcon(icon))
       +
            @hook
            def receive_menu(self, menu, addrs, wallet):
                if type(wallet) is not Standard_Wallet:
       t@@ -222,7 +233,10 @@ def qt_plugin_class(base_plugin_class):
                forgotten their PIN or it is in bootloader mode.'''
                device_id = self.device_manager().xpub_id(keystore.xpub)
                if not device_id:
       -            info = self.device_manager().select_device(keystore.handler, self, keystore)
       +            try:
       +                info = self.device_manager().select_device(self, keystore.handler, keystore)
       +            except UserCancelled:
       +                return
                    device_id = info.device.id_
                return device_id