kivy: rework send and receive screens
This commit is contained in:
parent
e9ee851bb2
commit
df02269bcf
|
@ -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()
|
||||
|
||||
|
|
|
@ -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_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)
|
||||
|
||||
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)
|
||||
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
|
||||
|
||||
amount = self.app.get_amount(scrn.amount_e.text)
|
||||
#fee = scrn.fee_e.amt
|
||||
#if not fee:
|
||||
# app.show_error(_('Invalid Fee'))
|
||||
# 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'
|
||||
|
||||
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 = ''
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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: _('Copy')
|
||||
size_hint: 1, None
|
||||
height: '48dp'
|
||||
on_release: s.parent.do_copy()
|
||||
Button:
|
||||
text: _('Clear')
|
||||
size_hint: 1, None
|
||||
height: '48dp'
|
||||
on_release: receive_screen.parent.do_clear()
|
||||
Button:
|
||||
text: _('Share')
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue