electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit 5e5f3202b10a65061b433c6bde55da5ee941c497
parent c55a253f6d8b659bacaac90ab4ea4ccb9fe7ab15
Author: ThomasV <thomasv@electrum.org>
Date:   Mon, 14 Dec 2015 14:27:39 +0100

kivy: move amount dialog

Diffstat:
Mgui/kivy/main_window.py | 23+++++++----------------
Agui/kivy/uix/dialogs/amount_dialog.py | 114+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dgui/kivy/uix/ui_screens/amount.kv | 97-------------------------------------------------------------------------------
Dgui/kivy/uix/ui_screens/mainscreen.kv | 1775-------------------------------------------------------------------------------
4 files changed, 121 insertions(+), 1888 deletions(-)

diff --git a/gui/kivy/main_window.py b/gui/kivy/main_window.py @@ -733,26 +733,17 @@ class ElectrumWindow(App): 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: - but_max.disabled = True - but_max.opacity = 0 - else: - but_max.disabled = False - but_max.opacity = 1 - + from uix.dialogs.amount_dialog import AmountDialog amount = screen.amount if amount: - a, u = str(amount).split() + amount, u = str(amount).split() assert u == self.base_unit - popup.ids.kb.amount = a - - def cb(): - o = popup.ids.a.btc_text - screen.amount = o + else: + amount = None - popup.on_dismiss = cb + def cb(amount): + screen.amount = amount + popup = AmountDialog(show_max, amount, cb) popup.open() def protected(self, f, args): diff --git a/gui/kivy/uix/dialogs/amount_dialog.py b/gui/kivy/uix/dialogs/amount_dialog.py @@ -0,0 +1,114 @@ +from kivy.app import App +from kivy.factory import Factory +from kivy.properties import ObjectProperty +from kivy.lang import Builder + + +Builder.load_string(''' +<AmountDialog@Popup> + id: popup + title: _('Amount') + AnchorLayout: + anchor_x: 'center' + BoxLayout: + orientation: 'vertical' + size_hint: 0.8, 1 + BoxLayout: + size_hint: 1, 1 + height: '48dp' + Label: + id: a + btc_text: (kb.amount + ' ' + app.base_unit) if kb.amount else '' + fiat_text: (kb.fiat_amount + ' ' + app.fiat_unit) if kb.fiat_amount else '' + text: ((self.fiat_text + ' / ' + self.btc_text if kb.is_fiat else self.btc_text + ' / ' + self.fiat_text) if app.fiat_unit else self.btc_text) if self.btc_text else '' + size_hint: 1, 1 + font_size: '22dp' + Widget: + size_hint: 1, 1 + GridLayout: + id: kb + amount: '' + fiat_amount: '' + is_fiat: False + on_fiat_amount: if self.is_fiat: self.amount = app.fiat_to_btc(self.fiat_amount) + on_amount: if not self.is_fiat: self.fiat_amount = app.btc_to_fiat(self.amount) + update_text: app.update_amount + size_hint: 1, None + height: '300dp' + cols: 3 + KButton: + text: '1' + KButton: + text: '2' + KButton: + text: '3' + KButton: + text: '4' + KButton: + text: '5' + KButton: + text: '6' + KButton: + text: '7' + KButton: + text: '8' + KButton: + text: '9' + KButton: + text: '.' + KButton: + text: '0' + KButton: + text: '<' + Button: + id: but_max + opacity: 1 if root.show_max else 0 + disabled: not root.show_max + size_hint: 1, None + height: '48dp' + text: 'Max' + on_release: + kb.is_fiat = False + kb.amount = app.get_max_amount() + Button: + id: button_fiat + size_hint: 1, None + height: '48dp' + text: (app.fiat_unit if kb.is_fiat else app.base_unit) if app.fiat_unit else '' + on_release: + app.toggle_fiat(kb) + Button: + size_hint: 1, None + height: '48dp' + text: 'Clear' + on_release: + kb.amount = '' + kb.fiat_amount = '' + Widget: + size_hint: 1, None + BoxLayout: + size_hint: 1, None + height: '48dp' + Widget: + size_hint: 2, None + height: '48dp' + Button: + size_hint: 1, None + height: '48dp' + text: _('OK') + on_release: + root.callback(a.btc_text) + popup.dismiss() +''') + +from kivy.properties import BooleanProperty + +class AmountDialog(Factory.Popup): + show_max = BooleanProperty(False) + def __init__(self, show_max, amount, cb): + Factory.Popup.__init__(self) + self.show_max = show_max + self.callback = cb + if amount: + self.ids.kb.amount = amount + diff --git a/gui/kivy/uix/ui_screens/amount.kv b/gui/kivy/uix/ui_screens/amount.kv @@ -1,97 +0,0 @@ -#:import Decimal decimal.Decimal - - -Popup: - id: popup - title: _('Amount') - - AnchorLayout: - anchor_x: 'center' - - BoxLayout: - orientation: 'vertical' - size_hint: 0.8, 1 - BoxLayout: - size_hint: 1, 1 - height: '48dp' - Label: - id: a - btc_text: (kb.amount + ' ' + app.base_unit) if kb.amount else '' - fiat_text: (kb.fiat_amount + ' ' + app.fiat_unit) if kb.fiat_amount else '' - text: ((self.fiat_text + ' / ' + self.btc_text if kb.is_fiat else self.btc_text + ' / ' + self.fiat_text) if app.fiat_unit else self.btc_text) if self.btc_text else '' - size_hint: 1, 1 - font_size: '22dp' - Widget: - size_hint: 1, 1 - GridLayout: - id: kb - amount: '' - fiat_amount: '' - is_fiat: False - on_fiat_amount: if self.is_fiat: self.amount = app.fiat_to_btc(self.fiat_amount) - on_amount: if not self.is_fiat: self.fiat_amount = app.btc_to_fiat(self.amount) - update_text: app.update_amount - size_hint: 1, None - height: '300dp' - cols: 3 - KButton: - text: '1' - KButton: - text: '2' - KButton: - text: '3' - KButton: - text: '4' - KButton: - text: '5' - KButton: - text: '6' - KButton: - text: '7' - KButton: - text: '8' - KButton: - text: '9' - KButton: - text: '.' - KButton: - text: '0' - KButton: - text: '<' - Button: - id: but_max - size_hint: 1, None - height: '48dp' - text: 'Max' - on_release: - kb.is_fiat = False - kb.amount = app.get_max_amount() - Button: - id: button_fiat - size_hint: 1, None - height: '48dp' - text: (app.fiat_unit if kb.is_fiat else app.base_unit) if app.fiat_unit else '' - on_release: - app.toggle_fiat(kb) - Button: - size_hint: 1, None - height: '48dp' - text: 'Clear' - on_release: - kb.amount = '' - kb.fiat_amount = '' - - Widget: - size_hint: 1, None - - BoxLayout: - size_hint: 1, None - height: '48dp' - Widget: - size_hint: 2, None - height: '48dp' - Button: - size_hint: 1, None - height: '48dp' - text: _('OK') - on_release: popup.dismiss() diff --git a/gui/kivy/uix/ui_screens/mainscreen.kv b/gui/kivy/uix/ui_screens/mainscreen.kv @@ -1,1774 +0,0 @@ -#: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- \ No newline at end of file