You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1774 lines
59 KiB
1774 lines
59 KiB
#:import _ electrum.i18n._
|
|
#:import Cache kivy.cache.Cache
|
|
#:import Factory kivy.factory.Factory
|
|
#:import Decimal decimal.Decimal
|
|
#:set font_light 'data/fonts/Roboto-Condensed.ttf'
|
|
#:set btc_symbol unichr(171)
|
|
#:set mbtc_symbol unichr(187)
|
|
|
|
<WalletActionPrevious@ActionPrevious>
|
|
app_icon: 'atlas://gui/kivy/theming/light/' + ('wallets' if app.ui_mode[0] != 't' else 'tab_btn')
|
|
with_previous: False
|
|
size_hint: None, 1
|
|
mipmap: True
|
|
on_release: app.root.children[0].toggle_drawer()
|
|
|
|
<CloseButton@IconButton>
|
|
source: 'atlas://gui/kivy/theming/light/closebutton'
|
|
opacity: 1 if self.state == 'normal' else .75
|
|
size_hint: None, None
|
|
size: '27dp', '27dp'
|
|
|
|
#######################
|
|
# Screen Contacts
|
|
#######################
|
|
<ContactImage@Widget>:
|
|
source: 'atlas://gui/kivy/theming/light/contact_avatar'
|
|
size_hint_x: None
|
|
width: self.height
|
|
canvas:
|
|
Color:
|
|
rgba: 1, 1, 1, 1
|
|
Ellipse:
|
|
source: root.source
|
|
size: self.width + dp(6), self.height + dp(6)
|
|
pos: self.x - dp(3), self.y - dp(3)
|
|
Ellipse:
|
|
source: 'atlas://gui/kivy/theming/light/contact_overlay'
|
|
size: self.width + dp(11), self.height + dp(11)
|
|
pos: self.x - dp(5.5), self.y - dp(5.5)
|
|
|
|
<ContactLabel@Label>
|
|
color: .305, .309, .309, 1
|
|
text_size: self.size
|
|
halign: 'left'
|
|
valign: 'middle'
|
|
|
|
<ContactSeperator@Widget>
|
|
canvas.before:
|
|
Color:
|
|
rgba: .890, .890, .890, 1
|
|
Rectangle:
|
|
size: self.size
|
|
pos: self.x, self.y + dp(9)
|
|
size_hint: None, None
|
|
size: '1dp', '22dp'
|
|
pos_hint_y: .5
|
|
|
|
<ContactTextInput@TextInput>
|
|
background_normal: self.background_down
|
|
background_down: 'atlas://gui/kivy/theming/light/tab_btn'
|
|
size_hint_y: None
|
|
height: '22dp'
|
|
|
|
<ContactBitLogo@Image>
|
|
source: 'atlas://gui/kivy/theming/light/bit_logo'
|
|
size_hint_x: None
|
|
width: '32dp'
|
|
|
|
<ContactItem@BoxLayout>
|
|
address: ''
|
|
label: ''
|
|
tx_amt: 0
|
|
size_hint_y: None
|
|
height: '65dp'
|
|
padding: dp(12)
|
|
spacing: dp(5)
|
|
canvas.before:
|
|
Color:
|
|
rgba: 1, 1, 1, 1
|
|
Rectangle:
|
|
size: self.size
|
|
pos: self.pos
|
|
ContactImage:
|
|
id: contact_image
|
|
Widget:
|
|
size_hint_x: None
|
|
width: '9dp'
|
|
ContactLabel:
|
|
id: contact_label
|
|
text: root.label
|
|
ContactSeperator:
|
|
ContactBitLogo:
|
|
|
|
<ScreenContacts>
|
|
name: 'contacts'
|
|
on_activate:
|
|
if not self.action_view:\
|
|
self.action_view = app.root.main_screen.ids.tabs.ids.screen_dashboard.action_view
|
|
BoxLayout:
|
|
orientation: 'vertical'
|
|
spacing: '1dp'
|
|
ContactTextInput:
|
|
ScrollView:
|
|
canvas.before:
|
|
Color:
|
|
rgba: .8901, .8901, .8901, 1
|
|
Rectangle:
|
|
size: self.size
|
|
pos: self.pos
|
|
GridLayout:
|
|
cols: 1
|
|
id: contact_container
|
|
size_hint_y: None
|
|
height: self.minimum_height
|
|
spacing: '1dp'
|
|
|
|
<SendActionView@ActionView>
|
|
foreground_color: (.466, .466, .466, 1)
|
|
color_active: (0.235, .588, .89, 1)
|
|
WalletActionPrevious:
|
|
id: action_previous
|
|
width: but_star.width
|
|
ActionButton:
|
|
id: action_logo
|
|
important: True
|
|
size_hint: 1, 1
|
|
markup: True
|
|
mipmap: True
|
|
bold: True
|
|
markup: True
|
|
color: 1, 1, 1, 1
|
|
text:
|
|
"[color=#777777][sub] [sup][size=9dp]{}[/size][/sup][/sub]{}[/color]"\
|
|
.format(app.base_unit, app.status)
|
|
font_size: '22dp'
|
|
minimum_width: '1dp'
|
|
Butt_star:
|
|
id: but_star
|
|
on_release:
|
|
if self.state == 'down':\
|
|
app.show_info_bubble(\
|
|
text='[b]Expert mode on[/b]\n you can now select your address',\
|
|
icon='atlas://gui/kivy/theming/light/star_big_inactive',\
|
|
duration=1, arrow_pos='', width='250dp')
|
|
|
|
|
|
<TextInputSendBlue@TextInput>
|
|
padding: '5dp'
|
|
size_hint: 1, None
|
|
height: '27dp'
|
|
pos_hint: {'center_y':.5}
|
|
multiline: False
|
|
hint_text_color: self.foreground_color
|
|
foreground_color: .843, .914, .972, 1
|
|
background_color: 1, 1, 1, 1
|
|
background_normal: 'atlas://gui/kivy/theming/light/tab_btn'
|
|
background_active: 'atlas://gui/kivy/theming/light/textinput_active'
|
|
|
|
|
|
<TransactionFeeDialog@SelectionDialog>
|
|
return_obj: None
|
|
min_fee: app.format_amount(app.wallet.fee)
|
|
title:
|
|
'[size=9dp] \n[/size]Transaction Fee[size=9dp]\n'\
|
|
'[color=#ADAEAE]Minimum is BTC {}[/color][/size]'.format(self.min_fee)
|
|
title_size: '24sp'
|
|
on_activate:
|
|
ti_fee.focus = True
|
|
if self.return_obj:\
|
|
ti_fee.text = "BTC " + self.return_obj.amt
|
|
on_deactivate: ti_fee.focus = False
|
|
on_release:
|
|
if self.return_obj and ti_fee.text:\
|
|
txt = ti_fee.text;\
|
|
spc = txt.rfind(' ') + 1;\
|
|
txt = '' if spc == 0 else txt[spc:];\
|
|
num = 0 if not txt else float(txt);\
|
|
self.return_obj.amt = max(self.min_fee, txt)
|
|
root.dismiss()
|
|
ELTextInput
|
|
id: ti_fee
|
|
size_hint: 1, None
|
|
height: '34dp'
|
|
multiline: False
|
|
on_text_validate: root.dispatch('on_release', self)
|
|
pos_hint: {'center_y': .7}
|
|
text: "BTC " + root.min_fee
|
|
input_type: 'number'
|
|
|
|
|
|
<ScreenSend>
|
|
mode: 'address'
|
|
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
|
|
BoxLayout
|
|
padding: '12dp', '12dp', '12dp', '12dp'
|
|
spacing: '12dp'
|
|
orientation: 'vertical'
|
|
mode: 'address'
|
|
SendReceiveToggle:
|
|
SendToggle:
|
|
id: toggle_address
|
|
text: 'ADDRESS'
|
|
group: 'send_type'
|
|
state: 'down' if root.mode == 'address' else 'normal'
|
|
source: 'atlas://gui/kivy/theming/light/globe'
|
|
background_down: 'atlas://gui/kivy/theming/light/btn_send_address'
|
|
on_release:
|
|
if root.mode == 'address': root.mode = 'fc'
|
|
root.mode = 'address'
|
|
SendToggle:
|
|
id: toggle_nfc
|
|
text: 'NFC'
|
|
group: 'send_type'
|
|
state: 'down' if root.mode == 'nfc' else 'normal'
|
|
source: 'atlas://gui/kivy/theming/light/nfc'
|
|
background_down: 'atlas://gui/kivy/theming/light/btn_send_nfc'
|
|
on_release:
|
|
if root.mode == 'nfc': root.mode = 'str'
|
|
root.mode = 'nfc'
|
|
GridLayout:
|
|
id: grid
|
|
cols: 1
|
|
size_hint: 1, None
|
|
height: self.minimum_height
|
|
SendReceiveCardTop
|
|
id: card_address
|
|
BoxLayout
|
|
size_hint: 1, None
|
|
height: '42dp'
|
|
rows: 1
|
|
Label
|
|
id: lbl_symbl
|
|
bold: True
|
|
color: amount_e.foreground_color
|
|
text_size: self.size
|
|
valign: 'bottom'
|
|
halign: 'left'
|
|
font_size: '22sp'
|
|
text:
|
|
u'[font={fnt}]{smbl}[/font]'.\
|
|
format(smbl=btc_symbol if app.base_unit == 'BTC' else mbtc_symbol, fnt=font_light)
|
|
size_hint_x: .25
|
|
ELTextInput:
|
|
id: amount_e
|
|
input_type: 'number'
|
|
multiline: False
|
|
bold: True
|
|
font_size: '50sp'
|
|
foreground_color: .308, .308, .308, 1
|
|
background_normal: 'atlas://gui/kivy/theming/light/tab_btn'
|
|
pos_hint: {'top': 1.5}
|
|
size_hint: .7, None
|
|
height: '67dp'
|
|
hint_text: 'Amount'
|
|
text: '0.0'
|
|
on_text_validate: payto_e.focus = True
|
|
CardSeparator
|
|
BoxLayout:
|
|
size_hint: 1, None
|
|
height: '42dp'
|
|
spacing: '5dp'
|
|
Label:
|
|
id: fee_e
|
|
color: .761, .761, .761, 1
|
|
font_size: '12dp'
|
|
amt: app.format_amount(app.wallet.fee_per_kb(app.gui_object.config)) if app.wallet else 0
|
|
text:
|
|
u'[b]{sign}{symbl}{amt}[/b] of fee'.\
|
|
format(symbl=lbl_symbl.text,\
|
|
sign='+' if self.amt > 0 else '-', amt=self.amt)
|
|
size_hint_x: None
|
|
width: self.texture_size[0]
|
|
halign: 'left'
|
|
valign: 'middle'
|
|
IconButton:
|
|
color: 0.694, 0.694, 0.694, 1
|
|
source: 'atlas://gui/kivy/theming/light/gear'
|
|
pos_hint: {'center_y': .5}
|
|
size_hint: None, None
|
|
size: '22dp', '22dp'
|
|
on_release:
|
|
dlg = Cache.get('electrum_widgets', 'TransactionFeeDialog')
|
|
|
|
if not dlg:\
|
|
Factory.register('SelectionDialog', module='electrum_gui.kivy.uix.dialogs');\
|
|
dlg = Factory.TransactionFeeDialog();\
|
|
Cache.append('electrum_widgets', 'TransactionDialog', dlg)
|
|
|
|
dlg.return_obj = fee_e
|
|
dlg.open()
|
|
Label:
|
|
font_size: '12dp'
|
|
color: fee_e.color
|
|
text: u'= {}'.format(app.create_quote_text(Decimal(float(amount_e.text)), mode='symbol')) if amount_e.text else u'0'
|
|
text_size: self.size
|
|
halign: 'right'
|
|
valign: 'middle'
|
|
SendReceiveBlueBottom:
|
|
id: blue_bottom
|
|
size_hint: 1, None
|
|
height: self.minimum_height
|
|
BoxLayout
|
|
size_hint: 1, None
|
|
height: blue_bottom.item_height
|
|
spacing: '5dp'
|
|
Image:
|
|
source: 'atlas://gui/kivy/theming/light/contact'
|
|
size_hint: None, None
|
|
size: '22dp', '22dp'
|
|
pos_hint: {'center_y': .5}
|
|
TextInputSendBlue:
|
|
id: payto_e
|
|
hint_text: "Enter Contact or adress"
|
|
on_text_validate:
|
|
Factory.Animation(opacity=1,\
|
|
height=blue_bottom.item_height)\
|
|
.start(message_selection)
|
|
message_e.focus = True
|
|
Widget:
|
|
size_hint: None, None
|
|
width: dp(2)
|
|
height: qr.height
|
|
pos_hint: {'center_y':.5}
|
|
canvas.after:
|
|
Rectangle:
|
|
size: self.size
|
|
pos: self.pos
|
|
IconButton:
|
|
id: qr
|
|
source: 'atlas://gui/kivy/theming/light/qrcode'
|
|
pos_hint: {'center_y': .5}
|
|
size_hint: None, None
|
|
size: '22dp', '22dp'
|
|
on_release: app.scan_qr(on_complete=root.set_qr_data)
|
|
CardSeparator
|
|
opacity: message_selection.opacity
|
|
color: blue_bottom.foreground_color
|
|
BoxLayout:
|
|
id: message_selection
|
|
opacity: 1 if app.expert_mode else 0
|
|
size_hint: 1, None
|
|
height: blue_bottom.item_height if app.expert_mode else 0
|
|
spacing: '5dp'
|
|
Image:
|
|
source: 'atlas://gui/kivy/theming/light/pen'
|
|
size_hint: None, None
|
|
size: '22dp', '22dp'
|
|
pos_hint: {'center_y': .5}
|
|
TextInputSendBlue:
|
|
id: message_e
|
|
hint_text: 'Enter description here'
|
|
on_text_validate:
|
|
anim = Factory.Animation(opacity=1, height=blue_bottom.item_height)
|
|
anim.start(wallet_selection)
|
|
#anim.start(address_selection)
|
|
CardSeparator
|
|
opacity: wallet_selection.opacity
|
|
color: blue_bottom.foreground_color
|
|
WalletSelector:
|
|
id: wallet_selection
|
|
foreground_color: blue_bottom.foreground_color
|
|
opacity: 1 if app.expert_mode else 0
|
|
size_hint: 1, None
|
|
height: blue_bottom.item_height if app.expert_mode else 0
|
|
CardSeparator
|
|
opacity: address_selection.opacity
|
|
color: blue_bottom.foreground_color
|
|
AddressSelector:
|
|
id: address_selection
|
|
foreground_color: blue_bottom.foreground_color
|
|
opacity: 1 if app.expert_mode else 0
|
|
size_hint: 1, None
|
|
height: blue_bottom.item_height if app.expert_mode else 0
|
|
CreateAccountButtonGreen:
|
|
background_color: (1, 1, 1, 1) if self.disabled else ((.258, .80, .388, 1) if self.state == 'normal' else (.203, .490, .741, 1))
|
|
text: _('Send')
|
|
size_hint_y: None
|
|
height: '38dp'
|
|
disabled: False
|
|
on_release: app.do_send()
|
|
Widget
|
|
|
|
|
|
<SendToggle@ToggleButton>
|
|
source: ''
|
|
group: 'transfer_type'
|
|
markup: False
|
|
bold: True
|
|
border: 4, 4, 4, 4
|
|
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
|
|
|
|
<BlueSpinner@BoxLayout>
|
|
foreground_color: 1, 1, 1, 1
|
|
spacing: '9dp'
|
|
text: ''
|
|
values: ('', )
|
|
icon: ''
|
|
Image:
|
|
source: root.icon
|
|
size_hint: None, None
|
|
size: '22dp', '22dp'
|
|
pos_hint: {'center_y': .5}
|
|
OppositeSpinner:
|
|
color: root.foreground_color
|
|
background_normal: 'atlas://gui/kivy/theming/light/action_group_light'
|
|
markup: False
|
|
shorten: True
|
|
font_size: '16dp'
|
|
size_hint: 1, .7
|
|
pos_hint: {'center_y': .5}
|
|
text: root.text
|
|
text_size: self.size
|
|
halign: 'left'
|
|
valign: 'middle'
|
|
on_text:
|
|
root.text = args[1]
|
|
values: root.values
|
|
|
|
<AddressSelector@BlueSpinner>
|
|
icon: 'atlas://gui/kivy/theming/light/globe'
|
|
values: app.wallet.addresses() if app.wallet else []
|
|
text: _("Select Your address")
|
|
|
|
<WalletSelector@BlueSpinner>
|
|
icon: 'atlas://gui/kivy/theming/light/wallet'
|
|
values: ('default Wallet',)
|
|
text: _('Select your wallet')
|
|
|
|
<SendReceiveToggle@BoxLayout>
|
|
padding: '5dp', '5dp'
|
|
size_hint: 1, None
|
|
height: '45dp'
|
|
canvas.before:
|
|
Color:
|
|
rgba: 1, 1, 1, 1
|
|
BorderImage:
|
|
border: 12, 12, 12, 12
|
|
source: 'atlas://gui/kivy/theming/light/card'
|
|
size: self.width + dp(3), self.height
|
|
pos: self.x - dp(1.5), self.y
|
|
|
|
<SendReceiveCardTop@GridLayout>
|
|
canvas.before:
|
|
BorderImage:
|
|
border: 9, 9, 9, 9
|
|
source: 'atlas://gui/kivy/theming/light/card_top'
|
|
size: self.size
|
|
pos:self.pos
|
|
padding: '12dp', '22dp', '12dp', 0
|
|
cols: 1
|
|
size_hint: 1, None
|
|
height: '120dp'
|
|
spacing: '4dp'
|
|
|
|
<SendReceiveBlueBottom@GridLayout>
|
|
canvas.before:
|
|
Color:
|
|
rgba: .238, .585, .878, 1
|
|
BorderImage:
|
|
border: 9, 9, 9, 9
|
|
source: 'atlas://gui/kivy/theming/light/card_bottom'
|
|
size: self.size
|
|
pos: self.pos
|
|
Color:
|
|
rgba: 1, 1, 1, 1
|
|
|
|
item_height: dp(42)
|
|
foreground_color: .843, .914, .972, 1
|
|
cols: 1
|
|
padding: '12dp', 0
|
|
|
|
|
|
<ScreenReceive>
|
|
mode: 'qr'
|
|
name: 'receive'
|
|
on_mode: if args[1] == 'nfc': from electrum_gui.kivy.nfc_scanner import NFCScanner
|
|
action_view: Factory.ReceiveActionView()
|
|
on_activate:
|
|
self.ids.toggle_qr.state = 'down'
|
|
first_address = app.wallet.addresses()[0]
|
|
qr.data = app.encode_uri(first_address,
|
|
amount=amount_e.text,
|
|
label=app.wallet.labels.get(first_address, first_address),
|
|
message='') if app.wallet and app.wallet.addresses() else ''
|
|
on_deactivate:
|
|
self.ids.amount_e.focus = False
|
|
BoxLayout
|
|
padding: '12dp', '12dp', '12dp', '12dp'
|
|
spacing: '12dp'
|
|
mode: 'qr'
|
|
orientation: 'vertical'
|
|
SendReceiveToggle
|
|
SendToggle:
|
|
id: toggle_qr
|
|
text: 'QR'
|
|
state: 'down' if root.mode == 'qr' else 'normal'
|
|
source: 'atlas://gui/kivy/theming/light/qrcode'
|
|
background_down: 'atlas://gui/kivy/theming/light/btn_send_address'
|
|
on_release:
|
|
if root.mode == 'qr': root.mode = 'nr'
|
|
root.mode = 'qr'
|
|
SendToggle:
|
|
id: toggle_nfc
|
|
text: 'NFC'
|
|
state: 'down' if root.mode == 'nfc' else 'normal'
|
|
source: 'atlas://gui/kivy/theming/light/nfc'
|
|
background_down: 'atlas://gui/kivy/theming/light/btn_send_nfc'
|
|
on_release:
|
|
if root.mode == 'nfc': root.mode = 'nr'
|
|
root.mode = 'nfc'
|
|
GridLayout:
|
|
id: grid
|
|
cols: 1
|
|
#size_hint: 1, None
|
|
#height: self.minimum_height
|
|
SendReceiveCardTop
|
|
height: '110dp'
|
|
BoxLayout:
|
|
size_hint: 1, None
|
|
height: '42dp'
|
|
rows: 1
|
|
Label:
|
|
color: amount_e.foreground_color
|
|
bold: True
|
|
text_size: self.size
|
|
valign: 'bottom'
|
|
font_size: '22sp'
|
|
text:
|
|
u'[font={fnt}]{smbl}[/font]'.\
|
|
format(smbl=btc_symbol if app.base_unit == 'BTC' else mbtc_symbol, fnt=font_light)
|
|
size_hint_x: .25
|
|
ELTextInput:
|
|
id: amount_e
|
|
input_type: 'number'
|
|
multiline: False
|
|
bold: True
|
|
font_size: '50sp'
|
|
foreground_color: .308, .308, .308, 1
|
|
background_normal: 'atlas://gui/kivy/theming/light/tab_btn'
|
|
pos_hint: {'top': 1.5}
|
|
size_hint: .7, None
|
|
height: '67dp'
|
|
hint_text: 'Amount'
|
|
text: '0.0'
|
|
CardSeparator
|
|
BoxLayout:
|
|
size_hint: 1, None
|
|
height: '32dp'
|
|
spacing: '5dp'
|
|
Label:
|
|
color: lbl_quote.color
|
|
font_size: '12dp'
|
|
text: 'Ask to scan the QR below'
|
|
text_size: self.size
|
|
halign: 'left'
|
|
valign: 'middle'
|
|
Label:
|
|
id: lbl_quote
|
|
font_size: '12dp'
|
|
size_hint: .5, 1
|
|
color: .761, .761, .761, 1
|
|
text: u'= {}'.format(app.create_quote_text(Decimal(float(amount_e.text)), mode='symbol')) if amount_e.text else u'0'
|
|
text_size: self.size
|
|
halign: 'right'
|
|
valign: 'middle'
|
|
SendReceiveBlueBottom
|
|
id: blue_bottom
|
|
padding: '12dp', 0, '12dp', '12dp'
|
|
WalletSelector:
|
|
id: wallet_selection
|
|
foreground_color: blue_bottom.foreground_color
|
|
size_hint: 1, None
|
|
height: blue_bottom.item_height
|
|
CardSeparator
|
|
opacity: wallet_selection.opacity
|
|
color: blue_bottom.foreground_color
|
|
AddressSelector:
|
|
id: address_selection
|
|
foreground_color: blue_bottom.foreground_color
|
|
opacity: 1 if app.expert_mode else 0
|
|
size_hint: 1, None
|
|
height: blue_bottom.item_height if app.expert_mode else 0
|
|
on_text:
|
|
if not args[1].startswith('Select'):\
|
|
qr.data = app.encode_uri(args[1],\
|
|
amount=amount_e.text,\
|
|
label=app.wallet.labels.get(args[1], args[1]),\
|
|
message='')
|
|
CardSeparator
|
|
opacity: address_selection.opacity
|
|
color: blue_bottom.foreground_color
|
|
Widget:
|
|
size_hint_y: None
|
|
height: dp(10)
|
|
FloatLayout
|
|
id: bl
|
|
QRCodeWidget:
|
|
id: qr
|
|
size_hint: None, 1
|
|
width: min(self.height, bl.width)
|
|
pos_hint: {'center': (.5, .5)}
|
|
on_touch_down:
|
|
if self.collide_point(*args[1].pos):\
|
|
app.show_info_bubble(icon=self.ids.qrimage.texture, text='texture')
|
|
CreateAccountButtonGreen:
|
|
background_color: (1, 1, 1, 1) if self.disabled else ((.258, .80, .388, 1) if self.state == 'normal' else (.203, .490, .741, 1))
|
|
text: _('Goto next step') if app.wallet and app.wallet.seed else _('Create unsigned transaction')
|
|
size_hint_y: None
|
|
height: '38dp'
|
|
disabled: True if wallet_selection.opacity == 0 else False
|
|
on_release:
|
|
message = 'sending {} {} to {}'.format(\
|
|
app.base_unit, amount_e.text, payto_e.text)
|
|
app.gui.main_gui.do_send(self, message=message)
|
|
|
|
<ReceiveActionView@ActionView>
|
|
WalletActionPrevious:
|
|
id: action_previous
|
|
width: '32dp'
|
|
ActionButton:
|
|
id: action_logo
|
|
important: True
|
|
size_hint: 1, 1
|
|
markup: True
|
|
mipmap: True
|
|
bold: True
|
|
markup: True
|
|
color: 1, 1, 1, 1
|
|
text:
|
|
"[color=#777777][sub] [sup][size=9dp]{}[/size][/sup][/sub]{}[/color]"\
|
|
.format(app.base_unit, app.status)
|
|
font_size: '22dp'
|
|
minimum_width: '1dp'
|
|
Butt_star:
|
|
id: but_star
|
|
on_release:
|
|
if self.state == 'down':\
|
|
app.show_info_bubble(\
|
|
text='[b]Expert mode on[/b]\n you can now select your address',\
|
|
icon='atlas://gui/kivy/theming/light/star_big_inactive',\
|
|
duration=1, arrow_pos='', width='250dp')
|
|
|
|
###############################################
|
|
## Wallet Management
|
|
###############################################
|
|
|
|
<WalletManagement@ScrollView>
|
|
canvas.before:
|
|
Color:
|
|
rgba: .145, .145, .145, 1
|
|
Rectangle:
|
|
size: root.size
|
|
pos: root.pos
|
|
VGridLayout:
|
|
Wallets:
|
|
id: wallets_section
|
|
Plugins:
|
|
id: plugins_section
|
|
Commands:
|
|
id: commands_section
|
|
|
|
<WalletManagementItem@BoxLayout>
|
|
|
|
<Header@WalletManagementItem>
|
|
|
|
<Wallets@VGridLayout>
|
|
Header
|
|
|
|
<Plugins@VGridLayout>
|
|
Header
|
|
|
|
<Commands@VGridLayout>
|
|
Header
|
|
|
|
<StripLayout>
|
|
padding: 0, 0, 0, 0
|
|
|
|
<TabbedCarousel>
|
|
carousel: carousel
|
|
do_default_tab: False
|
|
Carousel:
|
|
scroll_timeout: 190
|
|
anim_type: 'out_quart'
|
|
min_move: .05
|
|
anim_move_duration: .1
|
|
anim_cancel_duration: .54
|
|
scroll_distance: '10dp'
|
|
on_index: root.on_index(*args)
|
|
id: carousel
|
|
|
|
<CScreen>
|
|
content: None
|
|
state: 'deactivated'
|
|
on_enter: self.state = 'loading'
|
|
on_activate:
|
|
self.state = 'activated'
|
|
on_leave: self.state = 'unloading'
|
|
on_deactivate: self.state = 'deactivated'
|
|
color: 1, 1, 1, 1
|
|
Image:
|
|
source: 'atlas://gui/kivy/theming/light/logo_atom_dull'
|
|
size_hint: (None, None)
|
|
pos_hint: {'center_x': .5, 'y': .02}
|
|
allow_stretch: True
|
|
size: ('32dp', '32dp')
|
|
#Label:
|
|
#id: screen_label
|
|
#size: root.size
|
|
#font_size: '45sp'
|
|
#color: root.color
|
|
#text: '' if root.state == 'activated' or root.content else 'Loading...'
|
|
|
|
<EScreen>
|
|
background_color: .929, .929, .929 ,1
|
|
effects: [self.scrollflex]
|
|
|
|
<OppositeDropDown@DropDown>
|
|
#auto_width: False
|
|
size_hint: None, None
|
|
size: self.container.minimum_size if self.container else (0, 0)
|
|
on_container: if args[1]: self.container.padding = '4dp', '4dp', '4dp', '4dp'
|
|
canvas.before:
|
|
Color:
|
|
rgba: 1, 1, 1, 1
|
|
BorderImage:
|
|
pos:self.pos
|
|
border: 20, 20, 20, 20
|
|
source: 'atlas://gui/kivy/theming/light/dropdown_background'
|
|
size: self.size
|
|
|
|
<LightOptions@SpinnerOption>
|
|
font_size: '14sp'
|
|
border: 4, 4, 4, 4
|
|
color: 0.439, 0.439, 0.439, .8
|
|
background_normal: 'atlas://gui/kivy/theming/light/action_button_group'
|
|
background_down: 'atlas://gui/kivy/theming/light/overflow_btn_dn'
|
|
size_hint_y: None
|
|
height: '48dp'
|
|
text_size: self.size[0] - dp(20), self.size[1]
|
|
halign: 'left'
|
|
valign: 'middle'
|
|
shorten: True
|
|
on_press:
|
|
ddn = self.parent.parent
|
|
Factory.Animation(opacity=0, d=.25).start(ddn)
|
|
|
|
|
|
<OppositeSpinner@CSpinner>
|
|
dropdown_cls: Factory.OppositeDropDown
|
|
option_cls: Factory.LightOptions
|
|
border: 20, 20, 9, 9
|
|
background_normal: 'atlas://gui/kivy/theming/light/action_group_dark'
|
|
background_down: self.background_normal
|
|
values: ('Copy to clipboard', 'Send Payment')
|
|
size_hint: None, 1
|
|
width: '12dp'
|
|
on_release:
|
|
ddn = self._dropdown
|
|
ddn.opacity = 0
|
|
Factory.Animation(opacity=1, d=.25).start(ddn)
|
|
|
|
<NewContactDialog>
|
|
title: _('[size=7dp] \n[/size] Add a Contact[size=7dp]\n[/size]')
|
|
title_size: '24sp'
|
|
border: 7, 7, 7, 7
|
|
size_hint: None, None
|
|
size: '320dp', '235dp'
|
|
pos_hint: {'center_y': .53}
|
|
separator_color: .89, .89, .89, 1
|
|
separator_height: '1.2dp'
|
|
title_color: .437, .437, .437, 1
|
|
background: 'atlas://gui/kivy/theming/light/dialog'
|
|
padding: 0, 0
|
|
on_parent:
|
|
self.content.padding = 0, 0, 0, 0
|
|
self.content.parent.parent.padding = 2, 12, 2, 2
|
|
self.content.parent.parent.spacing = 0, -2
|
|
BoxLayout:
|
|
id: bl
|
|
spacing: '1.2dp'
|
|
canvas:
|
|
Color:
|
|
rgba: .901, .901, .901, 1
|
|
Rectangle:
|
|
size: self.size
|
|
pos: self.pos
|
|
ContactButton:
|
|
source: 'atlas://gui/kivy/theming/light/qrcode'
|
|
text: _('QR Scan')
|
|
on_release: root.load_qr_scanner()
|
|
ContactButton:
|
|
id: but_contact
|
|
source: 'atlas://gui/kivy/theming/light/manualentry'
|
|
text: 'Manual Enrty'
|
|
on_release:
|
|
root.new_contact()
|
|
FloatLayout:
|
|
size_hint: None, None
|
|
size: 0, 0
|
|
CloseButton:
|
|
id: but_close
|
|
top: root.top - dp(5)
|
|
right: root.right - dp(5)
|
|
on_release: root.dismiss()
|
|
|
|
|
|
<DialogButton@Button>
|
|
border: 12, 12, 12, 12
|
|
background_normal: 'atlas://gui/kivy/theming/light/dialog'
|
|
background_down: ''
|
|
background_color: (.94, .94, .94, 1) if self.state == 'normal' else (.191, .496, .742, 1)
|
|
|
|
|
|
<ContactButton@DialogButton>
|
|
source: ''
|
|
color: 0, 0, 0, 0
|
|
item_color: (.211, .211, .211, 1) if root.state == 'normal' else (1, 1, 1, 1)
|
|
Image:
|
|
id: img
|
|
allow_stretch: True
|
|
color: root.item_color
|
|
mipmap: True
|
|
source: root.source
|
|
center: (root.center, self.size)[0]
|
|
size: root.width/2., root.height/2.
|
|
Label:
|
|
text: root.text
|
|
color: root.item_color
|
|
size: img.width, self.texture_size[1]
|
|
center: root.center_x, img.y - (self.height/2)
|
|
|
|
|
|
<CarouselHeader>
|
|
border: 0, 0, 0, 0
|
|
text: repr(self)
|
|
color: 0, 0, 0, 0
|
|
background_normal: 'atlas://gui/kivy/theming/light/carousel_selected'
|
|
background_down: 'atlas://gui/kivy/theming/light/carousel_deselected'
|
|
on_state:
|
|
o = .5 if args[1] == 'down' else 1
|
|
anim=Factory.Animation(opacity=o, d=.2).start(self)
|
|
|
|
<CarouselIndicator@TabbedCarousel>
|
|
tab_pos: 'bottom_mid'
|
|
tab_height: '32dp'
|
|
tab_width: self.tab_height
|
|
background_image: 'atlas://data/images/defaulttheme/action_item'
|
|
strip_border: 0, 0, 0, 0
|
|
|
|
<-CarouselDialog>
|
|
header_color: '#707070ff'
|
|
text_color: 0.701, 0.701, 0.701, 1
|
|
title_size: '13sp'
|
|
title: ''
|
|
separator_color: 0.89, 0.89, 0.89, 1
|
|
background: 'atlas://gui/kivy/theming/light/tab_btn'
|
|
carousel_content: carousel_content
|
|
canvas.before:
|
|
Color:
|
|
rgba: 0, 0, 0, .9
|
|
Rectangle:
|
|
size: Window.size
|
|
pos: 0, 0
|
|
Color:
|
|
rgba: 1, 1, 1, 1
|
|
BorderImage:
|
|
border: 12, 12, 12, 12
|
|
source: 'atlas://gui/kivy/theming/light/dialog'
|
|
size: root.width, root.height - self.carousel_content.tab_height if self.carousel_content else 0
|
|
pos: root.x, self.y + self.carousel_content.tab_height if self.carousel_content else 10
|
|
BoxLayout:
|
|
orientation: 'vertical'
|
|
GridLayout:
|
|
cols: 1
|
|
size_hint: 1, None
|
|
height: self.minimum_height
|
|
padding: 0, '7sp'
|
|
Label:
|
|
font_size: root.title_size
|
|
text: u'[color={}]{}[/color]'.format(root.header_color, root.title)
|
|
text_size: self.width, None
|
|
halign: 'left'
|
|
size_hint: 1, None
|
|
height: self.texture_size[1]
|
|
CardSeparator:
|
|
color: root.separator_color
|
|
height: root.separator_height
|
|
FloatLayout:
|
|
size_hint: None, None
|
|
size: 0, 0
|
|
CloseButton:
|
|
id: but_close
|
|
top: root.top - dp(10)
|
|
right: root.right - dp(10)
|
|
on_release: root.dismiss()
|
|
CarouselIndicator:
|
|
id: carousel_content
|
|
|
|
<WalletAddressesDialog>
|
|
wallet_name: 'Default Wallet'
|
|
on_parent: if args[1]: self.children[0].padding = '15dp', '6dp', '15dp', 0
|
|
title_color: .437, .437, .437
|
|
title_size: '23sp'
|
|
separator_height: '1dp'
|
|
size_hint: None, None
|
|
width: min(Window.width - dp(27), dp(360))
|
|
height: min(Window.height - dp(70), self.width * 1.5)
|
|
title: '[size=5sp] \n[/size]{}[size=9sp]\n'.format(self.wallet_name)
|
|
|
|
<ScreenAddress>
|
|
name: 'addresses'
|
|
BoxLayout:
|
|
size_hint: 1, .95
|
|
pos_hint: {'top':1}
|
|
orientation: 'vertical'
|
|
padding: 0, '2.2dp'
|
|
Label:
|
|
markup: False
|
|
color: 0, 0, 0, .3
|
|
text: 'Your bitcoin address:'
|
|
font_size: '15sp'
|
|
text_size: self.width, None
|
|
halign: 'left'
|
|
size_hint: 1, None
|
|
height: self.texture_size[1]
|
|
shorten: True
|
|
BoxLayout:
|
|
orientation: 'vertical'
|
|
spacing: dp(5)
|
|
BoxLayout:
|
|
size_hint: 1, None
|
|
spacing: dp(5)
|
|
height: '27dp'
|
|
OppositeSpinner:
|
|
id: btn_address
|
|
markup: False
|
|
color: 0.439, 0.439, 0.439, 1
|
|
font_size: '14sp'
|
|
text_size: self.width - dp(22), self.height
|
|
shorten: True
|
|
halign: 'left'
|
|
valign: 'middle'
|
|
size_hint: .8, .8
|
|
pos_hint: {'center_y': .5}
|
|
on_text:
|
|
if args[1]: qr.data = app.encode_uri(root.labels[args[1]])
|
|
FloatLayout
|
|
id: fl_paste
|
|
size_hint: None, 1
|
|
width: '37dp'
|
|
Button:
|
|
right: fl_paste.right
|
|
y: fl_paste.y
|
|
size_hint: None, None
|
|
height: '37dp'
|
|
width: self.height
|
|
border: 2, 2, 2, 2
|
|
background_color: .705, .705, .705, 1.5 if self.state == 'normal' else 2
|
|
background_normal: 'atlas://gui/kivy/theming/light/paste_icon'
|
|
background_down: self.background_normal
|
|
on_release:
|
|
app.copy(root.labels[btn_address.text])
|
|
app.show_info_bubble(\
|
|
text='Copied', width='50dp', arrow_pos='', duration=3,\
|
|
pos=(Window.width/2, root.parent.top + dp(18)))
|
|
QRCodeWidget:
|
|
id: qr
|
|
show_border: False
|
|
|
|
<CurrencyLabel@Label>
|
|
color: .698, .701, .701, 1
|
|
font_size: '14sp'
|
|
text_size: self.width, None
|
|
halign: 'left'
|
|
|
|
<CurrencySpinner@OppositeSpinner>
|
|
size_hint_x: None
|
|
width: '60dp'
|
|
text_size: self.width, None
|
|
font_size: '18sp'
|
|
halign: 'left'
|
|
color: .698, .701, .701, 1
|
|
|
|
<SelectionDialog>
|
|
border: 7, 7, 7, 7
|
|
size_hint: None, None
|
|
size: '320dp', '200dp'
|
|
pos_hint: {'center_y': .53}
|
|
separator_color: .89, .89, .89, 1
|
|
separator_height: '1.1dp'
|
|
title_color: .437, .437, .437, 1
|
|
background: 'atlas://gui/kivy/theming/light/dialog'
|
|
on_parent: self.content.parent.parent.padding = '12dp', 0, '12dp', '12dp'
|
|
RelativeLayout:
|
|
orientation: 'vertical'
|
|
padding: 0, '6dp', 0, 0
|
|
RelativeLayout:
|
|
id: container
|
|
BoxLayout
|
|
size_hint_y: None
|
|
height: '48dp'
|
|
pos_hint: {'y':0}
|
|
DialogButton:
|
|
id: btn_cancel
|
|
text: _('Cancel')
|
|
markup: False
|
|
color: .439, .439, .439, 1
|
|
background_color:
|
|
(.235, .588, .882, 1) if self.state[0] == 'd'\
|
|
else (.890, .890, .890, 1)
|
|
on_release:
|
|
root.dismiss()
|
|
Widget:
|
|
size_hint_x: None
|
|
width: '24dp'
|
|
DialogButton:
|
|
id: btn_ok
|
|
text: _('Ok')
|
|
background_color:
|
|
(.235, .588, .882, 1) if self.state[0] == 'n'\
|
|
else (.890, .890, .890, 1)
|
|
on_release:
|
|
root.dispatch('on_release', self)
|
|
FloatLayout:
|
|
size_hint: None, None
|
|
size: 0, 0
|
|
CloseButton:
|
|
id: but_close
|
|
top: root.height - dp(18)
|
|
right: root.width - dp(18)
|
|
on_release: root.dismiss()
|
|
|
|
|
|
<CurrencySelectionDialog@SelectionDialog>
|
|
title: '[size=9dp] \n[/size]Currency Selection[size=7dp]\n[/size]'
|
|
title_size: '24sp'
|
|
on_activate:
|
|
spinner_exchanges.text = app.exchanger.use_exchange
|
|
spinner_currencies.text = app.exchanger.currency
|
|
on_release:
|
|
app.exchanger.currency = spinner_currencies.text
|
|
app.exchanger.use_exchange = spinner_exchanges.text
|
|
root.dismiss()
|
|
BoxLayout
|
|
size_hint_y: None
|
|
height: '24dp'
|
|
spacing: '24dp'
|
|
pos_hint: {'top': .95, 'x': 0}
|
|
CurrencyLabel:
|
|
text: _('Currency')
|
|
size_hint_x: .4
|
|
CurrencyLabel:
|
|
id: lbl_source
|
|
text: _('Exchange Source')
|
|
BoxLayout:
|
|
spacing: '24dp'
|
|
size_hint_y: None
|
|
height: '32dp'
|
|
pos_hint: {'x': 0, 'top': .8}
|
|
CurrencySpinner:
|
|
id: spinner_currencies
|
|
text: app.exchanger.currency
|
|
values: app.currencies
|
|
Widget:
|
|
CurrencySpinner:
|
|
id: spinner_exchanges
|
|
text: app.exchanger.use_exchange
|
|
pos: lbl_source.x, spinner_currencies.y
|
|
width: '140dp'
|
|
height: spinner_currencies.height
|
|
values: app.exchanger.exchanges
|
|
|
|
<RecentActivityDialog>
|
|
on_parent:
|
|
if args[1]:\
|
|
self.children[0].padding = '15dp', '6dp', '15dp', 0
|
|
is_mine: True
|
|
amount: '0.00'
|
|
amount_color: '#000000ff'
|
|
quote_text: '0'
|
|
address: u''
|
|
address_known: unicode(self.address or self.address[1:]) in app.contacts.keys() + self.labels.keys()
|
|
confirmations: 0
|
|
date: '0/0/0'
|
|
fee: _('unknown')
|
|
labels: {}
|
|
status: 'unknown'
|
|
separator_height: '1dp'
|
|
time: _('00:00')
|
|
tx_hash: None
|
|
title:
|
|
u'[size=9] \n[/size]'\
|
|
u'[size={sz}sp][color={clr}]'.format(sz=25.7 if self.width > dp(300) else 22, clr=root.header_color) + \
|
|
_(u'You ') + (_(u'sent') if self.is_mine else _(u'received')) + u'[/color]'\
|
|
'[color={clr}] [font={fnt}]{smbl}[/font]{amt}[/color][/size]\n'.format(\
|
|
clr=root.amount_color, smbl=btc_symbol if app.base_unit == 'BTC' else mbtc_symbol, fnt=font_light, amt=root.amount[:9]) + \
|
|
_(u'About ') + root.quote_text + _(u' at transaction time') + \
|
|
u'[size={}dp] \n[/size]'.format(5 if self.width > dp(300) else 1)
|
|
size_hint: None, None
|
|
width: min(Window.width - dp(27), dp(320))
|
|
height: max(grid.height + dp(120), dp(320))
|
|
font_size: '13sp'
|
|
CScreen:
|
|
tab: screen_details
|
|
GridLayout
|
|
id: grid
|
|
padding: 0, 0, 0, '12dp'
|
|
spacing: '18dp'
|
|
cols: 1
|
|
size_hint: 1, None
|
|
height: self.minimum_height
|
|
pos_hint: {'top':1}
|
|
GridLayout:
|
|
cols: 1
|
|
size_hint_y: None
|
|
height: '39sp'
|
|
spacing: '5dp'
|
|
CardLabel:
|
|
color: root.text_color
|
|
font_size: root.font_size
|
|
text: _('To') if root.is_mine else _('From')
|
|
BoxLayout:
|
|
id: bl_address
|
|
spacing: '4dp'
|
|
size_hint_y: None
|
|
height: '32dp'
|
|
padding: 0, 0, 0, '9dp'
|
|
OppositeSpinner:
|
|
id: btn_address
|
|
markup: False
|
|
color: 0.45, 0.45, 0.45, 1
|
|
font_name: font_light
|
|
font_size: '15sp'
|
|
text: root.address
|
|
shorten: True
|
|
size_hint: None, 1
|
|
text_size: self.width - dp(30), self.height
|
|
halign: 'left'
|
|
width: min(self._label.get_extents(self.text)[0] + dp(32), bl_address.width)
|
|
on_release:
|
|
self._dropdown.auto_width = False
|
|
self._dropdown.width = max(self.width, dp(140))
|
|
on_text:
|
|
if args[1] != root.address[1:]:\
|
|
root.dropdown_selected(args[1]);\
|
|
self.text = root.address
|
|
GridLayout:
|
|
cols: 2
|
|
spacing: '18dp'
|
|
size_hint: 1, None
|
|
height: self.minimum_height
|
|
CardLabel:
|
|
color: root.text_color
|
|
font_size: root.font_size
|
|
text:
|
|
_('Date') + '[color={}][size=4dp]\n\n[/size]'\
|
|
'[size=18dp]{}[/size][/color]'.format(\
|
|
root.header_color, root.date)
|
|
CardLabel:
|
|
color: root.text_color
|
|
font_size: root.font_size
|
|
text:
|
|
_('Status') +\
|
|
'[size=4dp]\n\n[/size]'\
|
|
'[color={}][size=18dp]{}[/size][/color]'.format(\
|
|
'#009900' if root.status == 'Validated' else root.header_color,\
|
|
root.status)
|
|
CardLabel:
|
|
color: root.text_color
|
|
font_size: root.font_size
|
|
text:
|
|
_('Time') +\
|
|
'[size=4dp]\n\n[/size]'\
|
|
'[color={}][size=18dp]{}[/size][/color]'.format(\
|
|
root.header_color, root.time)
|
|
CardLabel:
|
|
color: root.text_color
|
|
font_size: root.font_size
|
|
text:
|
|
_('Confirmations') +\
|
|
'[size=4dp]\n\n[/size]'\
|
|
'[color={}][size=18dp]{}'\
|
|
'[/size][/color]'.format(root.header_color, root.confirmations)
|
|
GridLayout:
|
|
id: fl
|
|
size_hint: 1, None
|
|
height: self.minimum_height
|
|
cols: 1
|
|
BoxLayout:
|
|
size_hint: 1, None
|
|
height: '48sp' if self.opacity else 0
|
|
opacity: 1 if root.is_mine else 0
|
|
CardLabel
|
|
size_hint: 1, 1
|
|
text_size: self.size
|
|
valign: 'top'
|
|
font_size: root.font_size
|
|
color: root.text_color
|
|
markup: True
|
|
text:
|
|
_('Transaction Fees') +\
|
|
'[size=4dp]\n\n[/size]'\
|
|
'[color={}][size=18dp]{}'\
|
|
'[/size][/color]'.format(root.header_color, root.fee)
|
|
CardLabel:
|
|
size_hint: 1, 1
|
|
text_size: self.size
|
|
valign: 'top'
|
|
font_size: root.font_size
|
|
color: root.text_color
|
|
text: _('Wallet')
|
|
markup: True
|
|
DialogButton:
|
|
id: btn_dialog
|
|
size_hint: 1, None
|
|
height: '48sp' if self.opacity else 0
|
|
opacity: 0 if root.is_mine or root.address_known else 1
|
|
background_color:
|
|
(.191, .496, .742, 1) if self.state == 'normal'\
|
|
else (.933, .933, .933, 1)
|
|
color:
|
|
(1, 1, 1, 1) if self.state == 'normal'\
|
|
else (.218, .218, .218, 1)
|
|
disabled: False if self.opacity else True
|
|
text: _('Add address to contacts')
|
|
on_release:
|
|
root.dismiss()
|
|
app.save_new_contact(root.address[1:], '')
|
|
CScreen:
|
|
tab: transaction_id
|
|
color: .5, .5, .5, .5
|
|
on_activate: root.activate_screen_transactionid(self)
|
|
CScreen:
|
|
id: list_inputs
|
|
color: .5, .5, .5, .5
|
|
data: ''
|
|
tab: inputs
|
|
on_enter: root.activate_screen_inputs(self)
|
|
CScreen:
|
|
id: list_outputs
|
|
color: .5, .5, .5, .5
|
|
data: ''
|
|
tab: outputs
|
|
on_enter: root.activate_screen_outputs(self)
|
|
|
|
# define the tab headers here
|
|
CarouselHeader:
|
|
id: screen_details
|
|
slide: 0
|
|
CarouselHeader:
|
|
id: transaction_id
|
|
slide: 1
|
|
CarouselHeader:
|
|
id: inputs
|
|
slide: 2
|
|
CarouselHeader:
|
|
id: outputs
|
|
slide: 3
|
|
|
|
<RecentActivityScrOutputs@GridView>
|
|
pos_hint:{'top': 1}
|
|
size_hint_y: .9
|
|
headers: [_('Address'), _('Amount')]
|
|
widths:[root.width*.63, root.width*.36]
|
|
|
|
<RecentActivityScrInputs@GridView>
|
|
pos_hint:{'top': 1}
|
|
size_hint_y: .9
|
|
headers: [_('Address'), _('Previous output')]
|
|
widths:[root.width*.63, root.width*.36]
|
|
|
|
<RecentActivityScrTransID@GridLayout>
|
|
cols: 1
|
|
padding: '5dp'
|
|
spacing: '2dp'
|
|
text_color: 1, 1, 1
|
|
tx_hash: None
|
|
carousel_content: None
|
|
CardLabel:
|
|
color: root.text_color
|
|
font_size: '13dp'
|
|
text: _('Transaction ID :')
|
|
ELTextInput:
|
|
readonly: True
|
|
text: root.tx_hash if root.tx_hash else ''
|
|
size_hint_y: None
|
|
height: '30dp'
|
|
BoxLayout:
|
|
padding: 0, '9pt', 0, 0
|
|
orientation: 'vertical'
|
|
spacing: '5dp'
|
|
DialogButton:
|
|
background_color:
|
|
(.191, .496, .742, 1) if self.state == 'normal'\
|
|
else (.933, .933, .933, 1)
|
|
color:
|
|
(1, 1, 1, 1) if self.state == 'normal'\
|
|
else (.218, .218, .218, 1)
|
|
text: 'Inputs >>'
|
|
size_hint_y: None
|
|
height: '38dp'
|
|
on_release:
|
|
root.carousel_content.carousel.load_next()
|
|
DialogButton:
|
|
text: 'Outputs >>>'
|
|
background_color:
|
|
(.191, .496, .742, 1) if self.state == 'normal'\
|
|
else (.933, .933, .933, 1)
|
|
color:
|
|
(1, 1, 1, 1) if self.state == 'normal'\
|
|
else (.218, .218, .218, 1)
|
|
size_hint_y: None
|
|
height: '38dp'
|
|
on_release:
|
|
carousel = root.carousel_content.carousel
|
|
carousel.load_slide(carousel.slides[3])
|
|
Widget
|
|
|
|
|
|
################################
|
|
## Cards (under Dashboard)
|
|
################################
|
|
|
|
<Card@GridLayout>
|
|
cols: 1
|
|
padding: '12dp' , '22dp', '12dp' , '12dp'
|
|
spacing: '12dp'
|
|
size_hint: 1, None
|
|
height: max(100, self.minimum_height)
|
|
canvas.before:
|
|
Color:
|
|
rgba: 1, 1, 1, 1
|
|
BorderImage:
|
|
border: 18, 18, 18, 18
|
|
source: 'atlas://gui/kivy/theming/light/card'
|
|
size: self.size
|
|
pos: self.pos
|
|
|
|
<CardLabel@Label>
|
|
color: 0.45, 0.45, 0.45, 1
|
|
size_hint: 1, None
|
|
text: ''
|
|
text_size: self.width, None
|
|
height: self.texture_size[1]
|
|
halign: 'left'
|
|
valign: 'top'
|
|
|
|
<CardButton@Button>
|
|
background_normal: 'atlas://gui/kivy/theming/light/card_btn'
|
|
bold: True
|
|
font_size: '10sp'
|
|
color: 0.699, 0.699, 0.699, 1
|
|
size_hint: None, None
|
|
size: self.texture_size[0] + dp(32), self.texture_size[1] + dp(7)
|
|
|
|
<CardSeparator@Widget>
|
|
size_hint: 1, None
|
|
height: dp(1)
|
|
color: .909, .909, .909, 1
|
|
canvas:
|
|
Color:
|
|
rgba: root.color if root.color else (0, 0, 0, 0)
|
|
Rectangle:
|
|
size: self.size
|
|
pos: self.pos
|
|
|
|
<CardItem@ButtonBehavior+GridLayout>
|
|
canvas.before:
|
|
Color:
|
|
rgba: 0.192, .498, 0.745, 1 if self.state == 'down' else 0
|
|
Rectangle
|
|
size: self.size
|
|
pos: self.x, self.y + dp(5)
|
|
cols: 1
|
|
padding: '2dp', '2dp'
|
|
spacing: '2dp'
|
|
size_hint: 1, None
|
|
height: self.minimum_height
|
|
|
|
<RecentActivityItem@CardItem>
|
|
icon: 'atlas://gui/kivy/theming/light/important'
|
|
address:'no address set'
|
|
amount: '+0.00'
|
|
balance: 'xyz'# balance_after
|
|
amount_color: '#DB3627' if float(self.amount) < 0 else '#2EA442'
|
|
confirmations: 0
|
|
date: '0/0/0'
|
|
quote_text: '.'
|
|
|
|
spacing: '9dp'
|
|
on_release:
|
|
dash = app.root.main_screen.ids.tabs.ids.screen_dashboard
|
|
dash.show_tx_details(root)
|
|
BoxLayout:
|
|
size_hint: 1, None
|
|
spacing: '8dp'
|
|
height: '32dp'
|
|
Image:
|
|
id: icon
|
|
source: root.icon
|
|
size_hint: None, 1
|
|
width: self.height *.54
|
|
mipmap: True
|
|
BoxLayout:
|
|
orientation: 'vertical'
|
|
Widget
|
|
CardLabel:
|
|
shorten: True
|
|
text: root.address
|
|
markup: False
|
|
text_size: self.size
|
|
CardLabel:
|
|
color: .699, .699, .699, 1
|
|
text: root.date
|
|
font_size: '12sp'
|
|
Widget
|
|
CardLabel:
|
|
halign: 'right'
|
|
font_size: '13sp'
|
|
size_hint: None, 1
|
|
width: '90sp'
|
|
markup: True
|
|
font_name: font_light
|
|
text:
|
|
u'[color={amount_color}]{sign}{symbol}{amount}[/color]\n'\
|
|
u'[color=#B2B3B3][size=12sp]{qt}[/size]'\
|
|
u'[/color]'.format(amount_color=root.amount_color,\
|
|
amount=root.amount[1:], qt=root.quote_text, sign=root.amount[0],\
|
|
symbol=btc_symbol if app.base_unit == 'BTC' else mbtc_symbol)
|
|
CardSeparator
|
|
|
|
<CardRecentActivity@Card>
|
|
BoxLayout:
|
|
size_hint: 1, None
|
|
height: lbl.height
|
|
CardLabel:
|
|
id: lbl
|
|
text: _('RECENT ACTIVITY')
|
|
CardButton:
|
|
id: btn_see_all
|
|
disabled: True if not self.opacity else False
|
|
text: _('SEE ALL')
|
|
font_size: '12sp'
|
|
on_release: app.update_history_tab(see_all=True)
|
|
GridLayout:
|
|
id: content
|
|
spacing: '7dp'
|
|
cols: 1
|
|
size_hint: 1, None
|
|
height: self.minimum_height
|
|
CardSeparator
|
|
|
|
<CardPaymentRequest@Card>
|
|
CardLabel:
|
|
text: _('PAYMENT REQUEST')
|
|
CardSeparator:
|
|
|
|
<CardStatusInfo@Card>
|
|
padding: '12dp' , '12dp'
|
|
status: app.status
|
|
quote_text: ''
|
|
unconfirmed: ''
|
|
cols: 2
|
|
FloatLayout
|
|
anchor_x: 'left'
|
|
size_hint: 1, None
|
|
height: '82dp'
|
|
IconButton:
|
|
mipmap: True
|
|
pos_hint: {'x': 0, 'center_y': .45}
|
|
color: .90, .90, .90, 1
|
|
source: 'atlas://gui/kivy/theming/light/qrcode'
|
|
size_hint: None, .85
|
|
width: self.height
|
|
on_release:
|
|
dlg = Cache.get('electrum_widgets', 'WalletAddressesDialog')
|
|
|
|
if not dlg:\
|
|
Factory.register('WalletAddressesDialog', module='electrum_gui.kivy.uix.dialogs.carousel_dialog');\
|
|
dlg = Factory.WalletAddressesDialog();\
|
|
Cache.append('electrum_widgets', 'WalletAddressesDialog', dlg)
|
|
|
|
dlg.open()
|
|
CardLabel:
|
|
id: top_label
|
|
halign: 'right'
|
|
valign: 'top'
|
|
bold: True
|
|
pos_hint: {'top': 1, 'right': 1}
|
|
font_name: font_light
|
|
balance_in_numbers: bool(ord(root.status[0]) not in range(ord('A'), ord('z')))
|
|
font_size: '50sp' if self.balance_in_numbers else '30sp'
|
|
text_size: self.width, root.height/2
|
|
text:
|
|
u'[color=#4E4F4F]{}{}[/color]'\
|
|
.format('' if not self.balance_in_numbers else\
|
|
(btc_symbol if app.base_unit == 'BTC' else mbtc_symbol), root.status)
|
|
BoxLayout
|
|
pos_hint: {'y': 0, 'right': 1}
|
|
spacing: '5dp'
|
|
CardLabel
|
|
halign: 'right'
|
|
markup: True
|
|
font_size: '22dp'
|
|
font_name: font_light
|
|
text: u'[color=#c3c3c3]{}[/color]'.format(root.quote_text)
|
|
IconButton
|
|
color: .698, .698, .698, 1
|
|
source: 'atlas://gui/kivy/theming/light/gear'
|
|
size_hint_y: None
|
|
height: '28dp'
|
|
opacity: .5 if self.state == 'down' else 1
|
|
on_release:
|
|
dlg = Cache.get('electrum_widgets', 'CurrencySelectionDialog')
|
|
|
|
if not dlg:\
|
|
Factory.register('SelectionDialog', module='electrum_gui.kivy.uix.dialogs');\
|
|
dlg = Factory.CurrencySelectionDialog();\
|
|
Cache.append('electrum_widgets', 'CurrencySelectionDialog', dlg)
|
|
|
|
dlg.open()
|
|
|
|
<ActionDropDown>
|
|
auto_width: False
|
|
on_size: if not self.auto_width: self.width = dp(190)
|
|
on_container: self.container.padding = '4dp', '4dp', '4dp', '4dp'
|
|
on_parent:
|
|
if args[1]:\
|
|
self.opacity = 0;\
|
|
anim = Factory.Animation(opacity=1, d=.25);\
|
|
anim.start(self)
|
|
canvas.before:
|
|
Color:
|
|
rgba: 1, 1, 1, 1
|
|
BorderImage:
|
|
pos:self.pos
|
|
border: 20, 20, 20, 20
|
|
source: 'atlas://gui/kivy/theming/light/overflow_background'
|
|
size: self.size
|
|
|
|
<ActionItem>
|
|
color: 0.235, 0.239, 0.239, 1
|
|
|
|
<ActionButton>:
|
|
border: 4, 0, 0, 0
|
|
background_down: 'atlas://gui/kivy/theming/light/overflow_btn_dn'
|
|
|
|
<OverflowButton@ActionButton>
|
|
text_size: dp(172), None
|
|
last: False
|
|
halign: 'left'
|
|
valign: 'middle'
|
|
overflow: None
|
|
background_normal:
|
|
'atlas://gui/kivy/theming/light/' +\
|
|
('action_button_group'\
|
|
if (self.inside_group and not self.last) else 'tab_btn')
|
|
on_press:
|
|
ddn = self.overflow._dropdown
|
|
Factory.Animation.cancel_all(ddn)
|
|
anim = Factory.Animation(opacity=0, d=.25)
|
|
anim.bind(on_complete=ddn.dismiss)
|
|
anim.start(ddn)
|
|
|
|
<DashboardActionView@ActionView>
|
|
WalletActionPrevious:
|
|
id: action_previous
|
|
size_hint_x: None
|
|
width: action_preferences.width + action_contact.width
|
|
ActionButton:
|
|
id: action_logo
|
|
important: True
|
|
pos_hint: {'center_y': .5}
|
|
size_hint: 1, .93
|
|
bold: True
|
|
icon: 'atlas://gui/kivy/theming/light/logo'
|
|
background_down: self.background_normal
|
|
minimum_width: '1dp'
|
|
ActionButton:
|
|
id: action_contact
|
|
important: True
|
|
width: '25dp'
|
|
icon: 'atlas://gui/kivy/theming/light/add_contact'
|
|
text: 'Add Contact'
|
|
on_release:
|
|
Factory.register('NewContactDialog', module='electrum_gui.kivy.uix.dialogs.new_contact')
|
|
dlg = Factory.NewContactDialog().open()
|
|
|
|
ActionOverflow:
|
|
id: action_preferences
|
|
background_down: 'atlas://gui/kivy/theming/light/overflow_btn_dn'
|
|
border: 0, 0, 0, 0
|
|
overflow_image: 'atlas://gui/kivy/theming/light/settings'
|
|
width: '40dp'
|
|
size_hint_x: None
|
|
canvas.after:
|
|
Color:
|
|
rgba: 1, 1, 1, 1
|
|
OverflowButton:
|
|
text: _('Settings')
|
|
overflow: action_preferences
|
|
OverflowButton:
|
|
text: _('Help')
|
|
last: True
|
|
overflow: action_preferences
|
|
|
|
<ScreenDashboard>
|
|
name: 'dashboard'
|
|
action_view: Factory.DashboardActionView()
|
|
content: content
|
|
ScrollView:
|
|
id: content
|
|
do_scroll_x: False
|
|
GridLayout
|
|
id: grid
|
|
cols: 1 #if root.width < root.height else 2
|
|
size_hint: 1, None
|
|
height: self.minimum_height
|
|
padding: '12dp'
|
|
spacing: '12dp'
|
|
GridLayout:
|
|
cols: 1
|
|
size_hint: 1, None
|
|
height: self.minimum_height
|
|
spacing: '12dp'
|
|
orientation: 'vertical'
|
|
CardStatusInfo:
|
|
id: status_card
|
|
CardPaymentRequest:
|
|
id: payment_card
|
|
CardRecentActivity:
|
|
id: recent_activity_card
|
|
|
|
|
|
<CleanHeader@TabbedPanelHeader>
|
|
border: 0, 0, 4, 0
|
|
markup: False
|
|
color: (.188, 0.505, 0.854, 1) if self.state == 'down' else (0.636, 0.636, 0.636, 1)
|
|
text_size: self.size
|
|
halign: 'center'
|
|
valign: 'middle'
|
|
bold: True
|
|
font_size: '12.5sp'
|
|
background_normal: 'atlas://gui/kivy/theming/light/tab_btn'
|
|
background_disabled_normal: 'atlas://gui/kivy/theming/light/tab_btn_disabled'
|
|
background_down: 'atlas://gui/kivy/theming/light/tab_btn_pressed'
|
|
canvas.before:
|
|
Color:
|
|
rgba: 1, 1, 1, .7
|
|
Rectangle:
|
|
size: self.size
|
|
pos: self.x + 1, self.y - 1
|
|
texture: self.texture
|
|
|
|
<ScreenTabs@Screen>
|
|
TabbedCarousel:
|
|
id: panel
|
|
tab_height: '48dp'
|
|
background_image: 'atlas://gui/kivy/theming/light/tab'
|
|
strip_image: 'atlas://gui/kivy/theming/light/tab_strip'
|
|
strip_border: dp(4), 0, dp(2), 0
|
|
ScreenDashboard:
|
|
id: screen_dashboard
|
|
tab: tab_dashboard
|
|
ScreenSend:
|
|
id: screen_send
|
|
tab: tab_send
|
|
ScreenReceive:
|
|
id: screen_receive
|
|
tab: tab_receive
|
|
ScreenContacts:
|
|
id: screen_contacts
|
|
tab: tab_contacts
|
|
CleanHeader:
|
|
id: tab_dashboard
|
|
text: _('DASHBOARD')
|
|
slide: 0
|
|
CleanHeader:
|
|
id: tab_send
|
|
text: _('SEND')
|
|
slide: 1
|
|
CleanHeader:
|
|
id: tab_receive
|
|
text: _('RECEIVE')
|
|
slide: 2
|
|
CleanHeader:
|
|
id: tab_contacts
|
|
text: _('CONTACTS')
|
|
slide: 3
|
|
|
|
<MainScreen>
|
|
name: 'main_screen'
|
|
canvas.before:
|
|
Color:
|
|
rgba: 0.917, 0.917, 0.917, 1
|
|
Rectangle:
|
|
size: self.size
|
|
pos: self.pos
|
|
BoxLayout:
|
|
orientation: 'vertical'
|
|
ActionBar:
|
|
id: action_bar
|
|
size_hint: 1, None
|
|
height: '48dp'
|
|
border: 4, 4, 4, 4
|
|
background_image: 'atlas://gui/kivy/theming/light/action_bar'
|
|
ScreenManager:
|
|
id: manager
|
|
ScreenTabs:
|
|
id: tabs
|
|
name: "tabs"
|
|
#ScreenPassword:
|
|
# id: password
|
|
# name: 'password
|
|
|
|
<Drawer>
|
|
#overlay_widget: overlay_widget
|
|
RelativeLayout:
|
|
id: hidden_widget
|
|
size_hint: None, None
|
|
width:
|
|
(root.width * .877) if app.ui_mode[0] == 'p'\
|
|
else root.width * .35 if app.orientation[0] == 'l'\
|
|
else root.width * .10
|
|
height: root.height
|
|
canvas.before:
|
|
Color:
|
|
rgba: .176, .176, .176, 1
|
|
Rectangle:
|
|
size: self.size
|
|
pos: self.pos
|
|
Color
|
|
rgba: 1, 1, 1, 1
|
|
BorderImage
|
|
border: 0, 32, 0, 0
|
|
source: 'atlas://gui/kivy/theming/light/shadow_right'
|
|
size: root.overlay_widget.x if root.overlay_widget else self.width, self.height
|
|
RelativeLayout:
|
|
id: overlay_widget
|
|
size_hint: None, None
|
|
x: hidden_widget.width if app.ui_mode[0] == 't' else 0
|
|
size_hint: None, None
|
|
width: (root.width - self.x) if app.ui_mode[0] == 't' else root.width
|
|
height: root.height
|
|
|
|
#######################################################
|
|
## This is our child of the root widget of the app
|
|
#######################################################
|
|
Drawer
|
|
size_hint: None, None
|
|
size: Window.size
|
|
WalletManagement
|
|
id: wallet_management
|
|
ScreenManager:
|
|
# Screen manager for screens meant to change everything including
|
|
# ActionBar, currently we only have the main screen here.
|
|
id: manager
|
|
MainScreen
|