electrum

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

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