tstyle.kv - electrum - Electrum Bitcoin wallet
HTML git clone https://git.parazyd.org/electrum
DIR Log
DIR Files
DIR Refs
DIR Submodules
---
tstyle.kv (25528B)
---
1 #:kivy 1.0
2
3 <Label>:
4 canvas:
5 Color:
6 rgba: self.disabled_color if self.disabled else (self.color if not self.markup else (1, 1, 1, 1))
7 Rectangle:
8 texture: self.texture
9 size: self.texture_size
10 pos: int(self.center_x - self.texture_size[0] / 2.), int(self.center_y - self.texture_size[1] / 2.)
11
12 <-Button,-ToggleButton>:
13 state_image: self.background_normal if self.state == 'normal' else self.background_down
14 disabled_image: self.background_disabled_normal if self.state == 'normal' else self.background_disabled_down
15 canvas:
16 Color:
17 rgba: self.background_color
18 BorderImage:
19 border: self.border
20 pos: self.pos
21 size: self.size
22 source: self.disabled_image if self.disabled else self.state_image
23 Color:
24 rgba: self.disabled_color if self.disabled else self.color
25 Rectangle:
26 texture: self.texture
27 size: self.texture_size
28 pos: int(self.center_x - self.texture_size[0] / 2.), int(self.center_y - self.texture_size[1] / 2.)
29
30 <BubbleContent>
31 opacity: .7 if self.disabled else 1
32 rows: 1
33 canvas:
34 Color:
35 rgba: self.parent.background_color if self.parent else (1, 1, 1, 1)
36 BorderImage:
37 border: self.parent.border if self.parent else (16, 16, 16, 16)
38 texture: root.parent._bk_img.texture if root.parent else None
39 size: self.size
40 pos: self.pos
41
42 <BubbleButton>:
43 background_normal: 'atlas://data/images/defaulttheme/bubble_btn'
44 background_down: 'atlas://data/images/defaulttheme/bubble_btn_pressed'
45 background_disabled_normal: 'atlas://data/images/defaulttheme/bubble_btn'
46 background_disabled_down: 'atlas://data/images/defaulttheme/bubble_btn_pressed'
47 border: (0, 0, 0, 0)
48
49 <Slider>:
50 canvas:
51 Color:
52 rgb: 1, 1, 1
53 BorderImage:
54 border: (0, 18, 0, 18) if self.orientation == 'horizontal' else (18, 0, 18, 0)
55 pos: (self.x + self.padding, self.center_y - sp(18)) if self.orientation == 'horizontal' else (self.center_x - 18, self.y + self.padding)
56 size: (self.width - self.padding * 2, sp(36)) if self.orientation == 'horizontal' else (sp(36), self.height - self.padding * 2)
57 source: 'atlas://data/images/defaulttheme/slider{}_background{}'.format(self.orientation[0], '_disabled' if self.disabled else '')
58 Rectangle:
59 pos: (self.value_pos[0] - sp(16), self.center_y - sp(17)) if self.orientation == 'horizontal' else (self.center_x - (16), self.value_pos[1] - sp(16))
60 size: (sp(32), sp(32))
61 source: 'atlas://data/images/defaulttheme/slider_cursor{}'.format('_disabled' if self.disabled else '')
62
63 <RelativeLayout>:
64 canvas.before:
65 PushMatrix
66 Translate:
67 xy: self.pos
68 canvas.after:
69 PopMatrix
70
71 <Image,AsyncImage>:
72 canvas:
73 Color:
74 rgba: self.color
75 Rectangle:
76 texture: self.texture
77 size: self.norm_image_size
78 pos: self.center_x - self.norm_image_size[0] / 2., self.center_y - self.norm_image_size[1] / 2.
79
80 <TabbedPanelContent>
81 rows: 1
82 padding: 3
83 canvas:
84 Color:
85 rgba: self.parent.background_color if self.parent else (1, 1, 1, 1)
86 BorderImage:
87 border: self.parent.border if self.parent else (16, 16, 16, 16)
88 source: (root.parent.background_disabled_image if self.disabled else root.parent.background_image) if root.parent else None
89 size: self.size
90 pos: self.pos
91
92 <TabbedPanelStrip>
93 rows: 1
94
95 <StripLayout>
96 padding: '2dp', '2dp', '2dp', '2dp'
97 canvas.before:
98 BorderImage:
99 pos: self.pos
100 size: self.size
101 border: root.border
102 source: root.background_image
103
104 <TabbedPanelHeader>:
105 halign: 'center'
106 valign: 'middle'
107 background_normal: 'atlas://data/images/defaulttheme/tab_btn'
108 background_disabled_normal: 'atlas://data/images/defaulttheme/tab_btn_disabled'
109 background_down: 'atlas://data/images/defaulttheme/tab_btn_pressed'
110 background_disabled_down: 'atlas://data/images/defaulttheme/tab_btn_pressed'
111 border: (8, 8, 8, 8)
112 font_size: '15sp'
113
114 <Selector>
115 allow_stretch: True
116
117 <TextInput>:
118 canvas.before:
119 Color:
120 rgba: self.background_color
121 BorderImage:
122 border: self.border
123 pos: self.pos
124 size: self.size
125 source: (self.background_disabled_active if self.disabled else self.background_active) if self.focus else (self.background_disabled_normal if self.disabled else self.background_normal)
126 Color:
127 rgba: (self.cursor_color if self.focus and not self.cursor_blink else (0, 0, 0, 0))
128 Rectangle:
129 pos: [int(x) for x in self.cursor_pos]
130 size: 1, -self.line_height
131 Color:
132 rgba: self.disabled_foreground_color if self.disabled else (self.hint_text_color if not self.text and not self.focus else self.foreground_color)
133
134 <TextInputCutCopyPaste>:
135 but_cut: cut.__self__
136 but_copy: copy.__self__
137 but_paste: paste.__self__
138 but_selectall: selectall.__self__
139
140 size_hint: None, None
141 size: '150sp', '50sp'
142 BubbleButton:
143 id: cut
144 text: 'Cut'
145 on_release: root.do('cut')
146 BubbleButton:
147 id: copy
148 text: 'Copy'
149 on_release: root.do('copy')
150 BubbleButton:
151 id: paste
152 text: 'Paste'
153 on_release: root.do('paste')
154 BubbleButton:
155 id: selectall
156 text: 'Select All'
157 on_release: root.do('selectall')
158
159 <CodeInput>:
160 font_name: 'data/fonts/RobotoMono-Regular.ttf'
161
162
163 <TreeViewNode>:
164 canvas.before:
165 Color:
166 rgba: self.color_selected if self.is_selected else self.odd_color if self.odd else self.even_color
167 Rectangle:
168 pos: [self.parent.x, self.y] if self.parent else [0, 0]
169 size: [self.parent.width, self.height] if self.parent else [1, 1]
170 Color:
171 rgba: 1, 1, 1, int(not self.is_leaf)
172 Rectangle:
173 source: 'atlas://data/images/defaulttheme/tree_%s' % ('opened' if self.is_open else 'closed')
174 size: 16, 16
175 pos: self.x - 20, self.center_y - 8
176 canvas.after:
177 Color:
178 rgba: .5, .5, .5, .2
179 Line:
180 points: [self.parent.x, self.y, self.parent.right, self.y] if self.parent else []
181
182
183 <TreeViewLabel>:
184 width: self.texture_size[0]
185 height: max(self.texture_size[1] + dp(10), dp(24))
186 text_size: self.width, None
187
188
189 <StencilView>:
190 canvas.before:
191 StencilPush
192 Rectangle:
193 pos: self.pos
194 size: self.size
195 StencilUse
196
197 canvas.after:
198 StencilUnUse
199 Rectangle:
200 pos: self.pos
201 size: self.size
202 StencilPop
203
204
205 <FileChooserListLayout>:
206 on_entry_added: treeview.add_node(args[1])
207 on_entries_cleared: treeview.root.nodes = []
208 on_subentry_to_entry: not args[2].locked and treeview.add_node(args[1], args[2])
209 on_remove_subentry: args[2].nodes = []
210 BoxLayout:
211 pos: root.pos
212 size: root.size
213 size_hint: None, None
214 orientation: 'vertical'
215 BoxLayout:
216 size_hint_y: None
217 height: 30
218 orientation: 'horizontal'
219 Widget:
220 # Just for spacing
221 width: 10
222 size_hint_x: None
223 Label:
224 text: 'Name'
225 text_size: self.size
226 halign: 'left'
227 bold: True
228 Label:
229 text: 'Size'
230 text_size: self.size
231 size_hint_x: None
232 halign: 'right'
233 bold: True
234 Widget:
235 # Just for spacing
236 width: 10
237 size_hint_x: None
238 ScrollView:
239 id: scrollview
240 do_scroll_x: False
241 Scatter:
242 do_rotation: False
243 do_scale: False
244 do_translation: False
245 size: treeview.size
246 size_hint_y: None
247 TreeView:
248 id: treeview
249 hide_root: True
250 size_hint_y: None
251 width: scrollview.width
252 height: self.minimum_height
253 on_node_expand: root.controller.entry_subselect(args[1])
254 on_node_collapse: root.controller.close_subselection(args[1])
255
256 <FileChooserListView>:
257 layout: layout
258 FileChooserListLayout:
259 id: layout
260 controller: root
261
262 [FileListEntry@FloatLayout+TreeViewNode]:
263 locked: False
264 entries: []
265 path: ctx.path
266 # FIXME: is_selected is actually a read_only treeview property. In this
267 # case, however, we're doing this because treeview only has single-selection
268 # hardcoded in it. The fix to this would be to update treeview to allow
269 # multiple selection.
270 is_selected: self.path in ctx.controller().selection
271
272 orientation: 'horizontal'
273 size_hint_y: None
274 height: '48dp' if dp(1) > 1 else '24dp'
275 # Don't allow expansion of the ../ node
276 is_leaf: not ctx.isdir or ctx.name.endswith('..' + ctx.sep) or self.locked
277 on_touch_down: self.collide_point(*args[1].pos) and ctx.controller().entry_touched(self, args[1])
278 on_touch_up: self.collide_point(*args[1].pos) and ctx.controller().entry_released(self, args[1])
279 BoxLayout:
280 pos: root.pos
281 Label:
282 id: filename
283 text_size: self.width, None
284 halign: 'left'
285 shorten: True
286 text: ctx.name
287 Label:
288 text_size: self.width, None
289 size_hint_x: None
290 halign: 'right'
291 text: '{}'.format(ctx.get_nice_size())
292
293
294 <FileChooserIconLayout>:
295 on_entry_added: stacklayout.add_widget(args[1])
296 on_entries_cleared: stacklayout.clear_widgets()
297 ScrollView:
298 id: scrollview
299 pos: root.pos
300 size: root.size
301 size_hint: None, None
302 do_scroll_x: False
303 Scatter:
304 do_rotation: False
305 do_scale: False
306 do_translation: False
307 size_hint_y: None
308 height: stacklayout.height
309 StackLayout:
310 id: stacklayout
311 width: scrollview.width
312 size_hint_y: None
313 height: self.minimum_height
314 spacing: '10dp'
315 padding: '10dp'
316
317 <FileChooserIconView>:
318 layout: layout
319 FileChooserIconLayout:
320 id: layout
321 controller: root
322
323 [FileIconEntry@Widget]:
324 locked: False
325 path: ctx.path
326 selected: self.path in ctx.controller().selection
327 size_hint: None, None
328
329 on_touch_down: self.collide_point(*args[1].pos) and ctx.controller().entry_touched(self, args[1])
330 on_touch_up: self.collide_point(*args[1].pos) and ctx.controller().entry_released(self, args[1])
331 size: '100dp', '100dp'
332
333 canvas:
334 Color:
335 rgba: 1, 1, 1, 1 if self.selected else 0
336 BorderImage:
337 border: 8, 8, 8, 8
338 pos: root.pos
339 size: root.size
340 source: 'atlas://data/images/defaulttheme/filechooser_selected'
341
342 Image:
343 size: '48dp', '48dp'
344 source: 'atlas://data/images/defaulttheme/filechooser_%s' % ('folder' if ctx.isdir else 'file')
345 pos: root.x + dp(24), root.y + dp(40)
346 Label:
347 text: ctx.name
348 text_size: (root.width, self.height)
349 halign: 'center'
350 shorten: True
351 size: '100dp', '16dp'
352 pos: root.x, root.y + dp(16)
353
354 Label:
355 text: '{}'.format(ctx.get_nice_size())
356 font_size: '11sp'
357 color: .8, .8, .8, 1
358 size: '100dp', '16sp'
359 pos: root.pos
360 halign: 'center'
361
362 <FileChooserProgress>:
363 pos_hint: {'x': 0, 'y': 0}
364 canvas:
365 Color:
366 rgba: 0, 0, 0, .8
367 Rectangle:
368 pos: self.pos
369 size: self.size
370 Label:
371 pos_hint: {'x': .2, 'y': .6}
372 size_hint: .6, .2
373 text: 'Opening %s' % root.path
374 FloatLayout:
375 pos_hint: {'x': .2, 'y': .4}
376 size_hint: .6, .2
377 ProgressBar:
378 id: pb
379 pos_hint: {'x': 0, 'center_y': .5}
380 max: root.total
381 value: root.index
382 Label:
383 pos_hint: {'x': 0}
384 text: '%d / %d' % (root.index, root.total)
385 size_hint_y: None
386 height: self.texture_size[1]
387 y: pb.center_y - self.height - 8
388 font_size: '13sp'
389 color: (.8, .8, .8, .8)
390
391 AnchorLayout:
392 pos_hint: {'x': .2, 'y': .2}
393 size_hint: .6, .2
394
395 Button:
396 text: 'Cancel'
397 size_hint: None, None
398 size: 150, 44
399 on_release: root.cancel()
400
401
402
403 # Switch widget
404 <Switch>:
405 active_norm_pos: max(0., min(1., (int(self.active) + self.touch_distance / sp(41))))
406 canvas:
407 Color:
408 rgb: 1, 1, 1
409 Rectangle:
410 source: 'atlas://data/images/defaulttheme/switch-background{}'.format('_disabled' if self.disabled else '')
411 size: sp(83), sp(32)
412 pos: int(self.center_x - sp(41)), int(self.center_y - sp(16))
413 Rectangle:
414 source: 'atlas://data/images/defaulttheme/switch-button{}'.format('_disabled' if self.disabled else '')
415 size: sp(43), sp(32)
416 pos: int(self.center_x - sp(41) + self.active_norm_pos * sp(41)), int(self.center_y - sp(16))
417
418
419 # ModalView widget
420 <ModalView>:
421 canvas:
422 Color:
423 rgba: root.background_color[:3] + [root.background_color[-1] * self._anim_alpha]
424 Rectangle:
425 size: self._window.size if self._window else (0, 0)
426
427 Color:
428 rgb: 1, 1, 1
429 BorderImage:
430 source: root.background
431 border: root.border
432 pos: self.pos
433 size: self.size
434
435
436 # Popup widget
437 <Popup>:
438 _container: container
439 background_color: (0, 0, 0, 0.7)
440 GridLayout:
441 padding: '12dp'
442 cols: 1
443 size_hint: None, None
444 pos: root.pos
445 size: root.size
446
447 Label:
448 text: root.title
449 color: root.title_color
450 size_hint_y: None
451 height: self.texture_size[1] + dp(16)
452 text_size: self.width - dp(16), None
453 font_size: root.title_size
454 font_name: root.title_font
455 halign: root.title_align
456
457 Widget:
458 size_hint_y: None
459 height: dp(4)
460 canvas:
461 Color:
462 rgba: root.separator_color
463 Rectangle:
464 pos: self.x, self.y + root.separator_height / 2.
465 size: self.width, root.separator_height
466
467 BoxLayout:
468 id: container
469
470 # =============================================================================
471 # Spinner widget
472 # =============================================================================
473
474 <SpinnerOption>:
475 size_hint_y: None
476 height: '48dp'
477
478 <Spinner>:
479 background_normal: 'atlas://data/images/defaulttheme/spinner'
480 background_disabled_normal: 'atlas://data/images/defaulttheme/spinner_disabled'
481 background_down: 'atlas://data/images/defaulttheme/spinner_pressed'
482
483 # =============================================================================
484 # ActionBar widget
485 # =============================================================================
486
487 <ActionBar>:
488 height: '48dp'
489 size_hint_y: None
490 spacing: '4dp'
491 canvas:
492 Color:
493 rgba: self.background_color
494 BorderImage:
495 border: root.border
496 pos: self.pos
497 size: self.size
498 source: self.background_image
499
500 <ActionView>:
501 orientation: 'horizontal'
502 canvas:
503 Color:
504 rgba: self.background_color
505 BorderImage:
506 pos: self.pos
507 size: self.size
508 source: self.background_image
509
510 <ActionSeparator>:
511 size_hint_x: None
512 minimum_width: '2sp'
513 width: self.minimum_width
514 canvas:
515 Rectangle:
516 pos: self.x, self.y + sp(4)
517 size: self.width, self.height - sp(8)
518 source: self.background_image
519
520 <ActionButton,ActionToggleButton>:
521 background_normal: 'atlas://data/images/defaulttheme/' + ('action_bar' if self.inside_group else 'action_item')
522 background_down: 'atlas://data/images/defaulttheme/action_item_down'
523 size_hint_x: None if not root.inside_group else 1
524 width: [dp(48) if (root.icon and not root.inside_group) else max(dp(48), (self.texture_size[0] + dp(32))), self.size_hint_x][0]
525 color: self.color[:3] + [0 if (root.icon and not root.inside_group) else 1]
526
527 Image:
528 allow_stretch: True
529 opacity: 1 if (root.icon and not root.inside_group) else 0
530 source: root.icon
531 mipmap: root.mipmap
532 pos: root.x + dp(4), root.y + dp(4)
533 size: root.width - dp(8), root.height - sp(8)
534
535 <ActionLabel>:
536 size_hint_x: None if not root.inside_group else 1
537 width: self.texture_size[0] + dp(32)
538
539 <ActionGroup>:
540 size_hint_x: None
541 width: self.texture_size[0] + dp(32)
542
543 <ActionCheck>:
544 background_normal: 'atlas://data/images/defaulttheme/action_bar' if self.inside_group else 'atlas://data/images/defaulttheme/action_item'
545
546 <ActionPreviousImage@Image>:
547 temp_width: 0
548 temp_height: 0
549
550 <ActionPreviousButton@Button>:
551 background_normal: 'atlas://data/images/defaulttheme/action_item'
552 background_down: 'atlas://data/images/defaulttheme/action_item_down'
553
554 <ActionPrevious>:
555 size_hint_x: 1
556 minimum_width: layout.minimum_width + min(sp(100), title.width)
557 important: True
558 GridLayout:
559 id: layout
560 rows: 1
561 pos: root.pos
562 size_hint_x: None
563 width: self.minimum_width
564 ActionPreviousButton:
565 on_press: root.dispatch('on_press')
566 on_release: root.dispatch('on_release')
567 size_hint_x: None
568 width: prevlayout.width
569 GridLayout:
570 id: prevlayout
571 rows: 1
572 width: self.minimum_width
573 height: self.parent.height
574 pos: self.parent.pos
575 ActionPreviousImage:
576 id: prev_icon_image
577 source: root.previous_image
578 opacity: 1 if root.with_previous else 0
579 allow_stretch: True
580 size_hint_x: None
581 temp_width: root.previous_image_width or dp(prev_icon_image.texture_size[0])
582 temp_height: root.previous_image_height or dp(prev_icon_image.texture_size[1])
583 width:
584 (self.temp_width if self.temp_height <= self.height else \
585 self.temp_width * (self.height / self.temp_height)) \
586 if self.texture else dp(8)
587 mipmap: root.mipmap
588 ActionPreviousImage:
589 id: app_icon_image
590 source: root.app_icon
591 allow_stretch: True
592 size_hint_x: None
593 temp_width: root.app_icon_width or dp(app_icon_image.texture_size[0])
594 temp_height: root.app_icon_height or dp(app_icon_image.texture_size[1])
595 width:
596 (self.temp_width if self.temp_height <= self.height else \
597 self.temp_width * (self.height / self.temp_height)) \
598 if self.texture else dp(8)
599 mipmap: root.mipmap
600 Widget:
601 size_hint_x: None
602 width: '5sp'
603 Label:
604 id: title
605 text: root.title
606 text_size: self.size
607 color: root.color
608 shorten: True
609 shorten_from: 'right'
610 halign: 'left'
611 valign: 'middle'
612
613 <ActionGroup>:
614 background_normal: 'atlas://data/images/defaulttheme/action_group'
615 background_down: 'atlas://data/images/defaulttheme/action_group_down'
616 background_disabled_normal: 'atlas://data/images/defaulttheme/action_group_disabled'
617 border: 30, 30, 3, 3
618 ActionSeparator:
619 pos: root.pos
620 size: root.separator_width, root.height
621 opacity: 1 if root.use_separator else 0
622 background_image: root.separator_image if root.use_separator else 'action_view'
623
624 <ActionOverflow>:
625 border: 3, 3, 3, 3
626 background_normal: 'atlas://data/images/defaulttheme/action_item'
627 background_down: 'atlas://data/images/defaulttheme/action_item_down'
628 background_disabled_normal: 'atlas://data/images/defaulttheme/button_disabled'
629 size_hint_x: None
630 minimum_width: '48sp'
631 width: self.texture_size[0] if self.texture else self.minimum_width
632 canvas.after:
633 Color:
634 rgb: 1, 1, 1
635 Rectangle:
636 pos: root.center_x - sp(16), root.center_y - sp(16)
637 size: sp(32), sp(32)
638 source: root.overflow_image
639
640 <ActionDropDown>:
641 auto_width: False
642
643
644 # =============================================================================
645 # Accordion widget
646 # =============================================================================
647
648 [AccordionItemTitle@Label]:
649 text: ctx.title
650 normal_background: ctx.item.background_normal if ctx.item.collapse else ctx.item.background_selected
651 disabled_background: ctx.item.background_disabled_normal if ctx.item.collapse else ctx.item.background_disabled_selected
652 canvas.before:
653 Color:
654 rgba: self.disabled_color if self.disabled else self.color
655 BorderImage:
656 source: self.disabled_background if self.disabled else self.normal_background
657 pos: self.pos
658 size: self.size
659 PushMatrix
660 Translate:
661 xy: self.center_x, self.center_y
662 Rotate:
663 angle: 90 if ctx.item.orientation == 'horizontal' else 0
664 axis: 0, 0, 1
665 Translate:
666 xy: -self.center_x, -self.center_y
667 canvas.after:
668 PopMatrix
669
670
671 <AccordionItem>:
672 container: container
673 container_title: container_title
674
675 BoxLayout:
676 orientation: root.orientation
677 pos: root.pos
678 BoxLayout:
679 size_hint_x: None if root.orientation == 'horizontal' else 1
680 size_hint_y: None if root.orientation == 'vertical' else 1
681 width: root.min_space if root.orientation == 'horizontal' else 100
682 height: root.min_space if root.orientation == 'vertical' else 100
683 id: container_title
684
685 StencilView:
686 id: sv
687
688 BoxLayout:
689 id: container
690 pos: sv.pos
691 size: root.content_size
692
693
694 <ScrollView>:
695 _handle_y_pos: (self.right - self.bar_width - self.bar_margin) if self.bar_pos_y == 'right' else (self.x + self.bar_margin), self.y + self.height * self.vbar[0]
696 _handle_y_size: min(self.bar_width, self.width), self.height * self.vbar[1]
697 _handle_x_pos: self.x + self.width * self.hbar[0], (self.y + self.bar_margin) if self.bar_pos_x == 'bottom' else (self.top - self.bar_margin - self.bar_width)
698 _handle_x_size: self.width * self.hbar[1], min(self.bar_width, self.height)
699 canvas.after:
700 Color:
701 rgba: self._bar_color if (self.do_scroll_y and self.viewport_size[1] > self.height) else [0, 0, 0, 0]
702 Rectangle:
703 pos: root._handle_y_pos or (0, 0)
704 size: root._handle_y_size or (0, 0)
705 Color:
706 rgba: self._bar_color if (self.do_scroll_x and self.viewport_size[0] > self.width) else [0, 0, 0, 0]
707 Rectangle:
708 pos: root._handle_x_pos or (0, 0)
709 size: root._handle_x_size or (0, 0)
710
711
712 <CheckBox>:
713 _checkbox_state_image:
714 self.background_checkbox_down \
715 if self.active else self.background_checkbox_normal
716 _checkbox_disabled_image:
717 self.background_checkbox_disabled_down \
718 if self.active else self.background_checkbox_disabled_normal
719 _radio_state_image:
720 self.background_radio_down \
721 if self.active else self.background_radio_normal
722 _radio_disabled_image:
723 self.background_radio_disabled_down \
724 if self.active else self.background_radio_disabled_normal
725 _checkbox_image:
726 self._checkbox_disabled_image \
727 if self.disabled else self._checkbox_state_image
728 _radio_image:
729 self._radio_disabled_image \
730 if self.disabled else self._radio_state_image
731 canvas:
732 Color:
733 rgb: 1, 1, 1
734 Rectangle:
735 source: self._radio_image if self.group else self._checkbox_image
736 size: sp(32), sp(32)
737 pos: int(self.center_x - sp(16)), int(self.center_y - sp(16))
738
739 # =============================================================================
740 # Screen Manager
741 # =============================================================================
742
743 <ScreenManager>:
744 canvas.before:
745 StencilPush
746 Rectangle:
747 pos: self.pos
748 size: self.size
749 StencilUse
750 canvas.after:
751 StencilUnUse
752 Rectangle:
753 pos: self.pos
754 size: self.size
755 StencilPop