electrum

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

main.kv (12108B)


      1 #:import Clock kivy.clock.Clock
      2 #:import Window kivy.core.window.Window
      3 #:import Factory kivy.factory.Factory
      4 #:import _ electrum.gui.kivy.i18n._
      5 #:import KIVY_GUI_PATH electrum.gui.kivy.KIVY_GUI_PATH
      6 
      7 
      8 ###########################
      9 #     Global Defaults
     10 ###########################
     11 
     12 <Label>
     13     markup: True
     14     font_name: 'Roboto'
     15     font_size: '16sp'
     16     bound: False
     17     on_text: if isinstance(self.text, _) and not self.bound: self.bound=True; _.bind(self)
     18 
     19 <TextInput>
     20     on_focus: app._focused_widget = root
     21     font_size: '18sp'
     22 
     23 <Button>
     24     on_parent: self.MIN_STATE_TIME = 0.1
     25 
     26 <ListItemButton>
     27     font_size: '12sp'
     28 
     29 <Carousel>:
     30     canvas.before:
     31         Color:
     32             rgba: 0.1, 0.1, 0.1, 1
     33         Rectangle:
     34             size: self.size
     35             pos: self.pos
     36 
     37 <ActionView>:
     38     canvas.before:
     39         Color:
     40             rgba: 0.1, 0.1, 0.1, 1
     41         Rectangle:
     42             size: self.size
     43             pos: self.pos
     44 
     45 
     46 # Custom Global Widgets
     47 
     48 <TopLabel>
     49     size_hint_y: None
     50     text_size: self.width, None
     51     height: self.texture_size[1]
     52 
     53 <VGridLayout@GridLayout>:
     54     rows: 1
     55     size_hint: 1, None
     56     height: self.minimum_height
     57 
     58 
     59 
     60 <IconButton@Button>:
     61     icon: ''
     62     icon_size: '30dp'
     63     AnchorLayout:
     64         pos: self.parent.pos
     65         size: self.parent.size
     66         orientation: 'lr-tb'
     67         Image:
     68             source: self.parent.parent.icon
     69             size_hint_x: None
     70             size: root.icon_size, root.icon_size
     71 
     72             
     73 <BackgroundColor@Widget>
     74     background_color: 0, 0, 0, 1
     75     canvas.before:
     76         Color:
     77             rgba: root.background_color
     78         Rectangle:
     79             size: self.size
     80             pos: self.pos
     81 <BackgroundTopLabel@TopLabel+BackgroundColor>
     82     background_color: 0, 0, 0, 1
     83 
     84 
     85 #########################
     86 #       Dialogs
     87 #########################
     88 <BoxLabel@BoxLayout>
     89     text: ''
     90     value: ''
     91     size_hint_y: None
     92     height: max(lbl1.height, lbl2.height)
     93     TopLabel
     94         id: lbl1
     95         text: root.text
     96         pos_hint: {'top':1}
     97     TopLabel
     98         id: lbl2
     99         text: root.value
    100 
    101 <OutputItem>
    102     address: ''
    103     value: ''
    104     background_color: 0, 0, 0, 1
    105     color: 1, 1, 1, 1
    106     size_hint_y: None
    107     height: max(lbl1.height, lbl2.height)
    108     BackgroundTopLabel
    109         id: lbl1
    110         text: '[ref=%s]%s[/ref]'%(root.address, root.address)
    111         color: root.color
    112         background_color: root.background_color 
    113         font_size: '6pt'
    114         shorten: True
    115         size_hint_x: 0.65
    116         on_ref_press:
    117             app._clipboard.copy(root.address)
    118             app.show_info(_('Address copied to clipboard') + ' ' + root.address)
    119     TopLabel
    120         id: lbl2
    121         text: root.value
    122         font_size: '6pt'
    123         size_hint_x: 0.35
    124         halign: 'right'
    125 
    126 
    127 <OutputList>
    128     viewclass: 'OutputItem'
    129     size_hint: 1, None
    130     height: min(output_list_layout.minimum_height, dp(144))
    131     scroll_type: ['bars', 'content']
    132     bar_width: dp(15)
    133     RecycleBoxLayout:
    134         orientation: 'vertical'
    135         default_size: None, pt(6)
    136         default_size_hint: 1, None
    137         size_hint: 1, None
    138         height: self.minimum_height
    139         id: output_list_layout
    140         spacing: '10dp'
    141         padding: '10dp'
    142         canvas.before:
    143             Color:
    144                 rgb: .3, .3, .3
    145             Rectangle:
    146                 size: self.size
    147                 pos: self.pos
    148 
    149 <RefLabel>
    150     font_size: '6pt'
    151     name: ''
    152     data: ''
    153     visible: True
    154     opacity: 1 if self.visible else 0
    155     disabled: not self.visible
    156     text: self.data if self.data else _('Tap to show')
    157     touched: False
    158     padding: '10dp', '10dp'
    159     background_color: .3, .3, .3, 1
    160     show_text_with_qr: True
    161     touch_callback: lambda: app.on_ref_label(self, show_text_with_qr=self.show_text_with_qr)
    162     on_touch_down:
    163         touch = args[1]
    164         touched = bool(self.collide_point(*touch.pos))
    165         if touched: self.touch_callback()
    166         if touched: self.touched = True
    167     canvas.before:
    168         Color:
    169             rgba: root.background_color
    170         Rectangle:
    171             size: self.size
    172             pos: self.pos
    173 
    174 <TxHashLabel@RefLabel>
    175     data: ''
    176     text: ' '.join(map(''.join, zip(*[iter(self.data)]*4))) if self.data else ''
    177 
    178 <InfoBubble>
    179     size_hint: None, None
    180     width: '270dp' if root.fs else min(self.width, dp(270))
    181     height: self.width if self.fs else (lbl.texture_size[1] + dp(27))
    182     BoxLayout:
    183         padding: '5dp' if root.fs else 0
    184         Widget:
    185             size_hint: None, 1
    186             width: '4dp' if root.fs else '2dp'
    187         Image:
    188             id: img
    189             source: root.icon
    190             mipmap: True
    191             size_hint: None, 1
    192             width: (root.width - dp(20)) if root.fs  else (0 if not root.icon else '32dp')
    193         Widget:
    194             size_hint_x: None
    195             width: '5dp'
    196         Label:
    197             id: lbl
    198             markup: True
    199             font_size: '12sp'
    200             text: root.message
    201             text_size: self.width, None
    202             valign: 'middle'
    203             size_hint: 1, 1
    204             width: 0 if root.fs else (root.width - img.width)
    205 
    206 
    207 <SendReceiveBlueBottom@GridLayout>
    208     item_height: dp(42)
    209     foreground_color: .843, .914, .972, 1
    210     cols: 1
    211     padding: '12dp', 0
    212     canvas.before:
    213         Color:
    214             rgba: 0.192, .498, 0.745, 1
    215         BorderImage:
    216             source: f'atlas://{KIVY_GUI_PATH}/theming/light/card_bottom'
    217             size: self.size
    218             pos: self.pos
    219 
    220 
    221 <AddressFilter@GridLayout>
    222 	item_height: dp(42)
    223 	item_width: dp(60)
    224 	foreground_color: .843, .914, .972, 1
    225 	cols: 1
    226 	canvas.before:
    227 		Color:
    228 			rgba: 0.192, .498, 0.745, 1
    229 		BorderImage:
    230 			source: f'atlas://{KIVY_GUI_PATH}/theming/light/card_bottom'
    231 			size: self.size
    232 			pos: self.pos
    233 
    234 <SearchBox@GridLayout>
    235 	item_height: dp(42)
    236 	foreground_color: .843, .914, .972, 1
    237 	cols: 1
    238 	padding: '12dp', 0
    239 	canvas.before:
    240 		Color:
    241 			rgba: 0.192, .498, 0.745, 1
    242         BorderImage:
    243             source: f'atlas://{KIVY_GUI_PATH}/theming/light/card_bottom'
    244             size: self.size
    245             pos: self.pos
    246 
    247 <CardSeparator@Widget>
    248     size_hint: 1, None
    249     height: dp(1)
    250     color: .909, .909, .909, 1
    251     canvas:
    252         Color:
    253             rgba: root.color if root.color else (0, 0, 0, 0)
    254         Rectangle:
    255             size: self.size
    256             pos: self.pos
    257 
    258 <CardItem@ButtonBehavior+BoxLayout>
    259     size_hint: 1, None
    260     height: '65dp'
    261     group: 'requests'
    262     padding: dp(12)
    263     spacing: dp(5)
    264     screen: None
    265     on_release: self.screen.show_item(args[0])
    266     canvas.before:
    267         Color:
    268             rgba: (0.192, .498, 0.745, 1) if self.state == 'down' else (0.15, 0.15, 0.17, 1)
    269         Rectangle:
    270             size: self.size
    271             pos: self.pos
    272 
    273 <BlueButton@Button>:
    274     background_color: 1, .585, .878, 0
    275     halign: 'left'
    276     text_size: (self.width-10, None)
    277     size_hint: 0.5, None
    278     default_text: ''
    279     text: self.default_text
    280     padding: '5dp', '5dp'
    281     height: '40dp'
    282     text_color: self.foreground_color
    283     disabled_color: 1, 1, 1, 1
    284     foreground_color: 1, 1, 1, 1
    285     canvas.before:
    286         Color:
    287             rgba: (0.9, .498, 0.745, 1) if self.state == 'down' else self.background_color
    288         Rectangle:
    289             size: self.size
    290             pos: self.pos
    291 
    292 
    293 <KButton@Button>:
    294     size_hint: 1, None
    295     height: '60dp'
    296     font_size: '30dp'
    297     on_release:
    298         self.parent.update_amount(self.text)
    299 
    300 
    301 <StripLayout>
    302     padding: 0, 0, 0, 0
    303 
    304 <TabbedPanelStrip>:
    305     on_parent:
    306         if self.parent: self.parent.bar_width = 0
    307         if self.parent: self.parent.scroll_x = 0.5
    308 
    309 
    310 <TabbedCarousel>
    311     carousel: carousel
    312     do_default_tab: False
    313     Carousel:
    314         anim_type: 'out_quart'
    315         min_move: .05
    316         anim_move_duration: .1
    317         anim_cancel_duration: .54
    318         on_index: root.on_index(*args)
    319         id: carousel
    320 
    321 
    322 
    323 <CleanHeader@TabbedPanelHeader>
    324     border: 16, 0, 16, 0
    325     markup: False
    326     text_size: self.size
    327     halign: 'center'
    328     valign: 'middle'
    329     bold: True
    330     font_size: '12.5sp'
    331     background_normal: f'atlas://{KIVY_GUI_PATH}/theming/light/tab_btn'
    332     background_down: f'atlas://{KIVY_GUI_PATH}/theming/light/tab_btn_pressed'
    333 
    334 
    335 <ColoredLabel@Label>:
    336     font_size: '48sp'
    337     color: (.6, .6, .6, 1)
    338     canvas.before:
    339         Color:
    340             rgb: (.9, .9, .9)
    341         Rectangle:
    342             pos: self.x + sp(2), self.y + sp(2)
    343             size: self.width - sp(4), self.height - sp(4)
    344 
    345 
    346 <SettingsItem@ButtonBehavior+BoxLayout>
    347     orientation: 'vertical'
    348     title: ''
    349     description: ''
    350     size_hint: 1, None
    351     height: '60dp'
    352     action: lambda x: None
    353     canvas.before:
    354         Color:
    355             rgba: (0.192, .498, 0.745, 1) if self.state == 'down' else (0.3, 0.3, 0.3, 0)
    356         Rectangle:
    357             size: self.size
    358             pos: self.pos
    359     on_release:
    360         Clock.schedule_once(self.action)
    361     Widget
    362     TopLabel:
    363         id: title
    364         text: self.parent.title
    365         bold: True
    366         halign: 'left'
    367     TopLabel:
    368         text: self.parent.description
    369         color: 0.8, 0.8, 0.8, 1
    370         halign: 'left'
    371     Widget
    372 
    373 
    374 
    375 
    376 <ScreenTabs@Screen>
    377     TabbedCarousel:
    378         id: panel
    379         tab_height: '48dp'
    380         tab_width: panel.width/3
    381         strip_border: 0, 0, 0, 0
    382         SendScreen:
    383             id: send_screen
    384             tab: send_tab
    385         HistoryScreen:
    386             id: history_screen
    387             tab: history_tab
    388         ReceiveScreen:
    389             id: receive_screen
    390             tab: receive_tab
    391         CleanHeader:
    392             id: send_tab
    393             text: _('Send')
    394             slide: 0
    395         CleanHeader:
    396             id: history_tab
    397             text: _('History')
    398             slide: 1
    399         CleanHeader:
    400             id: receive_tab
    401             text: _('Receive')
    402             slide: 2
    403 
    404 
    405 <ActionOvrButton@ActionButton>
    406     #on_release:
    407         # fixme: the following line was commented out because it does not seem to do what it is intended
    408         # Clock.schedule_once(lambda dt: self.parent.parent.dismiss() if self.parent else None, 0.05)
    409     on_press:
    410         Clock.schedule_once(lambda dt: app.popup_dialog(self.name), 0.05)
    411         self.state = 'normal'
    412 
    413 
    414 BoxLayout:
    415     orientation: 'vertical'
    416 
    417     canvas.before:
    418         Color:
    419             rgb: .6, .6, .6
    420         Rectangle:
    421             size: self.size
    422             source: f'{KIVY_GUI_PATH}/data/background.png'
    423 
    424     ActionBar:
    425 
    426         ActionView:
    427             id: av
    428             ActionPrevious:
    429                 with_previous: False
    430                 size_hint: None, None
    431                 size: 0, 0
    432 
    433             ActionButton:
    434                 size_hint_x: None
    435                 text: app.wallet_name
    436                 bold: True
    437                 color: 0.7, 0.7, 0.7, 1
    438                 font_size: '22dp'
    439                 on_release:
    440                     Clock.schedule_once(lambda dt: app.popup_dialog('status'), 0.05)
    441                     self.state = 'normal'
    442 
    443             ActionButton:
    444                 size_hint_x: 0.8
    445                 text: ''
    446                 opacity:0
    447 
    448             ActionOverflow:
    449                 id: ao
    450                 size_hint_x: 0.2
    451                 ActionOvrButton:
    452                     name: 'about'
    453                     text: _('About')
    454                 ActionOvrButton:
    455                     name: 'wallets'
    456                     text: _('Wallets')
    457                 ActionOvrButton:
    458                     name: 'network'
    459                     text: _('Network')
    460                 ActionOvrButton:
    461                     name: 'addresses_dialog'
    462                     text: _('Addresses')
    463                 ActionOvrButton:
    464                     name: 'lightning_channels_dialog'
    465                     text: _('Channels')
    466                 ActionOvrButton:
    467                     name: 'settings'
    468                     text: _('Settings')
    469                     on_parent:
    470                         # when widget overflow drop down is shown, adjust the width
    471                         parent = args[1]
    472                         if parent: ao._dropdown.width = sp(200)
    473 
    474     ScreenManager:
    475         id: manager
    476         ScreenTabs:
    477             id: tabs