URI: 
       tkivy: improve settings dialog - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 858b9c56554231ddb008468e37632cb74c118e78
   DIR parent 5502cab796e6e7ce04865abf0479798d83c51dee
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Thu, 21 Jan 2016 12:12:55 +0100
       
       kivy: improve settings dialog
       
       Diffstat:
         M gui/kivy/uix/dialogs/checkbox_dial… |      18 +++++++++---------
         M gui/kivy/uix/dialogs/choice_dialog… |       4 +++-
         M gui/kivy/uix/dialogs/settings.py    |     183 ++++++++++++++++---------------
         M gui/qt/main_window.py               |       2 +-
         M lib/plugins.py                      |      10 ++++------
       
       5 files changed, 110 insertions(+), 107 deletions(-)
       ---
   DIR diff --git a/gui/kivy/uix/dialogs/checkbox_dialog.py b/gui/kivy/uix/dialogs/checkbox_dialog.py
       t@@ -7,25 +7,25 @@ Builder.load_string('''
        <CheckBoxDialog@Popup>
            id: popup
            title: ''
       -    size_hint: 0.8, 0.5
       +    size_hint: 0.8, 0.8
            pos_hint: {'top':0.9}
            BoxLayout:
                orientation: 'vertical'
       -        Label:
       -            id: description
       -            text: ''
       +        ScrollView:
                    size_hint: 1, 1
       -            halign: 'left'
       -            text_size: self.width, None
       +            Label:
       +                id: description
       +                text: ''
       +                size_hint: 1, None
       +                halign: 'left'
       +                text_size: self.width, None
                BoxLayout:
                    orientation: 'horizontal'
       -            size_hint: 1, 1
       +            size_hint: 1, 0.5
                    Label:
                        text: _('Enable')
                    CheckBox:
                        id:cb
       -        Widget:
       -            size_hint: 1, 1
                BoxLayout:
                    orientation: 'horizontal'
                    size_hint: 1, 0.5
   DIR diff --git a/gui/kivy/uix/dialogs/choice_dialog.py b/gui/kivy/uix/dialogs/choice_dialog.py
       t@@ -46,9 +46,11 @@ class ChoiceDialog(Factory.Popup):
        
            def __init__(self, title, choices, key, callback):
                Factory.Popup.__init__(self)
       +        if type(choices) is list:
       +            choices = dict(map(lambda x: (x,x), choices))
                layout = self.ids.choices
                layout.bind(minimum_height=layout.setter('height'))
       -        for k, v in choices.items():
       +        for k, v in sorted(choices.items()):
                    l = Label(text=v)
                    l.height = '48dp'
                    cb = CheckBox(group='choices')
   DIR diff --git a/gui/kivy/uix/dialogs/settings.py b/gui/kivy/uix/dialogs/settings.py
       t@@ -13,7 +13,7 @@ Builder.load_string('''
            orientation: 'vertical'
            title: ''
            description: ''
       -    size_hint: 1, 1
       +    size_hint: 1, None
            Label:
                id: title
                text: self.parent.title
       t@@ -27,79 +27,72 @@ Builder.load_string('''
                size_hint: 1, 1
                halign: 'left'
                text_size: self.width, None
       +    CardSeparator
        
       -<PluginItem@ButtonBehavior+BoxLayout>
       -    orientation: 'vertical'
       -    title: ''
       -    description: ''
       -    size_hint: 1, 1
       -    BoxLayout:
       -        orientation: 'horizontal'
       -        Label:
       -            id: title
       -            text: self.parent.title
       -            size_hint: 1, 1
       -            bold: True
       -            text_size: self.size
       -            halign: 'left'
       -        Switch:
       -            id: sw
       -            name: ''
       -    Label:
       -        text: self.parent.description
       -        size_hint: 1, 1
       -        text_size: self.width, None
       -        color: 0.8, 0.8, 0.8, 1
       -        halign: 'left'
        
        <SettingsDialog@Popup>
            id: settings
            title: _('Electrum Settings')
            BoxLayout:
                orientation: 'vertical'
       -        SettingsItem:
       -            lang: settings.get_language_name()
       -            title: _('Language') + ': %s'%self.lang
       -            description: _("Language")
       -            on_release:
       -                settings.language_dialog(self)
       -        CardSeparator
       -        SettingsItem:
       -            status: 'ON' if app.wallet.use_encryption else 'OFF'
       -            title: _('PIN code') + ': ' + self.status
       -            description: _("Change your PIN code.")
       -            on_release:
       -                app.change_password()
       -                self.status = 'ON' if app.wallet.use_encryption else 'OFF'
       -        CardSeparator
       -        SettingsItem:
       -            bu: app.base_unit
       -            title: _('Denomination') + ': ' + self.bu
       -            description: _("Base unit for Bitcoin amounts.")
       -            on_release:
       -                settings.unit_dialog(self)
       -        CardSeparator
       -        SettingsItem:
       -            title: _('Fiat Currency') + ': ' + app.fiat_unit
       -            description: "Select the local fiat currency."
       -            on_release:
       -                settings.fiat_dialog(self)
       -        CardSeparator
       -        SettingsItem:
       -            status: 'ON' if bool(app.plugins.get('labels')) else 'OFF'
       -            title: _('Labels Sync') + ': ' + self.status
       -            description: "Synchronize labels."
       -            on_release:
       -                settings.labelsync_dialog(self)
       -        CardSeparator
       -        SettingsItem:
       -            title: _('OpenAlias')
       -            description: "DNS record that stores one of your Bitcoin addresses."
       -            on_release:
       -                settings.openalias_dialog()
       -        Widget:
       -            size_hint: 1, 1
       +        ScrollView:
       +            size_hint: 1, 0.8
       +            GridLayout:
       +                row_default_height: '68dp'
       +                cols:1
       +                id: scrollviewlayout
       +                size_hint: 1, None
       +                SettingsItem:
       +                    lang: settings.get_language_name()
       +                    title: _('Language') + ': %s'%self.lang
       +                    description: _("Language")
       +                    on_release:
       +                        settings.language_dialog(self)
       +                    height: '48dp'
       +                SettingsItem:
       +                    status: 'ON' if app.wallet.use_encryption else 'OFF'
       +                    title: _('PIN code') + ': ' + self.status
       +                    description: _("Change your PIN code.")
       +                    on_release:
       +                        app.change_password()
       +                        self.status = 'ON' if app.wallet.use_encryption else 'OFF'
       +                SettingsItem:
       +                    bu: app.base_unit
       +                    title: _('Denomination') + ': ' + self.bu
       +                    description: _("Base unit for Bitcoin amounts.")
       +                    on_release:
       +                        settings.unit_dialog(self)
       +                SettingsItem:
       +                    status: 'ON' if bool(app.plugins.get('exchange_rate')) else 'OFF'
       +                    title: _('Fiat Exchange rates') + ': ' + self.status
       +                    description: _("Display amounts in fiat currency.")
       +                    on_release:
       +                        settings.plugin_dialog('exchange_rate', self)
       +                SettingsItem:
       +                    status: app.fiat_unit
       +                    title: _('Fiat Currency') + ': ' + self.status
       +                    description: _("Select the local fiat currency.")
       +                    on_release:
       +                        settings.fiat_currency_dialog(self)
       +                SettingsItem:
       +                    status: root.fiat_source()
       +                    title: _('Fiat source') + ': ' + self.status
       +                    description: _("Source for fiat currency exchange rate.")
       +                    on_release:
       +                        settings.fiat_source_dialog(self)
       +                SettingsItem:
       +                    status: 'ON' if bool(app.plugins.get('labels')) else 'OFF'
       +                    title: _('Labels Sync') + ': ' + self.status
       +                    description: "Synchronize labels."
       +                    on_release:
       +                        settings.plugin_dialog('labels', self)
       +                SettingsItem:
       +                    title: _('OpenAlias')
       +                    description: "DNS record that stores one of your Bitcoin addresses."
       +                    on_release:
       +                        settings.openalias_dialog()
                BoxLayout:
       +            size_hint: 1, 0.1
                    Widget:
                        size_hint: 0.5, None
                    Button:
       t@@ -117,6 +110,8 @@ class SettingsDialog(Factory.Popup):
                self.plugins = self.app.plugins
                self.config = self.app.electrum_config
                Factory.Popup.__init__(self)
       +        layout = self.ids.scrollviewlayout
       +        layout.bind(minimum_height=layout.setter('height'))
        
            def get_language_name(self):
                return languages.get(self.config.get('language', 'en_UK'), '')
       t@@ -136,20 +131,35 @@ class SettingsDialog(Factory.Popup):
                def cb(text):
                    self.app._set_bu(text)
                    item.bu = self.app.base_unit
       -        d = ChoiceDialog(_('Denomination'), dict(map(lambda x: (x,x), base_units)), self.app.base_unit, cb)
       +        d = ChoiceDialog(_('Denomination'), base_units, self.app.base_unit, cb)
                d.open()
        
       -    def fiat_dialog(self, item):
       +    def fiat_currency_dialog(self, item):
                from choice_dialog import ChoiceDialog
       +        p = self.app.plugins.get('exchange_rate')
       +        if not p:
       +            return
                def cb(text):
       -            if text == 'None':
       -                self.plugins.disable('exchange_rate')
       -            else:
       -                self.config.set_key('currency', text, True)
       -                p = self.app.plugins.enable('exchange_rate')
       -                p.init_kivy(self.app)
       +            self.config.set_key('currency', text, True)
       +            item.status = text
       +        l = sorted(p.exchange.quotes.keys()) if p else []
       +        d = ChoiceDialog(_('Fiat Currency'), l, '', cb)
       +        d.open()
       +
       +    def fiat_source(self):
       +        p = self.app.plugins.get('exchange_rate')
       +        return p.exchange.name() if p else 'None'
        
       -        d = ChoiceDialog(_('Fiat Currency'), { 'None': 'None', 'USD':'USD', 'EUR':'EUR'}, '', cb)
       +    def fiat_source_dialog(self, item):
       +        from choice_dialog import ChoiceDialog
       +        p = self.plugins.get('exchange_rate')
       +        if not p:
       +            return
       +        def cb(text):
       +            p.set_exchange(text)
       +            item.status = text
       +        l = sorted(p.exchanges.keys())
       +        d = ChoiceDialog(_('Exchange rate source'), l, self.fiat_source(), cb)
                d.open()
        
            def openalias_dialog(self):
       t@@ -159,22 +169,15 @@ class SettingsDialog(Factory.Popup):
                d = LabelDialog(_('OpenAlias'), '', callback)
                d.open()
        
       -    def labelsync_dialog(self, label):
       +    def plugin_dialog(self, name, label):
                from checkbox_dialog import CheckBoxDialog
                def callback(status):
       -            self.plugins.enable('labels') if status else self.plugins.disable('labels')
       -            status = bool(self.plugins.get('labels'))
       +            print 'z', status
       +            self.plugins.enable(name) if status else self.plugins.disable(name)
                    label.status = 'ON' if status else 'OFF'
       -        status = bool(self.plugins.get('labels'))
       -        descr = _('Save your labels on a remote server, and synchronizes them between various instances of your wallet.')
       -        d = CheckBoxDialog(_('Labels Sync'), descr, status, callback)
       +        status = bool(self.plugins.get(name))
       +        dd = self.plugins.descriptions.get(name)
       +        descr = dd.get('description')
       +        fullname = dd.get('fullname')
       +        d = CheckBoxDialog(fullname, descr, status, callback)
                d.open()
       -
       -
       -class PluginItem():
       -    def __init__(self, name):
       -        p = self.plugins.get(name)
       -        sw.active = (p is not None) and p.is_enabled()
       -        sw.bind(active=on_active)
       -        plugins_list.add_widget(sw)
       -        
   DIR diff --git a/gui/qt/main_window.py b/gui/qt/main_window.py
       t@@ -2909,7 +2909,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
                    enable_settings_widget(p, name, i)
                    run_hook('init_qt', self.gui_object)
        
       -        for i, descr in enumerate(plugins.descriptions):
       +        for i, descr in enumerate(plugins.descriptions.values()):
                    name = descr['__name__']
                    p = plugins.get(name)
                    if descr.get('registers_wallet_type'):
   DIR diff --git a/lib/plugins.py b/lib/plugins.py
       t@@ -43,7 +43,7 @@ class Plugins(DaemonThread):
                self.hw_wallets = {}
                self.plugins = {}
                self.gui_name = gui_name
       -        self.descriptions = []
       +        self.descriptions = {}
                self.device_manager = DeviceMgr()
        
                for loader, name, ispkg in pkgutil.iter_modules([self.pkgpath]):
       t@@ -55,7 +55,7 @@ class Plugins(DaemonThread):
                        self.register_plugin_wallet(name, gui_good, details)
                    if not gui_good:
                        continue
       -            self.descriptions.append(d)
       +            self.descriptions[name] = d
                    if not d.get('requires_wallet_type') and config.get('use_' + name):
                        self.load_plugin(name)
        
       t@@ -103,10 +103,8 @@ class Plugins(DaemonThread):
                return self.disable(name) if p else self.enable(name)
        
            def is_available(self, name, w):
       -        for d in self.descriptions:
       -            if d.get('__name__') == name:
       -                break
       -        else:
       +        d = self.descriptions.get(name)
       +        if not d:
                    return False
                deps = d.get('requires', [])
                for dep, s in deps: