tkivy: select currency first, then source. show only sources with history data - electrum - Electrum Bitcoin wallet
 (HTM) git clone https://git.parazyd.org/electrum
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
       ---
 (DIR) commit a5fd6d2e6c99e566272b59ce450a4be224b67335
 (DIR) parent e3b37512ed2ceae47765da18854b48df12d7adfe
 (HTM) Author: ThomasV <thomasv@electrum.org>
       Date:   Fri, 29 Jan 2016 19:58:40 +0100
       
       kivy: select currency first, then source. show only sources with history data
       
       Diffstat:
         M gui/kivy/uix/dialogs/fx_dialog.py   |      55 +++++++++++++-------------------
         M plugins/exchange_rate/exchange_rat… |      34 +++++++++++++++++++++++++------
       
       2 files changed, 50 insertions(+), 39 deletions(-)
       ---
 (DIR) diff --git a/gui/kivy/uix/dialogs/fx_dialog.py b/gui/kivy/uix/dialogs/fx_dialog.py
       t@@ -29,12 +29,12 @@ Builder.load_string('''
                    orientation: 'horizontal'
                    size_hint: 1, 0.1
                    Label:
       -                text: _('Source')
       +                text: _('Currency')
                        height: '48dp'
                    Spinner:
                        height: '48dp'
       -                id: exchanges
       -                on_text: popup.on_exchange(self.text)
       +                id: ccy
       +                on_text: popup.on_currency(self.text)
        
                Widget:
                    size_hint: 1, 0.1
       t@@ -43,12 +43,13 @@ Builder.load_string('''
                    orientation: 'horizontal'
                    size_hint: 1, 0.1
                    Label:
       -                text: _('Currency')
       +                text: _('Source')
                        height: '48dp'
                    Spinner:
                        height: '48dp'
       -                id: ccy
       -                on_text: popup.on_currency(self.text)
       +                id: exchanges
       +                on_text: popup.on_exchange(self.text)
       +
                Widget:
                    size_hint: 1, 0.2
        
       t@@ -80,8 +81,6 @@ 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@@ -90,11 +89,6 @@ 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:
       t@@ -102,21 +96,17 @@ class FxDialog(Factory.Popup):
                    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(lambda dt: self.add_exchanges(values, text))
                Clock.schedule_once(lambda dt: self.add_currencies())
        
       -    def add_exchanges(self, values, text):
       +    def add_exchanges(self):
       +        p = self.plugins.get('exchange_rate')
       +        exchanges = sorted(p.exchanges_by_ccy.get(p.get_currency())) if p else []
       +        mx = p.exchange.name() if p else ''
                ex = self.ids.exchanges
       -        ex.values = values
       -        ex.text = text
       +        ex.values = exchanges
       +        ex.text = (mx if mx in exchanges else exchanges[0]) if p else ''
        
            def on_exchange(self, text):
                if not text:
       t@@ -127,16 +117,15 @@ class FxDialog(Factory.Popup):
        
            def add_currencies(self):
                p = self.plugins.get('exchange_rate')
       -        currencies = sorted(p.exchange.quotes.keys()) if p else []
       +        currencies = sorted(p.exchanges_by_ccy.keys()) if p else []
       +        my_ccy = p.get_currency() if p else ''
                self.ids.ccy.values = currencies
       -        my_ccy = p.get_currency() if p else None
       -        if currencies:
       -            self.ids.ccy.text = my_ccy if my_ccy in currencies else currencies[0]
       +        self.ids.ccy.text = my_ccy
        
            def on_currency(self, ccy):
       -        if not ccy:
       -            return
       -        p = self.plugins.get('exchange_rate')
       -        if p and ccy != p.get_currency():
       -            p.set_currency(ccy)
       -        self.app.fiat_unit = ccy
       +        if ccy:
       +            p = self.plugins.get('exchange_rate')
       +            if p and ccy != p.get_currency():
       +                p.set_currency(ccy)
       +            self.app.fiat_unit = ccy
       +        Clock.schedule_once(lambda dt: self.add_exchanges())
 (DIR) diff --git a/plugins/exchange_rate/exchange_rate.py b/plugins/exchange_rate/exchange_rate.py
       t@@ -260,6 +260,32 @@ class Winkdex(ExchangeBase):
                             for h in history])
        
        
       +
       +def dictinvert(d):
       +    inv = {}
       +    for k, vlist in d.iteritems():
       +        for v in vlist:
       +            keys = inv.setdefault(v, [])
       +            keys.append(k)
       +    return inv
       +
       +def get_exchanges():
       +    is_exchange = lambda obj: (inspect.isclass(obj)
       +                               and issubclass(obj, ExchangeBase)
       +                               and obj != ExchangeBase)
       +    return dict(inspect.getmembers(sys.modules[__name__], is_exchange))
       +
       +def get_exchanges_by_ccy():
       +    "return only the exchanges that have history rates (which is hardcoded)"
       +    d = {}
       +    exchanges = get_exchanges()
       +    for name, klass in exchanges.items():
       +        exchange = klass(None, None)
       +        d[name] = exchange.history_ccys()
       +    return dictinvert(d)
       +
       +
       +
        class FxPlugin(BasePlugin, ThreadJob):
        
            def __init__(self, parent, config, name):
       t@@ -268,11 +294,8 @@ class FxPlugin(BasePlugin, ThreadJob):
                self.history_used_spot = False
                self.ccy_combo = None
                self.hist_checkbox = None
       -        is_exchange = lambda obj: (inspect.isclass(obj)
       -                                   and issubclass(obj, ExchangeBase)
       -                                   and obj != ExchangeBase)
       -        self.exchanges = dict(inspect.getmembers(sys.modules[__name__],
       -                                                 is_exchange))
       +        self.exchanges = get_exchanges()
       +        self.exchanges_by_ccy = get_exchanges_by_ccy()
                self.set_exchange(self.config_exchange())
        
            def ccy_amount_str(self, amount, commas):
       t@@ -370,4 +393,3 @@ class FxPlugin(BasePlugin, ThreadJob):
            def historical_value_str(self, satoshis, d_t):
                rate = self.history_rate(d_t)
                return self.value_str(satoshis, rate)
       -