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: