tkivy: use EventDispatcher with exchange rates plugin - electrum - Electrum Bitcoin wallet
 (HTM) git clone https://git.parazyd.org/electrum
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
       ---
 (DIR) commit a1eaf351a70d6b779eb278148cb6c62584d21b2a
 (DIR) parent 9b09c5535652079e262a1f87bf054929568bd12b
 (HTM) Author: ThomasV <thomasv@electrum.org>
       Date:   Mon, 25 Jan 2016 19:30:16 +0100
       
       kivy: use EventDispatcher with exchange rates plugin
       
       Diffstat:
         M gui/kivy/main_window.py             |      10 ++++++++++
         M gui/kivy/uix/dialogs/fx_dialog.py   |      24 +++++++++++++++++-------
         M plugins/exchange_rate/exchange_rat… |       2 +-
         M plugins/exchange_rate/kivy.py       |      37 ++++++++++++++++++++++++++-----
       
       4 files changed, 60 insertions(+), 13 deletions(-)
       ---
 (DIR) diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py
       t@@ -64,6 +64,15 @@ class ElectrumWindow(App):
        
            electrum_config = ObjectProperty(None)
        
       +    def on_quotes(self, d):
       +        print "main_window: on_quotes"
       +        pass
       +
       +    def on_history(self, d):
       +        print "main_window: on_history"
       +        if self.history_screen:
       +            self.history_screen.update()
       +
            def _get_bu(self):
                return self.electrum_config.get('base_unit', 'mBTC')
        
       t@@ -299,6 +308,7 @@ class ElectrumWindow(App):
                self.on_size(win, win.size)
                self.init_ui()
                self.load_wallet_by_name(self.electrum_config.get_wallet_path())
       +        run_hook('init_kivy', self)
        
            def load_wallet_by_name(self, wallet_path):
                if not wallet_path:
 (DIR) diff --git a/gui/kivy/uix/dialogs/fx_dialog.py b/gui/kivy/uix/dialogs/fx_dialog.py
       t@@ -80,6 +80,8 @@ from functools import partial
        
        class FxDialog(Factory.Popup):
        
       +    __events__ = ('on_quotes', )
       +
            def __init__(self, app, plugins, config, callback):
                Factory.Popup.__init__(self)
                self.app = app
       t@@ -88,34 +90,42 @@ class FxDialog(Factory.Popup):
                self.plugins = plugins
                p = self.plugins.get('exchange_rate')
                self.ids.enabled.active = bool(p)
       +        if p:
       +            p.dispatcher.bind(on_quotes=self.on_quotes)
       +
       +    def on_quotes(self, b):
       +        self.add_currencies()
        
            def on_active(self, b):
                if b:
       -            p = self.plugins.enable('exchange_rate')
       -            p.init_kivy(self.app)
       +            p = self.plugins.get('exchange_rate')
       +            if p is None:
       +                p = self.plugins.enable('exchange_rate')
       +                p.init_kivy(self.app)
       +                p.dispatcher.bind(on_quotes=self.on_quotes)
       +
                    values = sorted(p.exchanges.keys())
                    text = p.exchange.name()
                else:
                    self.plugins.disable('exchange_rate')
                    values = []
                    text = ''
       -        Clock.schedule_once(partial(self.add_exchanges, values, text), 0.1)
       +        Clock.schedule_once(lambda dt: self.add_exchanges(values, text))
       +        Clock.schedule_once(lambda dt: self.add_currencies())
        
       -    def add_exchanges(self, values, text, dt):
       +    def add_exchanges(self, values, text):
                ex = self.ids.exchanges
                ex.values = values
                ex.text = text
        
       -
            def on_exchange(self, text):
                if not text:
                    return
                p = self.plugins.get('exchange_rate')
                if p and text != p.exchange.name():
                    p.set_exchange(text)
       -        Clock.schedule_once(self.add_currencies, 1)
        
       -    def add_currencies(self, dt):
       +    def add_currencies(self):
                p = self.plugins.get('exchange_rate')
                currencies = sorted(p.exchange.quotes.keys()) if p else []
                self.ids.ccy.values = currencies
 (DIR) diff --git a/plugins/exchange_rate/exchange_rate.py b/plugins/exchange_rate/exchange_rate.py
       t@@ -55,9 +55,9 @@ class ExchangeBase(PrintError):
                    self.print_error("getting fx quotes for", ccy)
                    self.quotes = self.get_rates(ccy)
                    self.print_error("received fx quotes")
       -            self.on_quotes()
                except BaseException as e:
                    self.print_error("failed fx quotes:", e)
       +        self.on_quotes()
        
            def update(self, ccy):
                t = Thread(target=self.update_safe, args=(ccy,))
 (DIR) diff --git a/plugins/exchange_rate/kivy.py b/plugins/exchange_rate/kivy.py
       t@@ -1,14 +1,38 @@
       -from exchange_rate import FxPlugin
       +from __future__ import absolute_import
       +
       +from .exchange_rate import FxPlugin
        from electrum.plugins import hook
        
       +
       +from kivy.event import EventDispatcher
       +
       +class MyEventDispatcher(EventDispatcher):
       +
       +    def __init__(self, **kwargs):
       +        self.register_event_type('on_quotes')
       +        self.register_event_type('on_history')
       +        super(MyEventDispatcher, self).__init__(**kwargs)
       +
       +    def on_quotes(self, *args):
       +        pass
       +
       +    def on_history(self, *args):
       +        pass
       +
       +
        class Plugin(FxPlugin):
        
       +    def __init__(self, parent, config, name):
       +        FxPlugin.__init__(self, parent, config, name)
       +        self.dispatcher = MyEventDispatcher()
       +
            def on_quotes(self):
       -        self.print_error("on quotes", self.ccy)
       +        self.print_error("on_quotes")
       +        self.dispatcher.dispatch('on_quotes')
        
            def on_history(self):
       -        self.print_error("on history")
       -        self.window.history_screen.update()
       +        self.print_error("on_history")
       +        self.dispatcher.dispatch('on_history')
        
            def on_close(self):
                self.print_error("on close")
       t@@ -17,9 +41,12 @@ class Plugin(FxPlugin):
        
            @hook
            def init_kivy(self, window):
       +        self.print_error("init_kivy")
                self.window = window
       +        self.dispatcher.bind(on_quotes=window.on_quotes)
       +        self.dispatcher.bind(on_history=window.on_history)
                self.window.fiat_unit = self.ccy
       -        self.window.history_screen.update()
       +        self.dispatcher.dispatch('on_history')
        
            @hook
            def load_wallet(self, wallet, window):