tkivy: remove dynamic screen loading. - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 8b79e9fed1dfe4f8c272098f828acd19dcf2b15a DIR parent b0ddd7dc2779eeb2b328bea05d63a7343ab404ae HTML Author: ThomasV <thomasv@electrum.org> Date: Sat, 7 Mar 2020 22:18:53 +0100 kivy: remove dynamic screen loading. The performance gain it brings is negligible, and it causes object duplication, which makes tthings difficult to debug. Diffstat: M electrum/gui/kivy/uix/screens.py | 106 ++++++++++++++----------------- M electrum/gui/kivy/uix/ui_screens/h… | 2 +- M electrum/gui/kivy/uix/ui_screens/r… | 10 +++++----- M electrum/gui/kivy/uix/ui_screens/s… | 10 +++++----- 4 files changed, 60 insertions(+), 68 deletions(-) --- DIR diff --git a/electrum/gui/kivy/uix/screens.py b/electrum/gui/kivy/uix/screens.py t@@ -58,7 +58,6 @@ class PaymentRecycleView(RecycleView): class CScreen(Factory.Screen): __events__ = ('on_activate', 'on_deactivate', 'on_enter', 'on_leave') action_view = ObjectProperty(None) - loaded = False kvname = None app = App.get_running_app() # type: ElectrumWindow t@@ -80,17 +79,8 @@ class CScreen(Factory.Screen): def update(self): pass - @profiler - def load_screen(self): - self.screen = Builder.load_file('electrum/gui/kivy/uix/ui_screens/' + self.kvname + '.kv') - self.add_widget(self.screen) - self.loaded = True - self.update() - setattr(self.app, self.kvname + '_screen', self) - def on_activate(self): - if self.kvname and not self.loaded: - self.load_screen() + setattr(self.app, self.kvname + '_screen', self) #Clock.schedule_once(lambda dt: self._change_action_view()) def on_leave(self): t@@ -114,6 +104,12 @@ TX_ICONS = [ "confirmed", ] + +Builder.load_file('electrum/gui/kivy/uix/ui_screens/history.kv') +Builder.load_file('electrum/gui/kivy/uix/ui_screens/send.kv') +Builder.load_file('electrum/gui/kivy/uix/ui_screens/receive.kv') + + class HistoryScreen(CScreen): tab = ObjectProperty(None) t@@ -182,7 +178,7 @@ class HistoryScreen(CScreen): return self.history = wallet.get_full_history(self.app.fx) history = reversed(self.history.values()) - history_card = self.screen.ids.history_container + history_card = self.ids.history_container history_card.data = [self.get_card(item) for item in history] t@@ -204,11 +200,11 @@ class SendScreen(CScreen): return self.parsed_URI = uri amount = uri.get('amount') - self.screen.address = uri.get('address', '') - self.screen.message = uri.get('message', '') - self.screen.amount = self.app.format_amount_and_units(amount) if amount else '' + self.address = uri.get('address', '') + self.message = uri.get('message', '') + self.amount = self.app.format_amount_and_units(amount) if amount else '' self.payment_request = None - self.screen.is_lightning = False + self.is_lightning = False def set_ln_invoice(self, invoice): try: t@@ -217,15 +213,13 @@ class SendScreen(CScreen): except Exception as e: self.app.show_info(invoice + _(" is not a valid Lightning invoice: ") + repr(e)) # repr because str(Exception()) == '' return - self.screen.address = invoice - self.screen.message = dict(lnaddr.tags).get('d', None) - self.screen.amount = self.app.format_amount_and_units(lnaddr.amount * bitcoin.COIN) if lnaddr.amount else '' + self.address = invoice + self.message = dict(lnaddr.tags).get('d', None) + self.amount = self.app.format_amount_and_units(lnaddr.amount * bitcoin.COIN) if lnaddr.amount else '' self.payment_request = None - self.screen.is_lightning = True + self.is_lightning = True def update(self): - if not self.loaded: - return if self.app.wallet and self.payment_request_queued: self.set_URI(self.payment_request_queued) self.payment_request_queued = None t@@ -233,7 +227,7 @@ class SendScreen(CScreen): _list.reverse() lnworker_logs = self.app.wallet.lnworker.logs if self.app.wallet.lnworker else {} _list = [x for x in _list if x and x.get('status') != PR_PAID or x.get('rhash') in lnworker_logs] - payments_container = self.screen.ids.payments_container + payments_container = self.ids.payments_container payments_container.data = [self.get_card(item) for item in _list] def show_item(self, obj): t@@ -263,20 +257,20 @@ class SendScreen(CScreen): } def do_clear(self): - self.screen.amount = '' - self.screen.message = '' - self.screen.address = '' + self.amount = '' + self.message = '' + self.address = '' self.payment_request = None - self.screen.is_lightning = False - self.screen.is_bip70 = False + self.is_lightning = False + self.is_bip70 = False self.parsed_URI = None def set_request(self, pr: 'PaymentRequest'): - self.screen.address = pr.get_requestor() + self.address = pr.get_requestor() amount = pr.get_amount() - self.screen.amount = self.app.format_amount_and_units(amount) if amount else '' - self.screen.message = pr.get_memo() - self.screen.locked = True + self.amount = self.app.format_amount_and_units(amount) if amount else '' + self.message = pr.get_memo() + self.locked = True self.payment_request = pr def do_paste(self): t@@ -301,20 +295,20 @@ class SendScreen(CScreen): self.set_URI(data) def read_invoice(self): - address = str(self.screen.address) + address = str(self.address) if not address: self.app.show_error(_('Recipient not specified.') + ' ' + _('Please scan a Bitcoin address or a payment request')) return - if not self.screen.amount: + if not self.amount: self.app.show_error(_('Please enter an amount')) return try: - amount = self.app.get_amount(self.screen.amount) + amount = self.app.get_amount(self.amount) except: - self.app.show_error(_('Invalid amount') + ':\n' + self.screen.amount) + self.app.show_error(_('Invalid amount') + ':\n' + self.amount) return - message = self.screen.message - if self.screen.is_lightning: + message = self.message + if self.is_lightning: return self.app.wallet.lnworker.parse_bech32_invoice(address) else: # on-chain if self.payment_request: t@@ -423,32 +417,32 @@ class ReceiveScreen(CScreen): return self.app.electrum_config.get('request_expiry', PR_DEFAULT_EXPIRATION_WHEN_CREATING) def clear(self): - self.screen.address = '' - self.screen.amount = '' - self.screen.message = '' - self.screen.lnaddr = '' + self.address = '' + self.amount = '' + self.message = '' + self.lnaddr = '' def set_address(self, addr): - self.screen.address = addr + self.address = addr def on_address(self, addr): req = self.app.wallet.get_request(addr) - self.screen.status = '' + self.status = '' if req: - self.screen.message = req.get('memo', '') + self.message = req.get('memo', '') amount = req.get('amount') - self.screen.amount = self.app.format_amount_and_units(amount) if amount else '' + self.amount = self.app.format_amount_and_units(amount) if amount else '' status = req.get('status', PR_UNKNOWN) - self.screen.status = _('Payment received') if status == PR_PAID else '' + self.status = _('Payment received') if status == PR_PAID else '' def get_URI(self): from electrum.util import create_bip21_uri - amount = self.screen.amount + amount = self.amount if amount: - a, u = self.screen.amount.split() + a, u = self.amount.split() assert u == self.app.base_unit amount = Decimal(a) * pow(10, self.app.decimal_point()) - return create_bip21_uri(self.screen.address, amount, self.screen.message) + return create_bip21_uri(self.address, amount, self.message) def do_copy(self): uri = self.get_URI() t@@ -456,17 +450,17 @@ class ReceiveScreen(CScreen): self.app.show_info(_('Request copied to clipboard')) def new_request(self, lightning): - amount = self.screen.amount + amount = self.amount amount = self.app.get_amount(amount) if amount else 0 - message = self.screen.message + message = self.message if lightning: key = self.app.wallet.lnworker.add_request(amount, message, self.expiry()) else: - addr = self.screen.address or self.app.wallet.get_unused_address() + addr = self.address or self.app.wallet.get_unused_address() if not addr: self.app.show_info(_('No address available. Please remove some of your pending requests.')) return - self.screen.address = addr + self.address = addr req = self.app.wallet.make_payment_request(addr, amount, message, self.expiry()) self.app.wallet.add_payment_request(req) key = addr t@@ -497,11 +491,9 @@ class ReceiveScreen(CScreen): return ci def update(self): - if not self.loaded: - return _list = self.app.wallet.get_sorted_requests() _list.reverse() - requests_container = self.screen.ids.requests_container + requests_container = self.ids.requests_container requests_container.data = [self.get_card(item) for item in _list if item.get('status') != PR_PAID] def show_item(self, obj): DIR diff --git a/electrum/gui/kivy/uix/ui_screens/history.kv b/electrum/gui/kivy/uix/ui_screens/history.kv t@@ -76,7 +76,7 @@ orientation: 'vertical' -HistoryScreen: +<HistoryScreen>: name: 'history' content: history_container BoxLayout: DIR diff --git a/electrum/gui/kivy/uix/ui_screens/receive.kv b/electrum/gui/kivy/uix/ui_screens/receive.kv t@@ -60,7 +60,7 @@ orientation: 'vertical' -ReceiveScreen: +<ReceiveScreen>: id: s name: 'receive' address: '' t@@ -135,22 +135,22 @@ ReceiveScreen: icon: 'atlas://electrum/gui/kivy/theming/light/list' size_hint: 0.5, None height: '48dp' - on_release: Clock.schedule_once(lambda dt: s.parent.clear_requests_dialog()) + on_release: Clock.schedule_once(lambda dt: s.clear_requests_dialog()) IconButton: icon: 'atlas://electrum/gui/kivy/theming/light/clock1' size_hint: 0.5, None height: '48dp' - on_release: Clock.schedule_once(lambda dt: s.parent.expiration_dialog(s)) + on_release: Clock.schedule_once(lambda dt: s.expiration_dialog(s)) Button: text: _('Clear') size_hint: 1, None height: '48dp' - on_release: Clock.schedule_once(lambda dt: s.parent.clear()) + on_release: Clock.schedule_once(lambda dt: s.clear()) Button: text: _('Request') size_hint: 1, None height: '48dp' - on_release: Clock.schedule_once(lambda dt: s.parent.new_request(root.is_lightning)) + on_release: Clock.schedule_once(lambda dt: s.new_request(root.is_lightning)) Widget: size_hint: 1, 0.1 RequestRecycleView: DIR diff --git a/electrum/gui/kivy/uix/ui_screens/send.kv b/electrum/gui/kivy/uix/ui_screens/send.kv t@@ -62,7 +62,7 @@ height: self.minimum_height orientation: 'vertical' -SendScreen: +<SendScreen>: id: s name: 'send' address: '' t@@ -150,12 +150,12 @@ SendScreen: height: '48dp' IconButton: size_hint: 0.5, 1 - on_release: s.parent.do_save() + on_release: s.do_save() icon: 'atlas://electrum/gui/kivy/theming/light/save' IconButton: size_hint: 0.5, 1 icon: 'atlas://electrum/gui/kivy/theming/light/copy' - on_release: s.parent.do_paste() + on_release: s.do_paste() IconButton: id: qr size_hint: 1, 1 t@@ -164,11 +164,11 @@ SendScreen: Button: text: _('Clear') size_hint: 1, 1 - on_release: s.parent.do_clear() + on_release: s.do_clear() Button: text: _('Pay') size_hint: 1, 1 - on_release: s.parent.do_pay() + on_release: s.do_pay() Widget: size_hint: 1, 0.1 PaymentRecycleView: