URI: 
       tkivy: cache gui list items - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 03bd6a092bf22e800d316de14f6f422d75c00384
   DIR parent 016d733c0f81fb6a39a56cc6ae48563399f7839e
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Wed,  1 Jun 2016 19:21:37 +0200
       
       kivy: cache gui list items
       
       Diffstat:
         M gui/kivy/uix/screens.py             |     153 ++++++++++++++++---------------
       
       1 file changed, 81 insertions(+), 72 deletions(-)
       ---
   DIR diff --git a/gui/kivy/uix/screens.py b/gui/kivy/uix/screens.py
       t@@ -106,6 +106,7 @@ class HistoryScreen(CScreen):
        
            tab = ObjectProperty(None)
            kvname = 'history'
       +    cards = {}
        
            def __init__(self, **kwargs):
                self.ra_dialog = None
       t@@ -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.')
       t@@ -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))
       t@@ -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)]
       t@@ -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))