#: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) 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() source: 'atlas://gui/kivy/theming/light/closebutton' opacity: 1 if self.state == 'normal' else .75 size_hint: None, None size: '27dp', '27dp' ####################### # Screen Contacts ####################### : 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) color: .305, .309, .309, 1 text_size: self.size halign: 'left' valign: 'middle' 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 background_normal: self.background_down background_down: 'atlas://gui/kivy/theming/light/tab_btn' size_hint_y: None height: '22dp' source: 'atlas://gui/kivy/theming/light/bit_logo' size_hint_x: None width: '32dp' 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: 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' 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') 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' 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' 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) 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: _('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: app.do_send() Widget 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 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 icon: 'atlas://gui/kivy/theming/light/globe' values: app.wallet.addresses() if app.wallet else [] text: _("Select Your address") icon: 'atlas://gui/kivy/theming/light/wallet' values: ('default Wallet',) text: _('Select your wallet') 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 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' 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 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) 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 ############################################### 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 Header Header Header padding: 0, 0, 0, 0 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 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...' background_color: .929, .929, .929 ,1 effects: [self.scrollflex] #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 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) 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) 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() 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) 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) 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) 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 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) 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 color: .698, .701, .701, 1 font_size: '14sp' text_size: self.width, None halign: 'left' size_hint_x: None width: '60dp' text_size: self.width, None font_size: '18sp' halign: 'left' color: .698, .701, .701, 1 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() 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 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.wallet.addressbook + 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 pos_hint:{'top': 1} size_hint_y: .9 headers: [_('Address'), _('Amount')] widths:[root.width*.63, root.width*.36] pos_hint:{'top': 1} size_hint_y: .9 headers: [_('Address'), _('Previous output')] widths:[root.width*.63, root.width*.36] 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) ################################ 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 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' 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) 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 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 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 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 CardLabel: text: _('PAYMENT REQUEST') CardSeparator: 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() 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 color: 0.235, 0.239, 0.239, 1 : border: 4, 0, 0, 0 background_down: 'atlas://gui/kivy/theming/light/overflow_btn_dn' 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) 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 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 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 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 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 #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