Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
kivy/kivy/data/style.kv
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
1330 lines (1188 sloc)
42.3 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#:kivy 1.0 | |
<Label>: | |
canvas: | |
Color: | |
rgba: 1, 1, 1, 1 | |
Rectangle: | |
texture: self.texture | |
size: self.texture_size | |
pos: int(self.center_x - self.texture_size[0] / 2.), int(self.center_y - self.texture_size[1] / 2.) | |
<-Button,-ToggleButton>: | |
state_image: self.background_normal if self.state == 'normal' else self.background_down | |
disabled_image: self.background_disabled_normal if self.state == 'normal' else self.background_disabled_down | |
canvas: | |
Color: | |
rgba: self.background_color | |
BorderImage: | |
border: self.border | |
pos: self.pos | |
size: self.size | |
source: self.disabled_image if self.disabled else self.state_image | |
Color: | |
rgba: 1, 1, 1, 1 | |
Rectangle: | |
texture: self.texture | |
size: self.texture_size | |
pos: int(self.center_x - self.texture_size[0] / 2.), int(self.center_y - self.texture_size[1] / 2.) | |
<BubbleContent> | |
opacity: .7 if self.disabled else 1 | |
orientation: "horizontal" | |
canvas: | |
Color: | |
rgba: self.background_color | |
BorderImage: | |
border: self.border | |
source: self.background_image | |
size: self.size | |
pos: self.pos | |
auto_scale: self.border_auto_scale | |
<BubbleButton>: | |
background_normal: 'atlas://data/images/defaulttheme/bubble_btn' | |
background_down: 'atlas://data/images/defaulttheme/bubble_btn_pressed' | |
background_disabled_normal: 'atlas://data/images/defaulttheme/bubble_btn' | |
background_disabled_down: 'atlas://data/images/defaulttheme/bubble_btn_pressed' | |
border: (0, 0, 0, 0) | |
<Slider>: | |
canvas: | |
Color: | |
rgb: 1, 1, 1 | |
BorderImage: | |
border: self.border_horizontal if self.orientation == 'horizontal' else self.border_vertical | |
pos: (self.x + self.padding, self.center_y - self.background_width / 2) if self.orientation == 'horizontal' else (self.center_x - self.background_width / 2, self.y + self.padding) | |
size: (self.width - self.padding * 2, self.background_width) if self.orientation == 'horizontal' else (self.background_width, self.height - self.padding * 2) | |
source: (self.background_disabled_horizontal if self.orientation == 'horizontal' else self.background_disabled_vertical) if self.disabled else (self.background_horizontal if self.orientation == 'horizontal' else self.background_vertical) | |
Color: | |
rgba: root.value_track_color if self.value_track and self.orientation == 'horizontal' else [1, 1, 1, 0] | |
Line: | |
width: self.value_track_width | |
points: self.x + self.padding, self.center_y, self.value_pos[0], self.center_y | |
Color: | |
rgba: root.value_track_color if self.value_track and self.orientation == 'vertical' else [1, 1, 1, 0] | |
Line: | |
width: self.value_track_width | |
points: self.center_x, self.y + self.padding, self.center_x, self.value_pos[1] | |
Color: | |
rgb: 1, 1, 1 | |
Image: | |
pos: (root.value_pos[0] - root.cursor_width / 2, root.center_y - root.cursor_height / 2) if root.orientation == 'horizontal' else (root.center_x - root.cursor_width / 2, root.value_pos[1] - root.cursor_height / 2) | |
size: root.cursor_size | |
source: root.cursor_disabled_image if root.disabled else root.cursor_image | |
allow_stretch: True | |
keep_ratio: False | |
<ProgressBar>: | |
canvas: | |
Color: | |
rgb: 1, 1, 1 | |
BorderImage: | |
border: (12, 12, 12, 12) | |
pos: self.x, self.center_y - 12 | |
size: self.width, 24 | |
source: 'atlas://data/images/defaulttheme/progressbar_background' | |
BorderImage: | |
border: [int(min(self.width * (self.value / float(self.max)) if self.max else 0, 12))] * 4 | |
pos: self.x, self.center_y - 12 | |
size: self.width * (self.value / float(self.max)) if self.max else 0, 24 | |
source: 'atlas://data/images/defaulttheme/progressbar' | |
<SplitterStrip>: | |
border: self.parent.border if self.parent else (3, 3, 3, 3) | |
horizontal: '_h' if self.parent and self.parent.sizable_from[0] in ('t', 'b') else '' | |
background_normal: 'atlas://data/images/defaulttheme/splitter{}{}'.format('_disabled' if self.disabled else '', self.horizontal) | |
background_down: 'atlas://data/images/defaulttheme/splitter_down{}{}'.format('_disabled' if self.disabled else '', self.horizontal) | |
Image: | |
pos: root.pos | |
size: root.size | |
allow_stretch: True | |
source: 'atlas://data/images/defaulttheme/splitter_grip' + root.horizontal | |
<Scatter>: | |
canvas.before: | |
PushMatrix | |
MatrixInstruction: | |
matrix: self.transform | |
canvas.after: | |
PopMatrix | |
<RelativeLayout>: | |
canvas.before: | |
PushMatrix | |
Translate: | |
xy: self.pos | |
canvas.after: | |
PopMatrix | |
<Image,AsyncImage>: | |
canvas: | |
Color: | |
rgba: self.color | |
Rectangle: | |
texture: self.texture | |
size: self.norm_image_size | |
pos: self.center_x - self.norm_image_size[0] / 2., self.center_y - self.norm_image_size[1] / 2. | |
<EffectWidget>: | |
canvas.before: | |
Translate: | |
xy: -self.x, -self.y | |
canvas: | |
Color: | |
rgba: 1, 1, 1, 1 | |
Rectangle: | |
texture: self.texture | |
pos: self.pos | |
size: self.size | |
<TabbedPanelContent> | |
rows: 1 | |
padding: 3 | |
canvas: | |
Color: | |
rgba: self.parent.background_color if self.parent else (1, 1, 1, 1) | |
BorderImage: | |
border: self.parent.border if self.parent else (16, 16, 16, 16) | |
source: (root.parent.background_disabled_image if self.disabled else root.parent.background_image) if root.parent else None | |
size: self.size | |
pos: self.pos | |
<TabbedPanelStrip> | |
rows: 1 | |
<StripLayout> | |
padding: '2dp', '2dp', '2dp', '2dp' | |
canvas.before: | |
BorderImage: | |
pos: self.pos | |
size: self.size | |
border: root.border | |
source: root.background_image | |
<TabbedPanelHeader>: | |
halign: 'center' | |
valign: 'middle' | |
background_normal: 'atlas://data/images/defaulttheme/tab_btn' | |
background_disabled_normal: 'atlas://data/images/defaulttheme/tab_btn_disabled' | |
background_down: 'atlas://data/images/defaulttheme/tab_btn_pressed' | |
background_disabled_down: 'atlas://data/images/defaulttheme/tab_btn_pressed' | |
border: (8, 8, 8, 8) | |
font_size: '15sp' | |
<Selector> | |
color: 148. / 255, 208 / 255., 230 / 255., 1 | |
allow_stretch: True | |
<TextInput>: | |
canvas.before: | |
Color: | |
rgba: self.background_color | |
BorderImage: | |
border: self.border | |
pos: self.pos | |
size: self.size | |
source: self.background_active if self.focus else (self.background_disabled_normal if self.disabled else self.background_normal) | |
Color: | |
rgba: | |
(self.cursor_color | |
if self.focus and not self._cursor_blink | |
and int(self.x + self.padding[0]) <= self._cursor_visual_pos[0] <= int(self.x + self.width - self.padding[2]) | |
else (0, 0, 0, 0)) | |
Rectangle: | |
pos: self._cursor_visual_pos | |
size: root.cursor_width, -self._cursor_visual_height | |
Color: | |
rgba: self.disabled_foreground_color if self.disabled else (self.hint_text_color if not self.text else self.foreground_color) | |
<TextInputCutCopyPaste>: | |
content: content.__self__ | |
but_cut: cut.__self__ | |
but_copy: copy.__self__ | |
but_paste: paste.__self__ | |
but_selectall: selectall.__self__ | |
size_hint: None, None | |
size: '150sp', '50sp' | |
BubbleContent: | |
id: content | |
BubbleButton: | |
id: cut | |
text: 'Cut' | |
on_release: root.do('cut') | |
BubbleButton: | |
id: copy | |
text: 'Copy' | |
on_release: root.do('copy') | |
BubbleButton: | |
id: paste | |
text: 'Paste' | |
on_release: root.do('paste') | |
BubbleButton: | |
id: selectall | |
text: 'Select All' | |
on_release: root.do('selectall') | |
<CodeInput>: | |
font_name: 'data/fonts/RobotoMono-Regular.ttf' | |
<TreeViewNode>: | |
canvas.before: | |
Color: | |
rgba: self.color_selected if self.is_selected else self.odd_color if self.odd else self.even_color | |
Rectangle: | |
pos: [self.parent.x, self.y] if self.parent else [0, 0] | |
size: [self.parent.width, self.height] if self.parent else [1, 1] | |
Color: | |
rgba: 1, 1, 1, int(not self.is_leaf) | |
Rectangle: | |
source: 'atlas://data/images/defaulttheme/tree_%s' % ('opened' if self.is_open else 'closed') | |
size: self.height / (3. if dp(1) > 1 else 2.), self.height / (3. if dp(1) > 1 else 2.) | |
pos: self.x - dp(20), int(self.center_y - (self.height / (3. if dp(1) > 1 else 2.)) * .5) | |
canvas.after: | |
Color: | |
rgba: .5, .5, .5, .2 | |
Line: | |
points: [self.parent.x, self.y, self.parent.right, self.y] if self.parent else [] | |
<TreeViewLabel>: | |
width: self.texture_size[0] | |
height: max(self.texture_size[1] + dp(10), dp(24)) | |
text_size: self.width, None | |
<StencilView>: | |
canvas.before: | |
StencilPush | |
Rectangle: | |
pos: self.pos | |
size: self.size | |
StencilUse | |
canvas.after: | |
StencilUnUse | |
Rectangle: | |
pos: self.pos | |
size: self.size | |
StencilPop | |
<FileChooserListLayout>: | |
on_entry_added: treeview.add_node(args[1]) | |
on_entries_cleared: treeview.root.nodes = [] | |
on_subentry_to_entry: not args[2].locked and treeview.add_node(args[1], args[2]) | |
on_remove_subentry: args[2].nodes = [] | |
BoxLayout: | |
pos: root.pos | |
size: root.size | |
size_hint: None, None | |
orientation: 'vertical' | |
BoxLayout: | |
size_hint_y: None | |
height: '30dp' | |
orientation: 'horizontal' | |
Widget: | |
# Just for spacing | |
width: '10dp' | |
size_hint_x: None | |
Label: | |
text: 'Name' | |
text_size: self.size | |
halign: 'left' | |
bold: True | |
Label: | |
text: 'Size' | |
text_size: self.size | |
size_hint_x: None | |
halign: 'right' | |
bold: True | |
Widget: | |
# Just for spacing | |
width: '10dp' | |
size_hint_x: None | |
ScrollView: | |
id: scrollview | |
do_scroll_x: False | |
Scatter: | |
do_rotation: False | |
do_scale: False | |
do_translation: False | |
size: treeview.size | |
size_hint_y: None | |
TreeView: | |
id: treeview | |
hide_root: True | |
size_hint_y: None | |
width: scrollview.width | |
height: self.minimum_height | |
on_node_expand: root.controller.entry_subselect(args[1]) | |
on_node_collapse: root.controller.close_subselection(args[1]) | |
<FileChooserListView>: | |
layout: layout | |
FileChooserListLayout: | |
id: layout | |
controller: root | |
[FileListEntry@FloatLayout+TreeViewNode]: | |
locked: False | |
entries: [] | |
path: ctx.path | |
# FIXME: is_selected is actually a read_only treeview property. In this | |
# case, however, we're doing this because treeview only has single-selection | |
# hardcoded in it. The fix to this would be to update treeview to allow | |
# multiple selection. | |
is_selected: self.path in ctx.controller().selection | |
orientation: 'horizontal' | |
size_hint_y: None | |
height: '48dp' if dp(1) > 1 else '24dp' | |
# Don't allow expansion of the ../ node | |
is_leaf: not ctx.isdir or ctx.name.endswith('..' + ctx.sep) or self.locked | |
on_touch_down: self.collide_point(*args[1].pos) and ctx.controller().entry_touched(self, args[1]) | |
on_touch_up: self.collide_point(*args[1].pos) and ctx.controller().entry_released(self, args[1]) | |
BoxLayout: | |
pos: root.pos | |
size_hint_x: None | |
width: root.width - dp(10) | |
Label: | |
id: filename | |
text_size: self.width, None | |
halign: 'left' | |
shorten: True | |
text: ctx.name | |
font_name: ctx.controller().font_name | |
Label: | |
text_size: self.width, None | |
size_hint_x: None | |
halign: 'right' | |
text: '{}'.format(ctx.get_nice_size()) | |
font_name: ctx.controller().font_name | |
<FileChooserIconLayout>: | |
on_entry_added: stacklayout.add_widget(args[1]) | |
on_entries_cleared: stacklayout.clear_widgets() | |
ScrollView: | |
id: scrollview | |
pos: root.pos | |
size: root.size | |
size_hint: None, None | |
do_scroll_x: False | |
Scatter: | |
do_rotation: False | |
do_scale: False | |
do_translation: False | |
size_hint_y: None | |
height: stacklayout.height | |
StackLayout: | |
id: stacklayout | |
width: scrollview.width | |
size_hint_y: None | |
height: self.minimum_height | |
spacing: '10dp' | |
padding: '10dp' | |
<FileChooserIconView>: | |
layout: layout | |
FileChooserIconLayout: | |
id: layout | |
controller: root | |
[FileIconEntry@Widget]: | |
locked: False | |
path: ctx.path | |
selected: self.path in ctx.controller().selection | |
size_hint: None, None | |
on_touch_down: self.collide_point(*args[1].pos) and ctx.controller().entry_touched(self, args[1]) | |
on_touch_up: self.collide_point(*args[1].pos) and ctx.controller().entry_released(self, args[1]) | |
size: '100dp', '100dp' | |
canvas: | |
Color: | |
rgba: 1, 1, 1, 1 if self.selected else 0 | |
BorderImage: | |
border: 8, 8, 8, 8 | |
pos: root.pos | |
size: root.size | |
source: 'atlas://data/images/defaulttheme/filechooser_selected' | |
Image: | |
size: '48dp', '48dp' | |
source: 'atlas://data/images/defaulttheme/filechooser_%s' % ('folder' if ctx.isdir else 'file') | |
pos: root.x + dp(24), root.y + dp(40) | |
Label: | |
text: ctx.name | |
font_name: ctx.controller().font_name | |
text_size: (root.width, self.height) | |
halign: 'center' | |
shorten: True | |
size: '100dp', '16dp' | |
pos: root.x, root.y + dp(16) | |
Label: | |
text: '{}'.format(ctx.get_nice_size()) | |
font_name: ctx.controller().font_name | |
font_size: '11sp' | |
color: .8, .8, .8, 1 | |
size: '100dp', '16sp' | |
pos: root.pos | |
halign: 'center' | |
<FileChooserProgress>: | |
pos_hint: {'x': 0, 'y': 0} | |
canvas: | |
Color: | |
rgba: 0, 0, 0, .8 | |
Rectangle: | |
pos: self.pos | |
size: self.size | |
Label: | |
pos_hint: {'x': .2, 'y': .6} | |
size_hint: .6, .2 | |
text: 'Opening %s' % root.path | |
text_size: self.size | |
halign: 'center' | |
valign: 'middle' | |
FloatLayout: | |
pos_hint: {'x': .2, 'y': .4} | |
size_hint: .6, .2 | |
ProgressBar: | |
id: pb | |
pos_hint: {'x': 0, 'center_y': .5} | |
max: root.total | |
value: root.index | |
Label: | |
pos_hint: {'x': 0} | |
text: '%d / %d' % (root.index, root.total) | |
size_hint_y: None | |
height: self.texture_size[1] | |
y: pb.center_y - self.height - 8 | |
font_size: '13sp' | |
color: (.8, .8, .8, .8) | |
AnchorLayout: | |
pos_hint: {'x': .2, 'y': .2} | |
size_hint: .6, .2 | |
Button: | |
text: 'Cancel' | |
size_hint: None, None | |
size: 150, 44 | |
on_release: root.cancel() | |
# Switch widget | |
<Switch>: | |
active_norm_pos: max(0., min(1., (int(self.active) + self.touch_distance / sp(41)))) | |
canvas: | |
Color: | |
rgb: 1, 1, 1 | |
Rectangle: | |
source: 'atlas://data/images/defaulttheme/switch-background{}'.format('_disabled' if self.disabled else '') | |
size: sp(83), sp(32) | |
pos: int(self.center_x - sp(41)), int(self.center_y - sp(16)) | |
canvas.after: | |
Color: | |
rgb: 1, 1, 1 | |
Rectangle: | |
source: 'atlas://data/images/defaulttheme/switch-button{}'.format('_disabled' if self.disabled else '') | |
size: sp(43), sp(32) | |
pos: int(self.center_x - sp(41) + self.active_norm_pos * sp(41)), int(self.center_y - sp(16)) | |
# ModalView widget | |
<ModalView>: | |
canvas: | |
Color: | |
rgba: root.overlay_color[:3] + [root.overlay_color[-1] * self._anim_alpha] | |
Rectangle: | |
size: self._window.size if self._window else (0, 0) | |
Color: | |
rgba: root.background_color | |
BorderImage: | |
source: root.background | |
border: root.border | |
pos: self.pos | |
size: self.size | |
# Popup widget | |
<Popup>: | |
_container: container | |
GridLayout: | |
padding: '12dp' | |
cols: 1 | |
size_hint: None, None | |
pos: root.pos | |
size: root.size | |
Label: | |
text: root.title | |
color: root.title_color | |
size_hint_y: None | |
height: self.texture_size[1] + dp(16) | |
text_size: self.width - dp(16), None | |
font_size: root.title_size | |
font_name: root.title_font | |
halign: root.title_align | |
Widget: | |
size_hint_y: None | |
height: dp(4) | |
canvas: | |
Color: | |
rgba: root.separator_color | |
Rectangle: | |
pos: self.x, self.y + root.separator_height / 2. | |
size: self.width, root.separator_height | |
BoxLayout: | |
id: container | |
# ============================================================================= | |
# Spinner widget | |
# ============================================================================= | |
<SpinnerOption>: | |
size_hint_y: None | |
height: '48dp' | |
<Spinner>: | |
background_normal: 'atlas://data/images/defaulttheme/spinner' | |
background_disabled_normal: 'atlas://data/images/defaulttheme/spinner_disabled' | |
background_down: 'atlas://data/images/defaulttheme/spinner_pressed' | |
# ============================================================================= | |
# ActionBar widget | |
# ============================================================================= | |
<ActionBar>: | |
height: '48dp' | |
size_hint_y: None | |
spacing: '4dp' | |
canvas: | |
Color: | |
rgba: self.background_color | |
BorderImage: | |
border: root.border | |
pos: self.pos | |
size: self.size | |
source: self.background_image | |
<ActionView>: | |
orientation: 'horizontal' | |
canvas: | |
Color: | |
rgba: self.background_color | |
BorderImage: | |
pos: self.pos | |
size: self.size | |
source: self.background_image | |
<ActionSeparator>: | |
size_hint_x: None | |
minimum_width: '2sp' | |
width: self.minimum_width | |
canvas: | |
Rectangle: | |
pos: self.x, self.y + sp(4) | |
size: self.width, self.height - sp(8) | |
source: self.background_image | |
<ActionButton,ActionToggleButton>: | |
background_normal: 'atlas://data/images/defaulttheme/' + ('action_bar' if self.inside_group else 'action_item') | |
background_down: 'atlas://data/images/defaulttheme/action_item_down' | |
size_hint_x: None if not root.inside_group else 1 | |
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] | |
color: self.color[:3] + [0 if (root.icon and not root.inside_group) else 1] | |
Image: | |
allow_stretch: True | |
opacity: 1 if (root.icon and not root.inside_group) else 0 | |
source: root.icon | |
mipmap: root.mipmap | |
pos: root.x + dp(4), root.y + dp(4) | |
size: root.width - dp(8), root.height - sp(8) | |
<ActionLabel>: | |
size_hint_x: None if not root.inside_group else 1 | |
width: self.texture_size[0] + dp(32) | |
<ActionGroup>: | |
size_hint_x: None | |
width: self.texture_size[0] + dp(32) | |
<ActionCheck>: | |
background_normal: 'atlas://data/images/defaulttheme/action_bar' if self.inside_group else 'atlas://data/images/defaulttheme/action_item' | |
<ActionPreviousImage@Image>: | |
temp_width: 0 | |
temp_height: 0 | |
<ActionPreviousButton@Button>: | |
background_normal: 'atlas://data/images/defaulttheme/action_item' | |
background_down: 'atlas://data/images/defaulttheme/action_item_down' | |
<ActionPrevious>: | |
size_hint_x: 1 | |
minimum_width: layout.minimum_width + min(sp(100), title.width) | |
important: True | |
GridLayout: | |
id: layout | |
rows: 1 | |
pos: root.pos | |
size_hint_x: None | |
width: self.minimum_width | |
ActionPreviousButton: | |
on_press: root.dispatch('on_press') | |
on_release: root.dispatch('on_release') | |
size_hint_x: None | |
width: prevlayout.width | |
GridLayout: | |
id: prevlayout | |
rows: 1 | |
width: self.minimum_width | |
height: self.parent.height | |
pos: self.parent.pos | |
ActionPreviousImage: | |
id: prev_icon_image | |
source: root.previous_image | |
opacity: 1 if root.with_previous else 0 | |
allow_stretch: True | |
size_hint_x: None | |
temp_width: root.previous_image_width or dp(prev_icon_image.texture_size[0]) | |
temp_height: root.previous_image_height or dp(prev_icon_image.texture_size[1]) | |
width: | |
(self.temp_width if self.temp_height <= self.height else \ | |
self.temp_width * (self.height / self.temp_height)) \ | |
if self.texture else dp(8) | |
mipmap: root.mipmap | |
ActionPreviousImage: | |
id: app_icon_image | |
source: root.app_icon | |
allow_stretch: True | |
size_hint_x: None | |
temp_width: root.app_icon_width or dp(app_icon_image.texture_size[0]) | |
temp_height: root.app_icon_height or dp(app_icon_image.texture_size[1]) | |
width: | |
(self.temp_width if self.temp_height <= self.height else \ | |
self.temp_width * (self.height / self.temp_height)) \ | |
if self.texture and root.app_icon else 0 | |
mipmap: root.mipmap | |
Widget: | |
size_hint_x: None | |
width: '5sp' | |
Label: | |
id: title | |
text: root.title | |
text_size: self.size | |
color: root.color | |
markup: root.markup | |
shorten: True | |
shorten_from: 'right' | |
halign: 'left' | |
valign: 'middle' | |
<ActionGroup>: | |
background_normal: 'atlas://data/images/defaulttheme/action_group' | |
background_down: 'atlas://data/images/defaulttheme/action_group_down' | |
background_disabled_normal: 'atlas://data/images/defaulttheme/action_group_disabled' | |
border: 30, 30, 3, 3 | |
ActionSeparator: | |
pos: root.pos | |
size: root.separator_width, root.height | |
opacity: 1 if root.use_separator else 0 | |
background_image: root.separator_image if root.use_separator else 'action_view' | |
<ActionOverflow>: | |
border: 3, 3, 3, 3 | |
background_normal: 'atlas://data/images/defaulttheme/action_item' | |
background_down: 'atlas://data/images/defaulttheme/action_item_down' | |
background_disabled_normal: 'atlas://data/images/defaulttheme/button_disabled' | |
size_hint_x: None | |
minimum_width: '48sp' | |
width: self.texture_size[0] if self.texture else self.minimum_width | |
canvas.after: | |
Color: | |
rgb: 1, 1, 1 | |
Rectangle: | |
pos: root.center_x - sp(16), root.center_y - sp(16) | |
size: sp(32), sp(32) | |
source: root.overflow_image | |
<ActionDropDown>: | |
auto_width: False | |
# ============================================================================= | |
# Accordion widget | |
# ============================================================================= | |
[AccordionItemTitle@Label]: | |
text: ctx.title | |
normal_background: ctx.item.background_normal if ctx.item.collapse else ctx.item.background_selected | |
disabled_background: ctx.item.background_disabled_normal if ctx.item.collapse else ctx.item.background_disabled_selected | |
canvas.before: | |
Color: | |
rgba: self.disabled_color if self.disabled else self.color | |
BorderImage: | |
source: self.disabled_background if self.disabled else self.normal_background | |
pos: self.pos | |
size: self.size | |
PushMatrix | |
Translate: | |
xy: self.center_x, self.center_y | |
Rotate: | |
angle: 90 if ctx.item.orientation == 'horizontal' else 0 | |
axis: 0, 0, 1 | |
Translate: | |
xy: -self.center_x, -self.center_y | |
canvas.after: | |
PopMatrix | |
<AccordionItem>: | |
container: container | |
container_title: container_title | |
BoxLayout: | |
orientation: root.orientation | |
pos: root.pos | |
BoxLayout: | |
size_hint_x: None if root.orientation == 'horizontal' else 1 | |
size_hint_y: None if root.orientation == 'vertical' else 1 | |
width: root.min_space if root.orientation == 'horizontal' else 100 | |
height: root.min_space if root.orientation == 'vertical' else 100 | |
id: container_title | |
StencilView: | |
id: sv | |
BoxLayout: | |
id: container | |
pos: sv.pos | |
size: root.content_size | |
# ============================================================================= | |
# Settings | |
# ============================================================================= | |
<SettingSpacer>: | |
size_hint_y: None | |
height: 5 | |
canvas: | |
Color: | |
rgb: .2, .2, .2 | |
Rectangle: | |
pos: self.x, self.center_y | |
size: self.width, 1 | |
<SettingItem>: | |
size_hint: .25, None | |
height: labellayout.texture_size[1] + dp(10) | |
content: content | |
canvas: | |
Color: | |
rgba: 47 / 255., 167 / 255., 212 / 255., self.selected_alpha | |
Rectangle: | |
pos: self.x, self.y + 1 | |
size: self.size | |
Color: | |
rgb: .2, .2, .2 | |
Rectangle: | |
pos: self.x, self.y - 2 | |
size: self.width, 1 | |
BoxLayout: | |
pos: root.pos | |
Label: | |
size_hint_x: .66 | |
id: labellayout | |
markup: True | |
text: u'{0}\n[size=13sp][color=999999]{1}[/color][/size]'.format(root.title or '', root.desc or '') | |
font_size: '15sp' | |
text_size: self.width - 32, None | |
BoxLayout: | |
id: content | |
size_hint_x: .33 | |
<SettingBoolean>: | |
Switch: | |
text: 'Boolean' | |
pos: root.pos | |
active: bool(root.values.index(root.value)) if root.value in root.values else False | |
on_active: root.value = root.values[int(args[1])] | |
<SettingString>: | |
Label: | |
text: root.value or '' | |
pos: root.pos | |
font_size: '15sp' | |
<SettingPath>: | |
Label: | |
text: root.value or '' | |
pos: root.pos | |
font_size: '15sp' | |
#:import kivy kivy | |
<SettingColor>: | |
BoxLayout: | |
Label: | |
size_hint_x: None | |
width: 44 | |
padding: (0, 5) | |
canvas.before: | |
# white border to see that there's a color tile at dark colors e.g. black | |
Color: | |
rgba: (1,1,1,1.) | |
Line: | |
rectangle: self.x,self.y,self.width,self.height | |
Color: | |
rgba: kivy.utils.get_color_from_hex(root.value) if root.value else (1,1,1,1.) | |
Rectangle: | |
pos: self.pos | |
size: self.size | |
Label: | |
text: root.value or '' | |
pos: root.pos | |
font_size: '15sp' | |
text_size: self.size | |
valign: 'middle' | |
halign: 'center' | |
padding: (5,0) | |
<SettingOptions>: | |
Label: | |
text: root.value or '' | |
pos: root.pos | |
font_size: '15sp' | |
<SettingTitle>: | |
text_size: self.width - 32, None | |
size_hint_y: None | |
height: max(dp(20), self.texture_size[1] + dp(20)) | |
color: (.9, .9, .9, 1) | |
font_size: '15sp' | |
canvas: | |
Color: | |
rgba: .15, .15, .15, .5 | |
Rectangle: | |
pos: self.x, self.y + 2 | |
size: self.width, self.height - 2 | |
Color: | |
rgb: .2, .2, .2 | |
Rectangle: | |
pos: self.x, self.y - 2 | |
size: self.width, 1 | |
<SettingSidebarLabel>: | |
size_hint: 1, None | |
text_size: self.width - 32, None | |
height: self.texture_size[1] + dp(20) | |
font_size: '15sp' | |
canvas.before: | |
Color: | |
rgba: 47 / 255., 167 / 255., 212 / 255., int(self.selected) | |
Rectangle: | |
pos: self.pos | |
size: self.size | |
<SettingsPanel>: | |
spacing: 5 | |
padding: 5 | |
size_hint_y: None | |
height: self.minimum_height | |
Label: | |
size_hint_y: None | |
text: root.title | |
text_size: self.width - 32, None | |
height: max(50, self.texture_size[1] + 20) | |
color: (.5, .5, .5, 1) | |
font_size: '15sp' | |
canvas.after: | |
Color: | |
rgb: .2, .2, .2 | |
Rectangle: | |
pos: self.x, self.y - 2 | |
size: self.width, 1 | |
<Settings>: | |
orientation: 'horizontal' | |
canvas.before: | |
Color: | |
rgb: 0, 0, 0 | |
Rectangle: | |
pos: self.pos | |
size: self.size | |
<InterfaceWithSidebar>: | |
orientation: 'horizontal' | |
menu: menu | |
content: content | |
MenuSidebar: | |
id: menu | |
ContentPanel: | |
id: content | |
current_uid: menu.selected_uid | |
<InterfaceWithSpinner>: | |
orientation: 'vertical' | |
menu: menu | |
content: content | |
MenuSpinner: | |
id: menu | |
ContentPanel: | |
id: content | |
current_uid: menu.selected_uid | |
<MenuSpinner>: | |
orientation: 'horizontal' | |
size_hint_y: None | |
height: '50dp' | |
spinner: spinner | |
spinner_text: spinner.text | |
close_button: button | |
Spinner: | |
id: spinner | |
Button: | |
text: 'Close' | |
id: button | |
size_hint_x: None | |
width: min(dp(200), 0.4*root.width) | |
font_size: '15sp' | |
<MenuSidebar>: | |
size_hint_x: None | |
width: '200dp' | |
buttons_layout: menu | |
close_button: button | |
GridLayout: | |
pos: root.pos | |
cols: 1 | |
id: menu | |
padding: 5 | |
canvas.after: | |
Color: | |
rgb: .2, .2, .2 | |
Rectangle: | |
pos: self.right - 1, self.y | |
size: 1, self.height | |
Button: | |
text: 'Close' | |
id: button | |
size_hint: None, None | |
width: root.width - dp(20) | |
height: max(50, self.texture_size[1] + dp(20)) | |
pos: root.x + dp(10), root.y + dp(10) | |
font_size: '15sp' | |
<ContentPanel>: | |
do_scroll_x: False | |
container: content | |
GridLayout: | |
id: content | |
cols: 1 | |
size_hint_y: None | |
height: self.minimum_height | |
<InterfaceWithTabbedPanel>: | |
tabbedpanel: tp | |
close_button: button | |
TabbedPanel: | |
id: tp | |
size: root.size | |
pos: root.pos | |
#do_default_tab: False | |
background_color: (0,0,0,1) | |
Button: | |
id: button | |
text: 'Close' | |
size_hint: None, None | |
height: '45dp' | |
width: min(dp(200), 0.3*root.width) | |
x: root.x + root.width - self.width | |
y: root.y + root.height - self.height | |
<ScrollView>: | |
_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] | |
_handle_y_size: min(self.bar_width, self.width), self.height * self.vbar[1] | |
_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) | |
_handle_x_size: self.width * self.hbar[1], min(self.bar_width, self.height) | |
canvas.after: | |
Color: | |
rgba: self._bar_color if (self.do_scroll_y and self.viewport_size[1] > self.height) else [0, 0, 0, 0] | |
Rectangle: | |
pos: root._handle_y_pos or (0, 0) | |
size: root._handle_y_size or (0, 0) | |
Color: | |
rgba: self._bar_color if (self.do_scroll_x and self.viewport_size[0] > self.width) else [0, 0, 0, 0] | |
Rectangle: | |
pos: root._handle_x_pos or (0, 0) | |
size: root._handle_x_size or (0, 0) | |
# ============================================================================= | |
# Video player | |
# ============================================================================= | |
<VideoPlayerPreview>: | |
pos_hint: {'x': 0, 'y': 0} | |
image_overlay_play: 'atlas://data/images/defaulttheme/player-play-overlay' | |
image_loading: 'data/images/image-loading.zip' | |
Image: | |
source: root.source | |
color: (.5, .5, .5, 1) if root.source else (0, 0, 0, 0) | |
pos_hint: {'x': 0, 'y': 0} | |
Image: | |
source: root.image_overlay_play if not root.click_done else root.image_loading | |
pos_hint: {'x': 0, 'y': 0} | |
<VideoPlayerAnnotation>: | |
canvas.before: | |
Color: | |
rgba: self.annotation['bgcolor'] if 'bgcolor' in self.annotation else (0, 0, 0, 0.8) | |
BorderImage: | |
pos: self.pos | |
size: self.size | |
source: self.annotation['bgsource'] if 'bgsource' in self.annotation else None | |
border: self.annotation['border'] if 'border' in self.annotation else (0, 0, 0, 0) | |
size_hint: self.annotation['size_hint'] if 'size_hint' in self.annotation else (None, None) | |
size: self.annotation['size'] if 'size' in self.annotation else (self.texture_size[0] + 20, self.texture_size[1] + 20) | |
pos_hint: self.annotation['pos_hint'] if 'pos_hint' in self.annotation else {'center_x': .5, 'y': .05} | |
<VideoPlayer>: | |
container: container | |
cols: 1 | |
FloatLayout: | |
cols: 1 | |
id: container | |
GridLayout: | |
rows: 1 | |
size_hint_y: None | |
height: '44dp' | |
VideoPlayerStop: | |
size_hint_x: None | |
video: root | |
width: '44dp' | |
source: root.image_stop | |
allow_stretch: True | |
VideoPlayerPlayPause: | |
size_hint_x: None | |
video: root | |
width: '44dp' | |
source: root.image_pause if root.state == 'play' else root.image_play | |
allow_stretch: True | |
VideoPlayerVolume: | |
video: root | |
size_hint_x: None | |
width: '44dp' | |
source: root.image_volumehigh if root.volume > 0.8 else (root.image_volumemedium if root.volume > 0.4 else (root.image_volumelow if root.volume > 0 else root.image_volumemuted)) | |
allow_stretch: True | |
Widget: | |
size_hint_x: None | |
width: 5 | |
VideoPlayerProgressBar: | |
video: root | |
max: max(root.duration, root.position, 1) | |
value: root.position | |
Widget: | |
size_hint_x: None | |
width: 10 | |
# ============================================================================= | |
# Checkbox | |
# ============================================================================= | |
<CheckBox>: | |
_checkbox_state_image: | |
self.background_checkbox_down \ | |
if self.active else self.background_checkbox_normal | |
_checkbox_disabled_image: | |
self.background_checkbox_disabled_down \ | |
if self.active else self.background_checkbox_disabled_normal | |
_radio_state_image: | |
self.background_radio_down \ | |
if self.active else self.background_radio_normal | |
_radio_disabled_image: | |
self.background_radio_disabled_down \ | |
if self.active else self.background_radio_disabled_normal | |
_checkbox_image: | |
self._checkbox_disabled_image \ | |
if self.disabled else self._checkbox_state_image | |
_radio_image: | |
self._radio_disabled_image \ | |
if self.disabled else self._radio_state_image | |
canvas: | |
Color: | |
rgba: self.color | |
Rectangle: | |
source: self._radio_image if self.group else self._checkbox_image | |
size: sp(32), sp(32) | |
pos: int(self.center_x - sp(16)), int(self.center_y - sp(16)) | |
# ============================================================================= | |
# Screen Manager | |
# ============================================================================= | |
<ScreenManager>: | |
canvas.before: | |
StencilPush | |
Rectangle: | |
pos: self.pos | |
size: self.size | |
StencilUse | |
canvas.after: | |
StencilUnUse | |
Rectangle: | |
pos: self.pos | |
size: self.size | |
StencilPop | |
# ============================================================================= | |
# Color Picker | |
# ============================================================================= | |
<ColorPicker_Input@TextInput> | |
multiline: False | |
mroot: None | |
padding: sp(5) | |
border: 4, 9, 4, 9 | |
<ColorPicker_Label@Label> | |
mroot: None | |
size_hint_x: None | |
width: '30sp' | |
text_size: self.size | |
halign: "center" | |
valign: "middle" | |
<ColorPicker_Selector@BoxLayout> | |
foreground_color: None | |
text: '' | |
mroot: None | |
mode: 'rgb' | |
color: 0 | |
spacing: '2sp' | |
ColorPicker_Label: | |
text: root.text | |
mroot: root.mroot | |
color: root.foreground_color or (1, 1, 1, 1) | |
AnchorLayout: | |
size_hint_x: None | |
width: '50sp' | |
ColorPicker_Input: | |
mroot: root.mroot | |
text: str(int(sldr.value)) | |
size_hint_y: None | |
height: '28sp' | |
on_text: | |
root.mroot._trigger_update_clr(root.mode, root.clr_idx, args[1]) | |
Slider: | |
id: sldr | |
size_hint: 1, .25 | |
pos_hint: {'center_y':.5} | |
range: 0, 255 | |
value: root.color * 255 | |
on_value: | |
root.mroot._trigger_update_clr(root.mode, root.clr_idx, args[1]) | |
<ColorWheel>: | |
_origin: self.center | |
_radius: 0.45 * min(self.size) | |
<ColorPicker>: | |
foreground_color: (1, 1, 1, 1) if self.hsv[2] * root.color[3] < .5 else (0, 0, 0, 1) | |
wheel: wheel | |
BoxLayout: | |
orientation: 'vertical' if root.width < root.height else 'horizontal' | |
spacing: '5sp' | |
StackLayout: | |
orientation: 'tb-lr' | |
size_hint_y: None if root.width < root.height else 1 | |
height: sp(33) * 4 if root.width < root.height else self.height | |
canvas: | |
Color: | |
rgba: root.color | |
Rectangle: | |
size: self.size | |
pos: self.pos | |
ColorPicker_Selector: | |
mroot: root | |
text: 'R' | |
clr_idx: 0 | |
color: root.color[0] | |
foreground_color: root.foreground_color | |
size_hint_y: None if root.width < root.height else 0.125 | |
size_hint_x: .5 if root.width < root.height else 1 | |
height: '33sp' if root.width < root.height else self.height | |
ColorPicker_Selector: | |
mroot: root | |
text: 'G' | |
clr_idx: 1 | |
color: root.color[1] | |
foreground_color: root.foreground_color | |
size_hint_y: None if root.width < root.height else 0.125 | |
size_hint_x: .5 if root.width < root.height else 1 | |
height: '33sp' if root.width < root.height else self.height | |
ColorPicker_Selector: | |
mroot: root | |
text: 'B' | |
clr_idx: 2 | |
color: root.color[2] | |
foreground_color: root.foreground_color | |
size_hint_y: None if root.width < root.height else 0.125 | |
size_hint_x: .5 if root.width < root.height else 1 | |
height: '33sp' if root.width < root.height else self.height | |
ColorPicker_Selector: | |
mroot: root | |
text: 'A' | |
clr_idx: 3 | |
color: root.color[3] | |
foreground_color: root.foreground_color | |
size_hint_y: None if root.width < root.height else 0.125 | |
size_hint_x: .5 if root.width < root.height else 1 | |
height: '33sp' if root.width < root.height else self.height | |
ColorPicker_Selector: | |
mroot: root | |
mode: 'hsv' | |
text: 'H' | |
clr_idx: 0 | |
color: root.hsv[0] | |
foreground_color: root.foreground_color | |
size_hint_y: None if root.width < root.height else 0.125 | |
size_hint_x: .5 if root.width < root.height else 1 | |
height: '33sp' if root.width < root.height else self.height | |
ColorPicker_Selector: | |
mroot: root | |
mode: 'hsv' | |
text: 'S' | |
clr_idx: 1 | |
color: root.hsv[1] | |
foreground_color: root.foreground_color | |
size_hint_y: None if root.width < root.height else 0.125 | |
size_hint_x: .5 if root.width < root.height else 1 | |
height: '33sp' if root.width < root.height else self.height | |
ColorPicker_Selector: | |
mroot: root | |
mode: 'hsv' | |
text: 'V' | |
clr_idx: 2 | |
color: root.hsv[2] | |
foreground_color: root.foreground_color | |
size_hint_y: None if root.width < root.height else 0.125 | |
size_hint_x: .5 if root.width < root.height else 1 | |
height: '33sp' if root.width < root.height else self.height | |
BoxLayout: | |
size_hint_y: None if root.width < root.height else 0.125 | |
size_hint_x: .5 if root.width < root.height else 1 | |
height: '33sp' if root.width < root.height else self.height | |
spacing: '2sp' | |
ColorPicker_Label: | |
mroot: root | |
text: 'X' | |
color: root.foreground_color | |
AnchorLayout: | |
ColorPicker_Input: | |
size_hint_y: None | |
height: '28sp' | |
mroot: root | |
text: str(root.hex_color) | |
on_text: root._trigger_update_hex(args[1]) | |
ColorWheel: | |
id: wheel | |
color: root.color | |
on_color: root.set_color(args[1][:3]) |