tkivy: use EventDispatcher with exchange rates plugin - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit a1eaf351a70d6b779eb278148cb6c62584d21b2a DIR parent 9b09c5535652079e262a1f87bf054929568bd12b HTML 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):