Files
pallectrum/electrum/gui/kivy/uix/dialogs/settings.py

226 lines
9.5 KiB
Python
Raw Normal View History

2015-12-16 11:53:37 +01:00
from kivy.app import App
from kivy.factory import Factory
from kivy.properties import ObjectProperty
from kivy.lang import Builder
2018-05-05 12:42:17 +02:00
from electrum.util import base_units_list
from electrum.i18n import languages
from electrum.gui.kivy.i18n import _
from electrum.plugin import run_hook
from electrum import coinchooser
2015-12-16 11:53:37 +01:00
from .choice_dialog import ChoiceDialog
2015-12-16 11:53:37 +01:00
Builder.load_string('''
#:import partial functools.partial
#:import _ electrum.gui.kivy.i18n._
2015-12-16 11:53:37 +01:00
<SettingsDialog@Popup>
id: settings
2016-01-19 12:57:18 +01:00
title: _('Electrum Settings')
2016-03-10 16:43:15 +01:00
disable_pin: False
use_encryption: False
2015-12-16 11:53:37 +01:00
BoxLayout:
orientation: 'vertical'
2016-01-21 12:12:55 +01:00
ScrollView:
GridLayout:
id: scrollviewlayout
cols:1
2016-01-21 12:12:55 +01:00
size_hint: 1, None
height: self.minimum_height
padding: '10dp'
2016-01-21 12:12:55 +01:00
SettingsItem:
lang: settings.get_language_name()
title: 'Language' + ': ' + str(self.lang)
description: _('Language')
action: partial(root.language_dialog, self)
CardSeparator
2016-01-21 12:12:55 +01:00
SettingsItem:
2016-03-10 16:43:15 +01:00
disabled: root.disable_pin
2018-03-22 16:39:01 +01:00
title: _('PIN code')
2016-01-21 12:12:55 +01:00
description: _("Change your PIN code.")
action: partial(root.change_password, self)
CardSeparator
2016-01-21 12:12:55 +01:00
SettingsItem:
bu: app.base_unit
title: _('Denomination') + ': ' + self.bu
description: _("Base unit for Bitcoin amounts.")
action: partial(root.unit_dialog, self)
CardSeparator
2016-01-21 12:12:55 +01:00
SettingsItem:
status: root.fx_status()
2016-01-21 12:12:55 +01:00
title: _('Fiat Currency') + ': ' + self.status
description: _("Display amounts in fiat currency.")
action: partial(root.fx_dialog, self)
CardSeparator
2016-01-21 12:12:55 +01:00
SettingsItem:
status: 'ON' if bool(app.plugins.get('labels')) else 'OFF'
title: _('Labels Sync') + ': ' + self.status
2016-02-22 10:53:08 +01:00
description: _("Save and synchronize your labels.")
action: partial(root.plugin_dialog, 'labels', self)
CardSeparator
2016-06-10 05:49:22 +02:00
SettingsItem:
status: 'ON' if app.use_rbf else 'OFF'
2016-06-10 05:49:22 +02:00
title: _('Replace-by-fee') + ': ' + self.status
description: _("Create replaceable transactions.")
message:
_('If you check this box, your transactions will be marked as non-final,') \
2018-04-15 20:45:30 +03:00
+ ' ' + _('and you will have the possibility, while they are unconfirmed, to replace them with transactions that pays higher fees.') \
+ ' ' + _('Note that some merchants do not accept non-final transactions until they are confirmed.')
action: partial(root.boolean_dialog, 'use_rbf', _('Replace by fee'), self.message)
CardSeparator
SettingsItem:
status: _('Yes') if app.use_unconfirmed else _('No')
title: _('Spend unconfirmed') + ': ' + self.status
description: _("Use unconfirmed coins in transactions.")
message: _('Spend unconfirmed coins')
action: partial(root.boolean_dialog, 'use_unconfirmed', _('Use unconfirmed'), self.message)
CardSeparator
SettingsItem:
status: _('Yes') if app.use_change else _('No')
title: _('Use change addresses') + ': ' + self.status
description: _("Send your change to separate addresses.")
message: _('Send excess coins to change addresses')
action: partial(root.boolean_dialog, 'use_change', _('Use change addresses'), self.message)
2017-12-12 17:25:41 +01:00
# disabled: there is currently only one coin selection policy
#CardSeparator
#SettingsItem:
# status: root.coinselect_status()
# title: _('Coin selection') + ': ' + self.status
# description: "Coin selection method"
# action: partial(root.coinselect_dialog, self)
2015-12-16 11:53:37 +01:00
''')
2016-03-06 11:46:09 +01:00
2015-12-16 11:53:37 +01:00
class SettingsDialog(Factory.Popup):
def __init__(self, app):
self.app = app
2016-01-19 12:37:40 +01:00
self.plugins = self.app.plugins
self.config = self.app.electrum_config
2015-12-16 11:53:37 +01:00
Factory.Popup.__init__(self)
2016-01-21 12:12:55 +01:00
layout = self.ids.scrollviewlayout
layout.bind(minimum_height=layout.setter('height'))
2016-03-06 11:46:09 +01:00
# cached dialogs
self._fx_dialog = None
2017-03-27 18:59:48 +02:00
self._proxy_dialog = None
2016-03-06 11:46:09 +01:00
self._language_dialog = None
self._unit_dialog = None
self._coinselect_dialog = None
2015-12-16 11:53:37 +01:00
def update(self):
self.wallet = self.app.wallet
2016-03-10 16:43:15 +01:00
self.disable_pin = self.wallet.is_watching_only() if self.wallet else True
2016-08-19 13:10:39 +02:00
self.use_encryption = self.wallet.has_password() if self.wallet else False
2015-12-16 11:53:37 +01:00
def get_language_name(self):
2016-01-19 12:37:40 +01:00
return languages.get(self.config.get('language', 'en_UK'), '')
2015-12-16 11:53:37 +01:00
2016-03-06 11:46:09 +01:00
def change_password(self, item, dt):
self.app.change_password(self.update)
def language_dialog(self, item, dt):
2016-03-06 11:46:09 +01:00
if self._language_dialog is None:
l = self.config.get('language', 'en_UK')
def cb(key):
self.config.set_key("language", key, True)
item.lang = self.get_language_name()
self.app.language = key
self._language_dialog = ChoiceDialog(_('Language'), languages, l, cb)
self._language_dialog.open()
2015-12-16 11:53:37 +01:00
def unit_dialog(self, item, dt):
2016-03-06 11:46:09 +01:00
if self._unit_dialog is None:
def cb(text):
2016-03-06 14:49:50 +01:00
self.app._set_bu(text)
2016-03-06 11:46:09 +01:00
item.bu = self.app.base_unit
2018-05-05 12:42:17 +02:00
self._unit_dialog = ChoiceDialog(_('Denomination'), base_units_list,
self.app.base_unit, cb, keep_choice_order=True)
2016-03-06 11:46:09 +01:00
self._unit_dialog.open()
2015-12-16 11:53:37 +01:00
def coinselect_status(self):
return coinchooser.get_name(self.app.electrum_config)
def coinselect_dialog(self, item, dt):
2016-03-06 11:46:09 +01:00
if self._coinselect_dialog is None:
choosers = sorted(coinchooser.COIN_CHOOSERS.keys())
chooser_name = coinchooser.get_name(self.config)
2016-03-06 11:46:09 +01:00
def cb(text):
self.config.set_key('coin_chooser', text)
item.status = text
self._coinselect_dialog = ChoiceDialog(_('Coin selection'), choosers, chooser_name, cb)
self._coinselect_dialog.open()
2017-03-27 18:59:48 +02:00
def proxy_status(self):
2018-09-10 00:59:53 +02:00
net_params = self.app.network.get_parameters()
proxy = net_params.proxy
2017-03-27 18:59:48 +02:00
return proxy.get('host') +':' + proxy.get('port') if proxy else _('None')
def proxy_dialog(self, item, dt):
network = self.app.network
2017-03-27 18:59:48 +02:00
if self._proxy_dialog is None:
net_params = network.get_parameters()
2018-09-10 00:59:53 +02:00
proxy = net_params.proxy
2017-03-27 18:59:48 +02:00
def callback(popup):
2018-09-10 00:59:53 +02:00
nonlocal net_params
2017-03-27 18:59:48 +02:00
if popup.ids.mode.text != 'None':
proxy = {
'mode':popup.ids.mode.text,
'host':popup.ids.host.text,
'port':popup.ids.port.text,
'user':popup.ids.user.text,
'password':popup.ids.password.text
}
else:
proxy = None
2018-09-10 00:59:53 +02:00
net_params = net_params._replace(proxy=proxy)
network.run_from_another_thread(network.set_parameters(net_params))
2017-03-27 18:59:48 +02:00
item.status = self.proxy_status()
popup = Builder.load_file('electrum/gui/kivy/uix/ui_screens/proxy.kv')
2017-03-27 18:59:48 +02:00
popup.ids.mode.text = proxy.get('mode') if proxy else 'None'
popup.ids.host.text = proxy.get('host') if proxy else ''
popup.ids.port.text = proxy.get('port') if proxy else ''
popup.ids.user.text = proxy.get('user') if proxy else ''
popup.ids.password.text = proxy.get('password') if proxy else ''
popup.on_dismiss = lambda: callback(popup)
self._proxy_dialog = popup
self._proxy_dialog.open()
def plugin_dialog(self, name, label, dt):
2017-10-21 11:00:56 +02:00
from .checkbox_dialog import CheckBoxDialog
2016-01-19 12:37:40 +01:00
def callback(status):
2016-01-21 12:12:55 +01:00
self.plugins.enable(name) if status else self.plugins.disable(name)
2016-01-19 12:37:40 +01:00
label.status = 'ON' if status else 'OFF'
2016-01-21 12:12:55 +01:00
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)
2016-01-19 12:37:40 +01:00
d.open()
2016-01-22 10:50:24 +01:00
def fee_status(self):
return self.config.get_fee_status()
2016-01-22 10:50:24 +01:00
def boolean_dialog(self, name, title, message, dt):
2017-10-21 11:00:56 +02:00
from .checkbox_dialog import CheckBoxDialog
CheckBoxDialog(title, message, getattr(self.app, name), lambda x: setattr(self.app, name, x)).open()
2016-06-10 05:49:22 +02:00
def fx_status(self):
fx = self.app.fx
if fx.is_enabled():
source = fx.exchange.name()
ccy = fx.get_currency()
return '%s [%s]' %(ccy, source)
else:
2017-01-24 10:45:49 +01:00
return _('None')
def fx_dialog(self, label, dt):
2016-03-06 11:46:09 +01:00
if self._fx_dialog is None:
2017-10-21 11:00:56 +02:00
from .fx_dialog import FxDialog
2016-03-06 11:46:09 +01:00
def cb():
label.status = self.fx_status()
self._fx_dialog = FxDialog(self.app, self.plugins, self.config, cb)
self._fx_dialog.open()