URI: 
       tkivy: receive_screen improvements - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit f5fcae7f11e5d102b70bb76d413e428db451f1a9
   DIR parent b54ba556bca11f17c6236ead7a6c3cb754555fa1
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Mon,  8 Feb 2016 19:01:34 +0100
       
       kivy: receive_screen improvements
       
       Diffstat:
         M gui/kivy/main_window.py             |      11 ++---------
         A gui/kivy/uix/dialogs/question.py    |      51 +++++++++++++++++++++++++++++++
         M gui/kivy/uix/screens.py             |      71 ++++++++++++++++++-------------
         M gui/kivy/uix/ui_screens/receive.kv  |      12 ++++++------
         M gui/kivy/uix/ui_screens/send.kv     |       4 ++--
       
       5 files changed, 102 insertions(+), 47 deletions(-)
       ---
   DIR diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py
       t@@ -159,8 +159,6 @@ class ElectrumWindow(App):
            '''
        
            uri = StringProperty('', allownone=True)
       -    '''
       -    '''
        
            wallet = ObjectProperty(None)
            '''Holds the electrum wallet
       t@@ -176,7 +174,6 @@ class ElectrumWindow(App):
                self.nfcscanner = None
                self.tabs = None
        
       -        self.receive_address = None
                self.current_invoice = None
        
                super(ElectrumWindow, self).__init__(**kwargs)
       t@@ -203,9 +200,6 @@ class ElectrumWindow(App):
                self._trigger_notify_transactions = \
                    Clock.create_trigger(self.notify_transactions, 5)
        
       -    def get_receive_address(self):
       -        return self.receive_address if self.receive_address else self.wallet.get_unused_address(None)
       -
            def do_pay(self, obj):
                pr = self.invoices.get(obj.key)
                self.on_pr(pr)
       t@@ -264,8 +258,7 @@ class ElectrumWindow(App):
                panel.switch_to(tab)
        
            def show_request(self, addr):
       -        self.receive_address = addr
       -        self.update_tab('receive')
       +        self.receive_screen.screen.address = addr
                self.switch_to('receive')
        
            def scan_qr(self, on_complete):
       t@@ -644,7 +637,7 @@ class ElectrumWindow(App):
                popup.open()
        
            def address_dialog(self, screen):
       -        pass
       +        self.switch_to('invoices')
        
            def description_dialog(self, screen):
                from uix.dialogs.label_dialog import LabelDialog
   DIR diff --git a/gui/kivy/uix/dialogs/question.py b/gui/kivy/uix/dialogs/question.py
       t@@ -0,0 +1,51 @@
       +from kivy.app import App
       +from kivy.factory import Factory
       +from kivy.properties import ObjectProperty
       +from kivy.lang import Builder
       +from kivy.uix.checkbox import CheckBox
       +from kivy.uix.label import Label
       +from kivy.uix.widget import Widget
       +
       +from electrum_gui.kivy.i18n import _
       +
       +Builder.load_string('''
       +<Question@Popup>
       +    id: popup
       +    title: ''
       +    message: ''
       +    size_hint: 0.8, 0.5
       +    pos_hint: {'top':0.9}
       +    BoxLayout:
       +        orientation: 'vertical'
       +        Label:
       +            id: label
       +            text: root.message
       +        Widget:
       +            size_hint: 1, 0.1
       +        BoxLayout:
       +            orientation: 'horizontal'
       +            size_hint: 1, 0.2
       +            Button:
       +                text: _('No')
       +                size_hint: 0.5, None
       +                height: '48dp'
       +                on_release:
       +                    popup.dismiss()
       +            Button:
       +                text: _('Yes')
       +                size_hint: 0.5, None
       +                height: '48dp'
       +                on_release:
       +                    root.callback()
       +                    popup.dismiss()
       +''')
       +
       +
       +
       +class Question(Factory.Popup):
       +
       +    def __init__(self, msg, callback):
       +        Factory.Popup.__init__(self)
       +        self.title = _('Question')
       +        self.message = msg
       +        self.callback = callback
   DIR diff --git a/gui/kivy/uix/screens.py b/gui/kivy/uix/screens.py
       t@@ -194,9 +194,6 @@ class SendScreen(CScreen):
                self.screen.address = ''
                self.payment_request = None
        
       -    def amount_dialog(self):
       -        Clock.schedule_once(lambda dt: self.app.amount_dialog(self, True), .25)
       -
            def set_request(self, pr):
                self.payment_request = pr
                self.screen.address = pr.get_requestor()
       t@@ -263,16 +260,28 @@ class SendScreen(CScreen):
        class ReceiveScreen(CScreen):
        
            kvname = 'receive'
       -    
       +
            def update(self):
       -        addr = self.app.get_receive_address()
       +        if not self.screen.address:
       +            self.get_new_address()
       +
       +    def get_new_address(self):
       +        addr = self.app.wallet.get_unused_address(None)
       +        if addr is None:
       +            return False
                self.screen.address = addr
       +        self.screen.amount = ''
       +        self.screen.message = ''
       +        return True
       +
       +    def on_address(self, addr):
                req = self.app.wallet.receive_requests.get(addr)
                if req:
                    self.screen.message = unicode(req.get('memo', ''))
                    amount = req.get('amount')
                    if amount:
                        self.screen.amount = self.app.format_amount_and_units(amount)
       +        Clock.schedule_once(lambda dt: self.update_qr())
        
            def amount_callback(self, popup):
                amount_label = self.screen.ids.get('amount')
       t@@ -321,31 +330,19 @@ class ReceiveScreen(CScreen):
                message = str(self.screen.message) #.ids.message_input.text)
                if not message and not amount:
                    return False
       -        if amount:
       -            amount = self.app.get_amount(amount)
       -        else:
       -            amount = 0
       +        amount = self.app.get_amount(amount) if amount else 0
                req = self.app.wallet.make_payment_request(addr, amount, message, None)
                self.app.wallet.add_payment_request(req, self.app.electrum_config)
                self.app.update_tab('requests')
                return True
        
       -    def on_amount(self):
       +    def on_amount_or_message(self):
                self.do_save()
       -        self.update_qr()
       -
       -    def on_message(self):
       -        self.do_save()
       -        self.update_qr()
       +        Clock.schedule_once(lambda dt: self.update_qr())
        
            def do_new(self):
       -        if self.do_save():
       -            self.app.show_info(_('Request saved'))
       -
       -        self.app.receive_address = None
       -        self.screen.amount = ''
       -        self.screen.message = ''
       -        self.update()
       +        if not self.get_new_address():
       +            self.app.show_info(_('Please use the existing requests first.'))
        
        
        class ContactsScreen(CScreen):
       t@@ -423,15 +420,20 @@ class InvoicesScreen(CScreen):
                self.app.do_pay(obj)
        
            def do_delete(self, obj):
       -        self.app.invoices.remove(obj.key)
       -        self.app.update_tab('invoices')
       +        from dialogs.question import Question
       +        def cb():
       +            self.app.invoices.remove(obj.key)
       +            self.app.update_tab('invoices')
       +        d = Question(_('Delete invoice?'), cb)
       +        d.open()
       +
        
        class RequestsScreen(CScreen):
            kvname = 'requests'
        
            def update(self):
        
       -        self.menu_actions = [('Show', self.do_show), ('Delete', self.do_delete)]
       +        self.menu_actions = [('View/Edit', self.do_show), ('Delete', self.do_delete)]
                requests_list = self.screen.ids.requests_container
                requests_list.clear_widgets()
                _list = self.app.wallet.get_sorted_requests(self.app.electrum_config)
       t@@ -445,10 +447,15 @@ class RequestsScreen(CScreen):
                    ci = Factory.RequestItem()
                    ci.address = req['address']
                    ci.memo = self.app.wallet.get_label(address)
       -            status = req.get('status')
       -            ci.status = pr_text[status]
       +            if amount:
       +                status = req.get('status')
       +                ci.status = pr_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 ''
       +            ci.amount = self.app.format_amount_and_units(amount) if amount else _('No Amount')
                    ci.date = format_time(timestamp)
                    ci.screen = self
                    requests_list.add_widget(ci)
       t@@ -461,8 +468,12 @@ class RequestsScreen(CScreen):
                self.app.show_request(obj.address)
        
            def do_delete(self, obj):
       -        self.app.wallet.remove_payment_request(obj.address, self.app.electrum_config)
       -        self.update()
       +        from dialogs.question import Question
       +        def cb():
       +            self.app.wallet.remove_payment_request(obj.address, self.app.electrum_config)
       +            self.update()
       +        d = Question(_('Delete request?'), cb)
       +        d.open()
        
        
        class CSpinner(Factory.Spinner):
   DIR diff --git a/gui/kivy/uix/ui_screens/receive.kv b/gui/kivy/uix/ui_screens/receive.kv
       t@@ -15,11 +15,11 @@ ReceiveScreen:
            message: ''
        
            on_address:
       -        self.parent.update_qr()
       +        self.parent.on_address(self.address)
            on_amount:
       -        self.parent.on_amount()
       +        self.parent.on_amount_or_message()
            on_message:
       -        self.parent.on_message()
       +        self.parent.on_amount_or_message()
        
            BoxLayout
                padding: '12dp', '12dp', '12dp', '12dp'
       t@@ -71,7 +71,7 @@ ReceiveScreen:
                            id: amount_label
                            default_text: _('Amount')
                            text: s.amount if s.amount else _('Amount')
       -                    on_release: app.amount_dialog(s, False)
       +                    on_release: Clock.schedule_once(lambda dt: app.amount_dialog(s, False))
                    CardSeparator:
                        opacity: message_selection.opacity
                        color: blue_bottom.foreground_color
       t@@ -89,7 +89,7 @@ ReceiveScreen:
                        BlueButton:
                            id: description
                            text: s.message if s.message else _('Description')
       -                    on_release: app.description_dialog(s)
       +                    on_release: Clock.schedule_once(lambda dt: app.description_dialog(s))
                BoxLayout:
                    size_hint: 1, None
                    height: '48dp'
       t@@ -107,4 +107,4 @@ ReceiveScreen:
                        text: _('New')
                        size_hint: 1, None
                        height: '48dp'
       -                on_release: s.parent.do_new()
       +                on_release: Clock.schedule_once(lambda dt: s.parent.do_new())
   DIR diff --git a/gui/kivy/uix/ui_screens/send.kv b/gui/kivy/uix/ui_screens/send.kv
       t@@ -52,7 +52,7 @@ SendScreen:
                            id: amount_e
                            default_text: _('Amount')
                            text: s.amount if s.amount else _('Amount')
       -                    on_release: s.amount_dialog()
       +                    on_release: Clock.schedule_once(lambda dt: app.amount_dialog(s, True))
                    CardSeparator:
                        opacity: message_selection.opacity
                        color: blue_bottom.foreground_color
       t@@ -69,7 +69,7 @@ SendScreen:
                        BlueButton:
                            id: description
                            text: s.message if s.message else _('Description')
       -                    on_release: app.description_dialog(s)
       +                    on_release: Clock.schedule_once(lambda dt: app.description_dialog(s))
                BoxLayout:
                    size_hint: 1, None
                    height: '48dp'