style.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