URI: 
       tadd more features to settings dialog - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit b3ef2249b55d945868706d75baa426d3a1661da2
   DIR parent 30ace570d37097cf532910e9fa9b3f42cc488c5a
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Wed, 16 Dec 2015 11:53:37 +0100
       
       add more features to settings dialog
       
       Diffstat:
         M gui/kivy/main.kv                    |       7 +++++--
         M gui/kivy/main_window.py             |      16 ++++------------
         M gui/kivy/uix/dialogs/choice_dialog… |      31 +++++++++++++++++--------------
         A gui/kivy/uix/dialogs/settings.py    |     100 +++++++++++++++++++++++++++++++
         D gui/kivy/uix/ui_screens/settings.kv |      34 -------------------------------
         M lib/util.py                         |       2 ++
       
       6 files changed, 128 insertions(+), 62 deletions(-)
       ---
   DIR diff --git a/gui/kivy/main.kv b/gui/kivy/main.kv
       t@@ -355,7 +355,6 @@
        <ActionOvrButton@ActionButton>
            on_release:
                if self.parent: self.parent.parent.dismiss()
       -        app.popup_dialog(self.name)
        
        
        <SettingsItem@ButtonBehavior+BoxLayout>
       t@@ -417,21 +416,25 @@ BoxLayout:
                    ActionOverflow:
                        id: ao
                        ActionOvrButton:
       -                    text: _('Network')
                            name: 'network'
       +                    text: _('Network')
                            on_parent:
                                # when widget overflow drop down is shown, adjust the width
                                parent = args[1]
                                if parent: ao._dropdown.width = sp(200)
       +                    on_release: app.popup_dialog(self.name)
                        ActionOvrButton:
                            name: 'settings'
                            text: _('Settings')
       +                    on_release: app.settings_dialog()
                        ActionOvrButton:
                            name: 'wallets'
                            text: _('Wallets')
       +                    on_release: app.popup_dialog(self.name)
                        ActionOvrButton:
                            name: 'plugins'
                            text: _('Plugins')
       +                    on_release: app.popup_dialog(self.name)
        
            ScreenManager:
                id: manager
   DIR diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py
       t@@ -57,8 +57,8 @@ from kivy.core.clipboard import Clipboard
        Factory.register('TabbedCarousel', module='electrum_gui.kivy.uix.screens')
        
        
       +from electrum.util import base_units
        
       -base_units = {'BTC':8, 'mBTC':5, 'uBTC':2}
        
        class ElectrumWindow(App):
        
       t@@ -75,11 +75,6 @@ class ElectrumWindow(App):
                    self.history_screen.update()
        
            base_unit = AliasProperty(_get_bu, _set_bu)
       -
       -    def _rotate_bu(self):
       -        keys = sorted(base_units.keys())
       -        self.base_unit = keys[ (keys.index(self.base_unit) + 1) % len(keys)]
       -
            status = StringProperty('')
            fiat_unit = StringProperty('')
        
       t@@ -341,12 +336,9 @@ class ElectrumWindow(App):
                d = LabelDialog(_('Enter wallet name'), '', self.load_wallet_by_name)
                d.open()
        
       -    def unit_dialog(self, item):
       -        from uix.dialogs.choice_dialog import ChoiceDialog
       -        def cb(text):
       -            self._set_bu(text)
       -            item.bu = self.base_unit
       -        d = ChoiceDialog(_('Denomination'), sorted(base_units.keys()), self.base_unit, cb)
       +    def settings_dialog(self):
       +        from uix.dialogs.settings import SettingsDialog
       +        d = SettingsDialog(self)
                d.open()
        
            def on_stop(self):
   DIR diff --git a/gui/kivy/uix/dialogs/choice_dialog.py b/gui/kivy/uix/dialogs/choice_dialog.py
       t@@ -4,6 +4,7 @@ from kivy.properties import ObjectProperty
        from kivy.lang import Builder
        from kivy.uix.checkbox import CheckBox
        from kivy.uix.label import Label
       +from kivy.uix.widget import Widget
        
        Builder.load_string('''
        <ChoiceDialog@Popup>
       t@@ -14,17 +15,19 @@ Builder.load_string('''
            BoxLayout:
                orientation: 'vertical'
                Widget:
       -            size_hint: 1, 0.2
       -        GridLayout:
       +            size_hint: 1, 0.1
       +        ScrollView:
                    orientation: 'vertical'
       -            id: choices
       -            cols: 2
       -            size_hint: 1, 0.8
       -        Widget:
                    size_hint: 1, 0.8
       +            GridLayout:
       +                row_default_height: '48dp'
       +                orientation: 'vertical'
       +                id: choices
       +                cols: 2
       +                size_hint: 1, 1
                BoxLayout:
                    orientation: 'horizontal'
       -            size_hint: 1, 0.5
       +            size_hint: 1, 0.2
                    Button:
                        text: 'Cancel'
                        size_hint: 0.5, None
       t@@ -41,22 +44,22 @@ Builder.load_string('''
        
        class ChoiceDialog(Factory.Popup):
        
       -    def __init__(self, title, choices, value, callback):
       +    def __init__(self, title, choices, key, callback):
                Factory.Popup.__init__(self)
       -        for k in choices:
       -            l = Label(text=k)
       +        for k, v in choices.items():
       +            l = Label(text=v)
                    l.height = '48dp'
       -            l.size_hint_y = 1
                    cb = CheckBox(group='choices')
                    cb.value = k
       -            cb.size_hint_y = 1
       +            cb.height = '48dp'
                    def f(cb, x):
                        if x: self.value = cb.value
                    cb.bind(active=f)
       -            if k == value:
       +            if k == key:
                        cb.active = True
                    self.ids.choices.add_widget(l)
                    self.ids.choices.add_widget(cb)
       +        self.ids.choices.add_widget(Widget(size_hint_y=1))
                self.callback = callback
                self.title = title
       -        self.value = value
       +        self.value = key
   DIR diff --git a/gui/kivy/uix/dialogs/settings.py b/gui/kivy/uix/dialogs/settings.py
       t@@ -0,0 +1,100 @@
       +from kivy.app import App
       +from kivy.factory import Factory
       +from kivy.properties import ObjectProperty
       +from kivy.lang import Builder
       +
       +from electrum.i18n import _
       +from electrum.util import base_units
       +from electrum.i18n import languages, set_language
       +
       +Builder.load_string('''
       +<SettingsDialog@Popup>
       +    id: settings
       +    title: _('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:
       +            title: _('PIN Code') + ' (%s)'%('ON' if app.wallet.use_encryption else 'OFF')
       +            description: _("Your PIN code will be required in order to spend bitcoins.")
       +            on_release:
       +                app.change_password()
       +                self.title = _('PIN Code') + ' (%s)'%('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')
       +            description: "Select the local fiat currency."
       +            on_release:
       +                settings.fiat_dialog(self)
       +        CardSeparator
       +        SettingsItem:
       +            title: _('OpenAlias')
       +            description: "Email-like address."
       +            on_release:
       +                settings.openalias_dialog()
       +        Widget:
       +            size_hint: 1, 1
       +        BoxLayout:
       +            Widget:
       +                size_hint: 0.5, None
       +            Button:
       +                size_hint: 0.5, None
       +                height: '48dp'
       +                text: _('OK')
       +                on_release:
       +                    settings.dismiss()
       +''')
       +
       +class SettingsDialog(Factory.Popup):
       +
       +    def __init__(self, app):
       +        self.app = app
       +        Factory.Popup.__init__(self)
       +
       +    def get_language_name(self):
       +        return languages.get(self.app.electrum_config.get('language', 'en_UK'), '')
       +
       +    def language_dialog(self, item):
       +        from choice_dialog import ChoiceDialog
       +        l = self.app.electrum_config.get('language', 'en_UK')
       +        def cb(key):
       +            set_language(key)
       +            self.app.electrum_config.set_key("language", key, True)
       +            item.lang = self.get_language_name()
       +        d = ChoiceDialog(_('Language'), languages, l, cb)
       +        d.open()
       +
       +    def unit_dialog(self, item):
       +        from choice_dialog import ChoiceDialog
       +        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.open()
       +
       +    def fiat_dialog(self, item):
       +        from choice_dialog import ChoiceDialog
       +        def cb(text):
       +            pass
       +        d = ChoiceDialog(_('Fiat Currency'), {}, '', cb)
       +        d.open()
       +
       +    def openalias_dialog(self):
       +        from label_dialog import LabelDialog
       +        def callback(text):
       +            pass
       +        d = LabelDialog(_('OpenAlias'), '', callback)
       +        d.open()
   DIR diff --git a/gui/kivy/uix/ui_screens/settings.kv b/gui/kivy/uix/ui_screens/settings.kv
       t@@ -1,34 +0,0 @@
       -Popup:
       -    id: settings
       -    title: _('Settings')
       -    BoxLayout:
       -        orientation: 'vertical'
       -        SettingsItem:
       -            title: _('PIN Code') + ' (%s)'%('ON' if app.wallet.use_encryption else 'OFF')
       -            description: _("Your PIN code will be required in order to spend bitcoins.")
       -            on_release:
       -                app.change_password()
       -                self.title = _('PIN Code') + ' (%s)'%('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:
       -                app.unit_dialog(self)
       -        CardSeparator
       -        SettingsItem:
       -            title: _('OpenAlias')
       -            description: "Email-like address."
       -        Widget:
       -            size_hint: 1, 1
       -        BoxLayout:
       -            Widget:
       -                size_hint: 0.5, None
       -            Button:
       -                size_hint: 0.5, None
       -                height: '48dp'
       -                text: _('OK')
       -                on_release:
       -                    settings.dismiss()
       -
   DIR diff --git a/lib/util.py b/lib/util.py
       t@@ -10,6 +10,8 @@ import urllib
        import threading
        from i18n import _
        
       +base_units = {'BTC':8, 'mBTC':5, 'uBTC':2}
       +
        def normalize_version(v):
            return [int(x) for x in re.sub(r'(\.0+)*$','', v).split(".")]