URI: 
       trestrict plugins to the gui - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 190f733de23c44a8f216ad1d796df7a58c01499b
   DIR parent 7e74fcc93536ca249a45b0ec7698edaef9a66e80
  HTML Author: thomasv <thomasv@gitorious>
       Date:   Sun,  3 Mar 2013 16:01:47 +0100
       
       restrict plugins to the gui
       
       Diffstat:
         M electrum                            |       7 -------
         M gui/gui_classic.py                  |      52 ++++++++++++++++++++++++-------
         M lib/wallet.py                       |      30 ------------------------------
         M plugins/pointofsale.py              |      47 +++++++++++++++----------------
         M plugins/qrscanner.py                |       8 +++-----
       
       5 files changed, 65 insertions(+), 79 deletions(-)
       ---
   DIR diff --git a/electrum b/electrum
       t@@ -41,12 +41,6 @@ if os.path.exists("lib"):
            imp.load_module('electrum', fp, pathname, description)
            fp, pathname, description = imp.find_module('gui')
            imp.load_module('electrum_gui', fp, pathname, description)
       -    fp, pathname, description = imp.find_module('plugins')
       -    imp.load_module('electrum_plugins', fp, pathname, description)
       -    plugin_names = [name for _, name, _ in pkgutil.iter_modules(['plugins'])]
       -    plugins = map(lambda name: imp.load_source('electrum_plugins.'+name, os.path.join(pathname,name+'.py')), plugin_names)
       -else:
       -    plugins = []
        
        
        from electrum import *
       t@@ -109,7 +103,6 @@ if __name__ == '__main__':
        
            config = SimpleConfig(config_options)
            wallet = Wallet(config)
       -    wallet.init_plugins(plugins)
        
        
            if len(args)==0:
   DIR diff --git a/gui/gui_classic.py b/gui/gui_classic.py
       t@@ -269,6 +269,8 @@ class ElectrumWindow(QMainWindow):
                self.lite = None
                self.wallet = wallet
                self.config = config
       +        self.init_plugins()
       +
                self.wallet.interface.register_callback('updated', self.update_callback)
                self.wallet.interface.register_callback('banner', lambda: self.emit(QtCore.SIGNAL('banner_signal')) )
                self.wallet.interface.register_callback('disconnected', self.update_callback)
       t@@ -321,25 +323,51 @@ class ElectrumWindow(QMainWindow):
                # set initial message
                self.console.showMessage(self.wallet.banner)
        
       -        #init plugins
       -        for p in self.wallet.plugins:
       +
       +    # plugins
       +    def init_plugins(self):
       +        if os.path.exists("plugins"):
       +            import imp, pkgutil
       +            fp, pathname, description = imp.find_module('plugins')
       +            imp.load_module('electrum_plugins', fp, pathname, description)
       +            plugin_names = [name for a, name, b in pkgutil.iter_modules(['plugins'])]
       +            self.plugins = map(lambda name: imp.load_source('electrum_plugins.'+name, os.path.join(pathname,name+'.py')), plugin_names)
       +        else:
       +            self.plugins = []
       +
       +        self.plugin_hooks = {}
       +        for p in self.plugins:
                    try:
       -                p.init_gui(self)
       +                p.init(self)
                    except:
                        print_msg("Error:cannot initialize plugin",p)
                        traceback.print_exc(file=sys.stdout)
        
       +    def set_hook(self, name, callback):
       +        h = self.plugin_hooks.get(name, [])
       +        h.append(callback)
       +        self.plugin_hooks[name] = h
       +
       +    def unset_hook(self, name, callback):
       +        h = self.plugin_hooks.get(name,[])
       +        if callback in h: h.remove(callback)
       +        self.plugin_hooks[name] = h
       +
       +    def run_hook(self, name, args):
       +        for cb in self.plugin_hooks.get(name,[]):
       +            apply(cb, args)
       +
        
            def close(self):
                QMainWindow.close(self)
       -        self.wallet.run_hook('close_main_window', (self,))
       +        self.run_hook('close_main_window', (self,))
        
            def connect_slots(self, sender):
                self.connect(sender, QtCore.SIGNAL('timersignal'), self.timer_actions)
                self.previous_payto_e=''
        
            def timer_actions(self):
       -        self.wallet.run_hook('timer_actions', (self,))
       +        self.run_hook('timer_actions', (self,))
                    
                if self.payto_e.hasFocus():
                    return
       t@@ -547,11 +575,11 @@ class ElectrumWindow(QMainWindow):
                        
                    self.current_item_changed(item)
        
       -        self.wallet.run_hook('item_changed',(self, item, column))
       +        self.run_hook('item_changed',(self, item, column))
        
        
            def current_item_changed(self, a):
       -        self.wallet.run_hook('current_item_changed',(self, a))
       +        self.run_hook('current_item_changed',(self, a))
        
        
        
       t@@ -697,7 +725,7 @@ class ElectrumWindow(QMainWindow):
                self.amount_e.textChanged.connect(lambda: entry_changed(False) )
                self.fee_e.textChanged.connect(lambda: entry_changed(True) )
        
       -        self.wallet.run_hook('create_send_tab',(self,grid))
       +        self.run_hook('create_send_tab',(self,grid))
                return w2
        
        
       t@@ -760,7 +788,7 @@ class ElectrumWindow(QMainWindow):
                    self.show_message(str(e))
                    return
        
       -        self.wallet.run_hook('send_tx', (wallet, self, tx))
       +        self.run_hook('send_tx', (wallet, self, tx))
        
                if label: 
                    self.wallet.labels[tx.hash()] = label
       t@@ -953,7 +981,7 @@ class ElectrumWindow(QMainWindow):
                    t = _("Unprioritize") if addr in self.wallet.prioritized_addresses else _("Prioritize")
                    menu.addAction(t, lambda: self.toggle_priority(addr))
                    
       -        self.wallet.run_hook('receive_menu', (self, menu,))
       +        self.run_hook('receive_menu', (self, menu,))
                menu.exec_(self.receive_list.viewport().mapToGlobal(position))
        
        
       t@@ -1010,7 +1038,7 @@ class ElectrumWindow(QMainWindow):
                label = self.wallet.labels.get(address,'')
                item.setData(1,0,label)
        
       -        self.wallet.run_hook('update_receive_item', (self, address, item))
       +        self.run_hook('update_receive_item', (self, address, item))
                        
                c, u = self.wallet.get_addr_balance(address)
                balance = format_satoshis( c + u, False, self.wallet.num_zeros )
       t@@ -2019,7 +2047,7 @@ class ElectrumWindow(QMainWindow):
                tabs.addTab(tab5, _('Plugins') )
                def mk_toggle(cb, p):
                    return lambda: cb.setChecked(p.toggle(self))
       -        for i, p in enumerate(self.wallet.plugins):
       +        for i, p in enumerate(self.plugins):
                    try:
                        name, description = p.get_info()
                        cb = QCheckBox(name)
   DIR diff --git a/lib/wallet.py b/lib/wallet.py
       t@@ -106,10 +106,6 @@ class Wallet:
                except:
                    print_msg("Warning: Cannot deserialize transactions. skipping")
                
       -        # plugins
       -        self.plugins = []
       -        self.plugin_hooks = {}
       -
                # not saved
                self.prevout_values = {}     # my own transaction outputs
                self.spent_outputs = []
       t@@ -134,32 +130,6 @@ class Wallet:
                    self.update_tx_outputs(tx_hash)
        
        
       -    # plugins 
       -    def set_hook(self, name, callback):
       -        h = self.plugin_hooks.get(name, [])
       -        h.append(callback)
       -        self.plugin_hooks[name] = h
       -
       -    def unset_hook(self, name, callback):
       -        h = self.plugin_hooks.get(name,[])
       -        if callback in h: h.remove(callback)
       -        self.plugin_hooks[name] = h
       -
       -    def run_hook(self, name, args):
       -        for cb in self.plugin_hooks.get(name,[]):
       -            apply(cb, args)
       -
       -    def init_plugins(self, plugins):
       -        self.plugins = plugins
       -        for p in plugins:
       -            try:
       -                p.init(self)
       -            except:
       -                import traceback
       -                print_msg("Error:cannot initialize plugin",p)
       -                traceback.print_exc(file=sys.stdout)
       -
       -
            def set_up_to_date(self,b):
                with self.lock: self.up_to_date = b
        
   DIR diff --git a/plugins/pointofsale.py b/plugins/pointofsale.py
       t@@ -96,11 +96,8 @@ class QR_Window(QWidget):
        def get_info():
            return 'Point of Sale', _('Show QR code window and amounts requested for each address. Add menu item to request amount.')
        
       -def init(wallet):
       -    wallet.requested_amounts = wallet.config.get('requested_amounts',{}) 
       -
       -
       -def init_gui(gui):
       +def init(gui):
       +    gui.requested_amounts = gui.config.get('requested_amounts',{}) 
            gui.qr_window = None
        
        
       t@@ -116,19 +113,19 @@ def toggle(gui):
            toggle_QR_window(gui, enabled)
        
            if enabled:
       -        gui.wallet.set_hook('item_changed', item_changed)
       -        gui.wallet.set_hook('current_item_changed', recv_changed)
       -        gui.wallet.set_hook('receive_menu', receive_menu)
       -        gui.wallet.set_hook('update_receive_item', update_receive_item)
       -        gui.wallet.set_hook('timer_actions', timer_actions)
       -        gui.wallet.set_hook('close_main_window', close_main_window)
       +        gui.set_hook('item_changed', item_changed)
       +        gui.set_hook('current_item_changed', recv_changed)
       +        gui.set_hook('receive_menu', receive_menu)
       +        gui.set_hook('update_receive_item', update_receive_item)
       +        gui.set_hook('timer_actions', timer_actions)
       +        gui.set_hook('close_main_window', close_main_window)
            else:
       -        gui.wallet.unset_hook('item_changed', item_changed)
       -        gui.wallet.unset_hook('current_item_changed', recv_changed)
       -        gui.wallet.unset_hook('receive_menu', receive_menu)
       -        gui.wallet.unset_hook('update_receive_item', update_receive_item)
       -        gui.wallet.unset_hook('timer_actions', timer_actions)
       -        gui.wallet.unset_hook('close_main_window', close_main_window)
       +        gui.unset_hook('item_changed', item_changed)
       +        gui.unset_hook('current_item_changed', recv_changed)
       +        gui.unset_hook('receive_menu', receive_menu)
       +        gui.unset_hook('update_receive_item', update_receive_item)
       +        gui.unset_hook('timer_actions', timer_actions)
       +        gui.unset_hook('close_main_window', close_main_window)
                
        
            return enabled
       t@@ -143,7 +140,7 @@ def toggle_QR_window(self, show):
                if item:
                    address = str(item.text(1))
                    label = self.wallet.labels.get(address)
       -            amount, currency = self.wallet.requested_amounts.get(address, (None, None))
       +            amount, currency = self.requested_amounts.get(address, (None, None))
                    self.qr_window.set_content( address, label, amount, currency )
        
            elif show and self.qr_window and not self.qr_window.isVisible():
       t@@ -182,8 +179,8 @@ def item_changed(self, item, column):
                    else:
                        currency = currency.upper()
                            
       -            self.wallet.requested_amounts[address] = (amount, currency)
       -            self.wallet.config.set_key('requested_amounts', self.wallet.requested_amounts, True)
       +            self.requested_amounts[address] = (amount, currency)
       +            self.wallet.config.set_key('requested_amounts', self.requested_amounts, True)
        
                    label = self.wallet.labels.get(address)
                    if label is None:
       t@@ -195,8 +192,8 @@ def item_changed(self, item, column):
        
                else:
                    item.setText(column,'')
       -            if address in self.wallet.requested_amounts:
       -                self.wallet.requested_amounts.pop(address)
       +            if address in self.requested_amounts:
       +                self.requested_amounts.pop(address)
                    
                self.update_receive_item(self.receive_list.currentItem())
        
       t@@ -206,7 +203,7 @@ def recv_changed(self, a):
                address = str(a.text(0))
                label = self.wallet.labels.get(address)
                try:
       -            amount, currency = self.wallet.requested_amounts.get(address, (None, None))
       +            amount, currency = self.requested_amounts.get(address, (None, None))
                except:
                    amount, currency = None, None
                self.qr_window.set_content( address, label, amount, currency )
       t@@ -226,9 +223,9 @@ def receive_menu(self, menu):
        
        def update_receive_item(self, address, item):
            try:
       -        amount, currency = self.wallet.requested_amounts.get(address, (None, None))
       +        amount, currency = self.requested_amounts.get(address, (None, None))
            except:
       -        print "cannot get requested amount", address, self.wallet.requested_amounts.get(address)
       +        print "cannot get requested amount", address, self.requested_amounts.get(address)
                amount, currency = None, None
                    
            amount_str = amount + (' ' + currency if currency else '') if amount is not None  else ''
   DIR diff --git a/plugins/qrscanner.py b/plugins/qrscanner.py
       t@@ -7,14 +7,12 @@ except ImportError:
            zbar = None
        
        
       -def init(wallet):
       -    pass
        
       -def init_gui(gui):
       +def init(gui):
            if is_enabled():
       -        gui.wallet.set_hook('create_send_tab', create_send_tab)
       +        gui.set_hook('create_send_tab', create_send_tab)
            else:
       -        gui.wallet.unset_hook('create_send_tab', create_send_tab)
       +        gui.unset_hook('create_send_tab', create_send_tab)
        
        def get_info():
            return 'QR scans', "QR Scans.\nInstall the zbar package to enable this plugin"