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