commit df02269bcfdb2cfc5794a230795995b7b89120e9
parent e9ee851bb2278c60485c48d644d945e382b3e098
Author: ThomasV <thomasv@electrum.org>
Date: Fri, 4 Dec 2015 11:47:46 +0100
kivy: rework send and receive screens
Diffstat:
4 files changed, 97 insertions(+), 124 deletions(-)
diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py
@@ -48,6 +48,7 @@ from kivy.uix.screenmanager import Screen
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.uix.label import Label
from kivy.uix.checkbox import CheckBox
+from kivy.core.clipboard import Clipboard
Factory.register('TabbedCarousel', module='electrum_gui.kivy.uix.screens')
@@ -163,7 +164,7 @@ class ElectrumWindow(App):
def __init__(self, **kwargs):
# initialize variables
- self._clipboard = None
+ self._clipboard = Clipboard
self.info_bubble = None
self.qrscanner = None
self.nfcscanner = None
@@ -203,18 +204,6 @@ class ElectrumWindow(App):
return
self.send_screen.set_URI(url)
- def send_from_clipboard(self, on_complete):
- if not self._clipboard:
- from kivy.core.clipboard import Clipboard
- self._clipboard = Clipboard
- contents = self._clipboard.get()
- try:
- uri = electrum.util.parse_URI(contents)
- except:
- self.show_info("Invalid URI", url)
- return
- on_complete(uri)
-
def scan_qr(self, on_complete):
from jnius import autoclass
@@ -564,14 +553,6 @@ class ElectrumWindow(App):
format(txs=tx_amount, amount=self.format_amount(v),
unit=self.base_unit))
- def copy(self, text):
- ''' Copy provided text to clipboard
- '''
- if not self._clipboard:
- from kivy.core.clipboard import Clipboard
- self._clipboard = Clipboard
- self._clipboard.put(text, 'text/plain')
-
def notify(self, message):
try:
global notification, os
@@ -776,7 +757,7 @@ class ElectrumWindow(App):
popup.tx_hash = tx_hash
popup.open()
- def amount_dialog(self, label, callback, show_max):
+ def amount_dialog(self, screen, show_max):
popup = Builder.load_file('gui/kivy/uix/ui_screens/amount.kv')
but_max = popup.ids.but_max
if not show_max:
@@ -786,15 +767,16 @@ class ElectrumWindow(App):
but_max.disabled = False
but_max.opacity = 1
- if label.text != label.default_text:
- a, u = label.text.split()
+ amount = screen.amount
+ if amount:
+ a, u = str(amount).split()
assert u == self.base_unit
popup.ids.a.amount = a
+
def cb():
o = popup.ids.a.btc_text
- label.text = o if o else label.default_text
- if callback:
- callback()
+ screen.amount = o
+
popup.on_dismiss = cb
popup.open()
diff --git a/gui/kivy/uix/screens.py b/gui/kivy/uix/screens.py
@@ -10,12 +10,14 @@ from kivy.cache import Cache
from kivy.clock import Clock
from kivy.compat import string_types
from kivy.properties import (ObjectProperty, DictProperty, NumericProperty,
- ListProperty)
+ ListProperty, StringProperty)
+
+
from kivy.lang import Builder
from kivy.factory import Factory
from electrum.i18n import _
-from electrum.util import profiler
+from electrum.util import profiler, parse_URI
from electrum import bitcoin
from electrum.util import timestamp_to_datetime
from electrum.plugins import run_hook
@@ -181,42 +183,38 @@ class SendScreen(CScreen):
kvname = 'send'
def set_URI(self, uri):
- print "z", uri
- self.ids.payto_e.text = uri.get('address', '')
- self.ids.message_e.text = uri.get('message', '')
+ print "set uri", uri
+ self.screen.address = uri.get('address', '')
+ self.screen.message = uri.get('message', '')
amount = uri.get('amount')
if amount:
amount_str = str( Decimal(amount) / pow(10, self.app.decimal_point()))
- self.ids.amount_e.text = amount_str + ' ' + self.app.base_unit
+ self.screen.amount = amount_str + ' ' + self.app.base_unit
def do_clear(self):
- self.ids.payto_e.text = ''
- self.ids.message_e.text = ''
- self.ids.amount_e.text = 'Amount'
- #self.set_frozen(content, False)
- #self.update_status()
+ self.screen.amount = ''
+ self.screen.message = ''
+ self.screen.address = ''
- def do_send(self):
- scrn = self.ids
- label = unicode(scrn.message_e.text)
- r = unicode(scrn.payto_e.text).strip()
- # label or alias, with address in brackets
- m = re.match('(.*?)\s*\<([1-9A-HJ-NP-Za-km-z]{26,})\>', r)
- to_address = m.group(2) if m else r
-
- if not bitcoin.is_address(to_address):
- self.app.show_error(_('Invalid Bitcoin Address') + ':\n' + to_address)
+ def do_paste(self):
+ contents = unicode(self.app._clipboard.get())
+ try:
+ uri = parse_URI(contents)
+ except:
+ self.app.show_info("Invalid URI", contents)
return
+ self.set_URI(uri)
- amount = self.app.get_amount(scrn.amount_e.text)
- #fee = scrn.fee_e.amt
- #if not fee:
- # app.show_error(_('Invalid Fee'))
- # return
+ def do_send(self):
+ address = str(self.screen.address)
+ amount = self.app.get_amount(self.screen.amount)
+ message = unicode(self.screen.message)
+ if not bitcoin.is_address(self.address):
+ self.app.show_error(_('Invalid Bitcoin Address') + ':\n' + address)
+ return
fee = None
- message = 'sending {} {} to {}'.format(self.app.base_unit, scrn.amount_e.text, r)
- outputs = [('address', to_address, amount)]
- self.app.password_dialog(self.send_tx, (outputs, fee, label))
+ outputs = [('address', address, amount)]
+ self.app.password_dialog(self.send_tx, (outputs, fee, message))
def send_tx(self, *args):
self.app.show_info("Sending...")
@@ -244,43 +242,41 @@ class SendScreen(CScreen):
class ReceiveScreen(CScreen):
- kvname = 'receive'
+ kvname = 'receive'
+
def update(self):
- addr = self.app.wallet.get_unused_address(None)
- address_label = self.screen.ids.get('address')
- address_label.text = addr
- self.update_qr()
+ self.screen.address = self.app.wallet.get_unused_address(None)
def amount_callback(self, popup):
amount_label = self.screen.ids.get('amount')
amount_label.text = popup.ids.amount_label.text
self.update_qr()
- @profiler
- def update_qr(self):
+ def get_URI(self):
from electrum.util import create_URI
- address = self.screen.ids.get('address').text
- amount = self.screen.ids.get('amount').text
- default_text = self.screen.ids.get('amount').default_text
- if amount == default_text:
- amount = None
- else:
- a, u = amount.split()
+ amount = self.screen.amount
+ if amount:
+ a, u = self.screen.amount.split()
assert u == self.app.base_unit
amount = Decimal(a) * pow(10, self.app.decimal_point())
- msg = self.screen.ids.get('message').text
- uri = create_URI(address, amount, msg)
+ return create_URI(self.screen.address, amount, self.screen.message)
+
+ @profiler
+ def update_qr(self):
+ uri = self.get_URI()
qr = self.screen.ids.get('qr')
qr.set_data(uri)
- def do_share(self):
- pass
+ def do_copy(self):
+ uri = self.get_URI()
+ print "put", uri
+ self.app._clipboard.put(uri, 'text/plain')
+ print "get", self.app._clipboard.get()
def do_clear(self):
- a = self.screen.ids.get('amount')
- a.text = a.default_text
- self.screen.ids.get('message').text = ''
+ self.screen.amount = ''
+ self.screen.message = ''
diff --git a/gui/kivy/uix/ui_screens/receive.kv b/gui/kivy/uix/ui_screens/receive.kv
@@ -7,9 +7,20 @@
ReceiveScreen:
- id: receive_screen
+ id: s
name: 'receive'
+ address: ''
+ amount: ''
+ message: ''
+
+ on_address:
+ self.parent.update_qr()
+ on_amount:
+ self.parent.update_qr()
+ on_message:
+ self.parent.update_qr()
+
BoxLayout
padding: '12dp', '12dp', '12dp', '12dp'
spacing: '12dp'
@@ -27,10 +38,11 @@ ReceiveScreen:
self.shaded = not self.shaded
self.foreground_color = (0, 0, 0, 0.5) if self.shaded else (0, 0, 0, 0)
Label:
- id: address
+ id: address_label
size_hint: 1, None
height: '48dp'
opacity: 0.5 if qr.shaded else 1
+ text: s.address
SendReceiveBlueBottom:
id: blue_bottom
@@ -45,8 +57,9 @@ ReceiveScreen:
size: '22dp', '22dp'
pos_hint: {'center_y': .5}
AmountButton:
- id: amount
- on_release: app.amount_dialog(amount, receive_screen.parent.update_qr, False)
+ id: amount_label
+ text: s.amount if s.amount else 'Amount'
+ on_release: app.amount_dialog(s, False)
CardSeparator:
opacity: message_selection.opacity
color: blue_bottom.foreground_color
@@ -62,23 +75,23 @@ ReceiveScreen:
size: '22dp', '22dp'
pos_hint: {'center_y': .5}
TextInputBlue:
- id: message
+ id: message_input
hint_text: 'Description'
- on_text_validate: receive_screen.parent.update_qr()
+ text: s.message
+ on_text_validate: s.message = self.text
BoxLayout:
size_hint: 1, None
height: '48dp'
Button:
- text: _('Clear')
+ text: _('Copy')
size_hint: 1, None
height: '48dp'
- on_release: receive_screen.parent.do_clear()
+ on_release: s.parent.do_copy()
Button:
- text: _('Share')
+ text: _('Clear')
size_hint: 1, None
height: '48dp'
- on_release: receive_screen.parent.do_share()
-
+ on_release: s.parent.do_clear()
Widget:
size_hint: 1, 0.3
diff --git a/gui/kivy/uix/ui_screens/send.kv b/gui/kivy/uix/ui_screens/send.kv
@@ -7,36 +7,14 @@
#:set font_light 'data/fonts/Roboto-Condensed.ttf'
-<SendToggle@ToggleButton>
- source: ''
- markup: False
- bold: True
- border: 4, 4, 4, 4
- group: 'transfer_type'
- background_normal: self.background_down
- color:
- (.140, .140, .140, 1) if self.state == 'down' else (.796, .796, .796, 1)
- canvas.after:
- Color:
- rgba: 1, 1, 1, 1
- Image:
- source: root.source
- color: root.color
- size: '30dp', '30dp'
- center_x: root.center_x - ((root.texture_size[0]/2)+(self.width/1.5))
- center_y: root.center_y
-
-
-
SendScreen:
- id: send_screen
+ id: s
name: 'send'
- #action_view: Factory.SendActionView()
- #on_deactivate:
- # self.ids.amount_e.focus = False
- # self.ids.payto_e.focus = False
- # self.ids.message_e.focus = False
+ address: ''
+ amount: ''
+ message: ''
+
BoxLayout
padding: '12dp', '12dp', '12dp', '12dp'
spacing: '12dp'
@@ -56,6 +34,7 @@ SendScreen:
pos_hint: {'center_y': .5}
TextInputBlue:
id: payto_e
+ text: s.address
hint_text: "Recipient"
CardSeparator:
opacity: message_selection.opacity
@@ -70,8 +49,8 @@ SendScreen:
pos_hint: {'center_y': .5}
AmountButton:
id: amount_e
- on_release: app.amount_dialog(self, None, True)
-
+ text: s.amount if s.amount else 'Amount'
+ on_release: app.amount_dialog(s, True)
CardSeparator:
opacity: message_selection.opacity
@@ -89,6 +68,7 @@ SendScreen:
pos_hint: {'center_y': .5}
TextInputBlue:
id: message_e
+ text: s.message
hint_text: 'Description'
BoxLayout:
size_hint: 1, None
@@ -97,26 +77,28 @@ SendScreen:
id: qr
text: _('QR Code')
on_release:
- app.scan_qr(on_complete=root.set_URI)
+ app.scan_qr(on_complete=s.parent.set_URI)
Button:
id: paste_button
- text: _('Clipboard')
+ text: _('Paste')
on_release:
- app.send_from_clipboard(on_complete=root.set_URI)
+ s.parent.do_paste()
Button:
text: _('Clear')
size_hint: 1, None
height: '48dp'
- on_release: send_screen.do_clear()
- Widget:
- size_hint: 1, 1
+ on_release: s.parent.do_clear()
BoxLayout:
size_hint: 1, None
height: '48dp'
+ Widget:
+ size_hint: 1, 1
Button:
text: _('Send')
size_hint: 1, None
height: '48dp'
- on_release: send_screen.do_send()
+ on_release: s.parent.do_send()
+ Widget:
+ size_hint: 1, 1