electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 03bd6a092bf22e800d316de14f6f422d75c00384
parent 016d733c0f81fb6a39a56cc6ae48563399f7839e
Author: ThomasV <thomasv@electrum.org>
Date:   Wed,  1 Jun 2016 19:21:37 +0200

kivy: cache gui list items

Diffstat:
Mgui/kivy/uix/screens.py | 153++++++++++++++++++++++++++++++++++++++++++-------------------------------------
1 file changed, 81 insertions(+), 72 deletions(-)

diff --git a/gui/kivy/uix/screens.py b/gui/kivy/uix/screens.py @@ -106,6 +106,7 @@ class HistoryScreen(CScreen): tab = ObjectProperty(None) kvname = 'history' + cards = {} def __init__(self, **kwargs): self.ra_dialog = None @@ -129,48 +130,41 @@ class HistoryScreen(CScreen): d = LabelDialog(_('Enter Transaction Label'), text, callback) d.open() - - def parse_history(self, items): - for item in items: - tx_hash, height, conf, timestamp, value, balance = item - status, status_str = self.app.wallet.get_tx_status(tx_hash, height, conf, timestamp) - icon = "atlas://gui/kivy/theming/light/" + TX_ICONS[status] - label = self.app.wallet.get_label(tx_hash) if tx_hash else _('Pruned transaction outputs') - date = timestamp_to_datetime(timestamp) - quote_text = '' - if self.app.fiat_unit and date: - rate = run_hook('history_rate', date) - if rate: - s = run_hook('value_str', value, rate) - quote_text = '' if s is None else s + ' ' + self.app.fiat_unit - yield (conf, icon, status_str, label, value, tx_hash, quote_text) + def get_card(self, tx_hash, height, conf, timestamp, value, balance): + status, status_str = self.app.wallet.get_tx_status(tx_hash, height, conf, timestamp) + icon = "atlas://gui/kivy/theming/light/" + TX_ICONS[status] + label = self.app.wallet.get_label(tx_hash) if tx_hash else _('Pruned transaction outputs') + date = timestamp_to_datetime(timestamp) + ri = self.cards.get(tx_hash) + if ri is None: + ri = Factory.HistoryItem() + ri.screen = self + ri.tx_hash = tx_hash + self.cards[tx_hash] = ri + ri.icon = icon + ri.date = status_str + ri.message = label + ri.value = value or 0 + ri.value_known = value is not None + ri.confirmations = conf + if self.app.fiat_unit and date: + rate = run_hook('history_rate', date) + if rate: + s = run_hook('value_str', value, rate) + ri.quote_text = '' if s is None else s + ' ' + self.app.fiat_unit + return ri def update(self, see_all=False): if self.app.wallet is None: return - - history = self.parse_history(reversed( - self.app.wallet.get_history(self.app.current_account))) - # repopulate History Card + history = reversed(self.app.wallet.get_history(self.app.current_account)) history_card = self.screen.ids.history_container history_card.clear_widgets() count = 0 for item in history: + ri = self.get_card(*item) count += 1 - conf, icon, date_time, message, value, tx, quote_text = item - ri = Factory.HistoryItem() - ri.icon = icon - ri.date = date_time - ri.message = message - ri.value = value or 0 - ri.value_known = value is not None - ri.quote_text = quote_text - ri.confirmations = conf - ri.tx_hash = tx - ri.screen = self history_card.add_widget(ri) - if count == 8 and not see_all: - break if count == 0: msg = _('This screen shows your list of transactions. It is currently empty.') @@ -425,32 +419,40 @@ pr_icon = { class InvoicesScreen(CScreen): kvname = 'invoices' + cards = {} + + def get_card(self, pr): + key = pr.get_id() + ci = self.cards.get(key) + if ci is None: + ci = Factory.InvoiceItem() + ci.key = key + ci.screen = self + self.cards[key] = ci + + ci.requestor = pr.get_requestor() + ci.memo = pr.get_memo() + amount = pr.get_amount() + if amount: + ci.amount = self.app.format_amount_and_units(amount) + status = self.app.invoices.get_status(ci.key) + ci.status = invoice_text[status] + ci.icon = pr_icon[status] + else: + ci.amount = _('No Amount') + ci.status = '' + exp = pr.get_expiration_date() + ci.date = format_time(exp) if exp else _('Never') + return ci def update(self): self.menu_actions = [('Pay', self.do_pay), ('Details', self.do_view), ('Delete', self.do_delete)] invoices_list = self.screen.ids.invoices_container invoices_list.clear_widgets() - _list = self.app.invoices.sorted_list() for pr in _list: - ci = Factory.InvoiceItem() - ci.key = pr.get_id() - ci.requestor = pr.get_requestor() - ci.memo = pr.get_memo() - amount = pr.get_amount() - if amount: - ci.amount = self.app.format_amount_and_units(amount) - status = self.app.invoices.get_status(ci.key) - ci.status = invoice_text[status] - ci.icon = pr_icon[status] - else: - ci.amount = _('No Amount') - ci.status = '' - exp = pr.get_expiration_date() - ci.date = format_time(exp) if exp else _('Never') - ci.screen = self + ci = self.get_card(pr) invoices_list.add_widget(ci) - if not _list: msg = _('This screen shows the list of payment requests that have been sent to you. You may also use it to store contact addresses.') invoices_list.add_widget(EmptyLabel(text=msg)) @@ -475,6 +477,34 @@ class InvoicesScreen(CScreen): class RequestsScreen(CScreen): kvname = 'requests' + cards = {} + + def get_card(self, req): + address = req['address'] + timestamp = req.get('time', 0) + amount = req.get('amount') + expiration = req.get('exp', None) + status = req.get('status') + signature = req.get('sig') + + ci = self.cards.get(address) + if ci is None: + ci = Factory.RequestItem() + ci.screen = self + ci.address = address + self.cards[address] = ci + + ci.memo = self.app.wallet.get_label(address) + if amount: + status = req.get('status') + ci.status = request_text[status] + else: + received = self.app.wallet.get_addr_received(address) + ci.status = self.app.format_amount_and_units(amount) + ci.icon = pr_icon[status] + ci.amount = self.app.format_amount_and_units(amount) if amount else _('No Amount') + ci.date = format_time(timestamp) + return ci def update(self): self.menu_actions = [('Show', self.do_show), ('Details', self.do_view), ('Delete', self.do_delete)] @@ -482,29 +512,8 @@ class RequestsScreen(CScreen): requests_list.clear_widgets() _list = self.app.wallet.get_sorted_requests(self.app.electrum_config) if self.app.wallet else [] for req in _list: - address = req['address'] - timestamp = req.get('time', 0) - amount = req.get('amount') - expiration = req.get('exp', None) - status = req.get('status') - signature = req.get('sig') - - ci = Factory.RequestItem() - ci.address = address - ci.memo = self.app.wallet.get_label(address) - if amount: - status = req.get('status') - ci.status = request_text[status] - else: - received = self.app.wallet.get_addr_received(address) - ci.status = self.app.format_amount_and_units(amount) - - ci.icon = pr_icon[status] - ci.amount = self.app.format_amount_and_units(amount) if amount else _('No Amount') - ci.date = format_time(timestamp) - ci.screen = self + ci = self.get_card(req) requests_list.add_widget(ci) - if not _list: msg = _('This screen shows the list of payment requests you made.') requests_list.add_widget(EmptyLabel(text=msg))