Files
katrain-qt/katrain/gui.kv
T
2020-05-19 23:03:32 +02:00

1010 lines
31 KiB
Plaintext

#:kivy 1.11.0
#:import ew kivy.uix.effectwidget
#:set PLAYER_MODES ['Human', 'Teach','AI']
#:set PLAYER_MODE_VALUES ['human','human+undo','ai']
#:set PLAYER_TOOLTIPS ['Normal play mode','Undo Mode, asking you to try and improve on bad moves','Automatic play mode']
#:set BUTTON_COLOR [0.23, 0.30, 0.35, 1]
#:set TOOLTIP_COLOR [0.43, 0.50, 0.65, 1]
#:set ICON_BUTTON_COLOR [0.71, 0.78, 0.81, 1]
#:set ICON_BUTTON_COLOR_DOWN [0.51, 0.58, 0.51, 1]
#:set GRAPH_DOT_COLOR [0.85, 0.3, 0.3,1]
#:set BLACK [0.05,0.05,0.05,1]
#:set WHITE [0.95,0.95,0.95,1]
#:set GREY [0.5,0.5,0.5,1]
#-- NEW
#:set BACKGROUND_COLOR [36/255,48/255,62/255,1]
#:set BOX_BACKGROUND_COLOR [46/255,65/255,88/255,1]
#:set BOX_BACKGROUND_COLOR [56/255,75/255,98/255,1]
# mixins
<BackgroundColor>:
canvas.before:
Color:
rgb: root.background
Rectangle:
pos: self.pos
size: self.size
<ToolTipBehavior>:
<ToolTipLabel>:
size_hint: None, None
size: self.texture_size
tooltip_font_size: dp(14)
padding: (2,2)
halign: 'center'
canvas.before:
Color:
rgba: TOOLTIP_COLOR
Rectangle:
size: self.size
pos: self.pos
Color:
rgba: BUTTON_COLOR
Line:
width: 1.1
rectangle: (*self.pos,*self.size)
# widgets
<StyledButton>:
color: WHITE
font_size: self.size[1] * 0.45
radius: (self.size[1]/7,)
button_color: BUTTON_COLOR
button_color_down: [0.105, 0.14, 0.155, 1]
button_color_highlight: [(a+b)/2 for a,b in zip(self.button_color,self.button_color_down)]
background_color: 0,0,0,0
background_normal: ''
canvas.before:
Color:
rgba: self.button_color if root.state=='normal' else self.button_color_down
RoundedRectangle:
size: self.size[0],self.size[1]
pos: (self.pos[0],self.pos[1])
radius: root.radius
<StyledSpinnerOption@SpinnerOption>:
background_color: BUTTON_COLOR
background_normal: ''
color: WHITE
canvas.after:
Color:
rgba: WHITE
Line
points: self.pos[0],self.pos[1],self.pos[0]+self.width,self.pos[1]
width: 1
<StyledSpinner>:
text: self.values[0] if self.values else ''
font_size: self.size[1] * 0.33
sync_height_frac: 0.7
background_color: [*[c*255/88 for c in BUTTON_COLOR[:3]], 1] # compensate for texture
option_cls: 'StyledSpinnerOption'
<StyledToggleButton>:
max_lines: 1
<StyledTabButton@StyledToggleButton>:
bold: True
radius: (self.size[1]/3,self.size[1]/3,0,0)
<ToggleButtonContainer>:
<LabelledTextInput>:
padding: 3, 0.27*self.size[1]
font_size: 0.4*self.size[1]
<LabelledIntInput>:
font_size: 0.5*self.size[1]
padding: 7, 0.2*self.size[1]
<LabelledFloatInput>:
font_size: 0.5*self.size[1]
padding: 7, 0.2*self.size[1]
<LabelledTextArea>
font_size: 0.2*self.size[1]
<CheckBox>:
color: BLACK
<LabelledCheckBox>:
color: WHITE
<StyledIconButton@StyledButton>:
button_color: ICON_BUTTON_COLOR
button_color_down: ICON_BUTTON_COLOR_DOWN
icon_margin: 0.15 * self.size[0]
icon: ''
icon_size: min(self.size[0]-2*self.icon_margin,self.size[1]-2*self.icon_margin)
Image:
size: (root.icon_size or 0,root.icon_size or 0) # square
pos: [root.pos[i] + (root.size[i] - root.icon_size)/2 for i in [0,1]] if root.icon_size else [0,0]
source: root.icon
mipmap: True
<StyledIconStyledToggleButton@StyledIconButton+ToggleButtonBehavior>:
<TransparentIconButton@Button>:
background_normal: ''
background_color: (0,0,0,0)
icon_size: min(self.size[0],self.size[1])
icon: ''
Image:
size: (root.icon_size or 0,root.icon_size or 0) # square
pos: [root.pos[i] + (root.size[i] - root.icon_size)/2 for i in [0,1]] if root.icon_size else [0,0]
source: root.icon
mipmap: True
<DarkLabel>:
color: BLACK
text_size: self.size # don't overflow these
halign: 'center'
valign: 'center'
<LargeLabel@DarkLabel>:
bold: True
<TimerLabel@Label>
color: BLACK
font_size: 0.85*self.size[1]
halign: 'right'
valign: 'middle'
markup: True
multiline: False
font_name: 'img/fonts/digital-7.ttf'
<ScaledLightLabel>: # popups
color: WHITE
font_size: 0.45*self.size[1]/self.num_lines
<LightHelpLabel>:
font_size: self.size[1]/10
halign: 'center'
valign: 'center'
multiline: True
<BoxedDarkLabel@Label>:
halign: 'left'
valign: 'top'
canvas.before:
Color:
rgba: BLACK
Line:
rectangle: [self.pos[0],self.pos[1]+1,self.width-1,self.height]
width:1.5
<CheckBoxHintLabel@Label+ToolTipBehavior>:
font_size: 0.4*self.size[1]
color: BLACK
halign: 'center'
valign: 'center'
size: self.texture_size
<ClickableLabel@ButtonBehavior+DarkLabel>:
color: BLACK
halign: 'center'
valign: 'center'
size: self.texture_size
<CensorableLabel>:
value : value
orientation: 'horizontal'
ClickableLabel:
size_hint: 0.6,1
id: desc
text: root.label
font_size: self.size[1] * 0.8
on_press: value.opacity = 1 if value.opacity==0 else 0
DarkLabel:
size_hint: 0.4,1
text: root.text
font_size: desc.font_size
id: value
bold: True
<BaseCircleWithText>:
text: ''
color: WHITE
font_size: min(self.height,self.width) * 0.6 / (0.5 + 0.5 * len(self.text))
halign: 'center'
valign: 'center'
bold: True
<BlackCircleWithText@BaseCircleWithText>:
canvas.before:
Color:
rgba: BLACK
Ellipse:
pos: self.pos[0] + self.width/2 - min(self.height,self.width) * root.radius, self.pos[1] + self.height/2 - min(self.height,self.width) * root.radius
size: min(self.height,self.width) * 2 * root.radius, min(self.height,self.width) * 2* root.radius
<WhiteCircleWithText@BaseCircleWithText>:
color: BLACK
outline: True
canvas.before:
Color:
rgba: WHITE
Ellipse:
pos: self.pos[0] + self.width/2 - min(self.height,self.width) * root.radius, self.pos[1] + self.height/2 - min(self.height,self.width) * root.radius
size: min(self.height,self.width) * 2 * root.radius, min(self.height,self.width) * 2 * root.radius
canvas.after:
Color:
rgba: BLACK
Line:
circle: self.pos[0] + self.width/2, self.pos[1] + self.height/2, min(self.height,self.width) * root.radius - 1
width: 1.1 if root.outline else 0.0001
<GraphMarkerLabel@Label>:
valign: 'bottom'
halign: 'left'
text: '+0'
color: BUTTON_COLOR
size: self.texture_size
# UI components
<BadukPanWidget>:
size: self.parent.height, self.parent.height
katrain: app.gui
<BadukPanControls>:
katrain: app.gui
black_prisoners: black_prisoners
white_prisoners: white_prisoners
mid_circles_container: mid_circles_container
pass_btn: pass_btn
engine_status_col: 0.8,0,0,1
Label:
size_hint: 0.05, 1
BoxLayout:
size_hint: 0.2, 1
padding: [0.325*self.size[1],0.2*self.size[1]]
StyledButton:
text: 'Pass'
tooltip_text: '[space]\nPass'
font_size: 0.6*self.size[1]
id: pass_btn
on_release: if not self.last_touch or self.last_touch.button=="left": root.katrain("play",None)
Label:
size_hint: 0.05, 1
BoxLayout:
size_hint: 0.3, 1
padding: [0, self.size[1]*0.3]
spacing: 0
TransparentIconButton:
icon: 'img/flaticon/previous999.png'
size_hint: 0.1, 1
on_press: root.katrain('undo',999)
TransparentIconButton:
icon: 'img/flaticon/previous5.png'
size_hint: 0.1, 1
on_press: root.katrain('undo',5)
TransparentIconButton:
icon: 'img/flaticon/previous.png'
size_hint: 0.1, 1
on_press: root.katrain('undo')
FloatLayout:
size_hint: 0.2, 1
id: mid_circles_container
BlackCircleWithText:
id: black_prisoners
pos: (self.parent.pos[0]-self.height/3,self.parent.pos[1]) if self.parent else (0,0)
radius: 0.4
WhiteCircleWithText:
id: white_prisoners
pos: (self.parent.pos[0]+self.height/3,self.parent.pos[1]) if self.parent else (0,0)
radius: 0.4
BoxLayout:
size_hint: 0.3, 1
padding: [0, self.size[1]*0.3]
TransparentIconButton:
icon: 'img/flaticon/next.png'
size_hint: 0.1, 1
on_press: root.katrain('redo')
TransparentIconButton:
icon: 'img/flaticon/next5.png'
size_hint: 0.1, 1
on_press: root.katrain('redo',5)
TransparentIconButton:
icon: 'img/flaticon/next999.png'
size_hint: 0.1, 1
on_press: root.katrain('redo',999)
Label:
size_hint: 0.05, 1
BoxLayout:
size_hint: 0.2, 1
padding: 0.2 * self.size[1]
StyledButton:
text: 'AI Move'
tooltip_text: '[enter]\nPlay an AI move\nusing the\nselected strategy.'
on_press: if not self.last_touch or self.last_touch.button=="left": root.katrain("ai-move",None)
font_size: 0.6*self.size[1]
ClickableLabel:
size_hint: 0.025, 1
canvas:
Color:
rgba: root.engine_status_col
Ellipse:
pos: self.pos[0] + self.width/2 - self.height/5, self.pos[1] + self.height/2 - self.height/5
size: self.height/2.5,self.height/2.5
Color:
rgba: BLACK
Line:
circle: self.pos[0] + self.width/2, self.pos[1] + self.height/2, self.height/5 - 1
width: 1.1
on_press: root.katrain.controls.set_status("This simply indicates the Engine status, going from green (idle) to orange (processing many queries). It turns red when the engine has crashed or fails to start.")
Label:
size_hint: 0.025, 1
<AnalysisControls@BoxLayout>:
katrain: app.gui
show_children: show_children
eval: eval
policy: policy
hints: hints
ownership: ownership
Label:
text: '='
size_hint_x: None
width: self.height
GridLayout:
cols: 5
rows: 2
size_hint: 0.5, 1
CheckBoxHintLabel:
text: 'next\nmoves'
tooltip_text: '[q]\nShow all next moves\nplayed from the current position'
CheckBoxHintLabel:
text: 'all\ndots'
tooltip_text: '[w]\nShow evaluation dots\non stones for all moves'
CheckBoxHintLabel:
text: 'top\nmoves'
tooltip_text: '[e]\nShow top\npredicted moves'
CheckBoxHintLabel:
text: 'show\nowner'
tooltip_text: '[r]\nShow predicted ownership\nof each intersection'
CheckBoxHintLabel:
text: 'NN\npolicy'
tooltip_text: "[t]\nShow Policy top moves\n(i.e. with no 'reading')"
CheckBox:
id: show_children
active: True
on_active: root.katrain.update_state()
CheckBox:
id: eval
on_active: root.katrain.update_state()
CheckBox:
id: hints
on_active: root.katrain.update_state()
CheckBox:
id: ownership
on_active: root.katrain.update_state()
CheckBox:
id: policy
on_active: root.katrain.update_state()
BoxLayout:
spacing:1
padding: 1,2,1,2
size_hint: 0.5, 1
StyledButton:
id: analyze_extra
text: 'Extra'
tooltip_text: '[a]\nExtra analysis\nto increase accuracy\nof top move predictions\nand score difference'
size_hint: 1, 1
on_press: if not self.last_touch or self.last_touch.button=="left": root.katrain("analyze-extra","extra")
StyledButton:
id: analyze_equalize
text: 'Equalize'
tooltip_text: '[s]\nAnalysis of all\npredicted top moves\nwith the same accuracy'
size_hint: 1, 1
on_press: if not self.last_touch or self.last_touch.button=="left": root.katrain("analyze-extra","equalize")
StyledButton:
id: analyze_sweep
text: 'Sweep'
tooltip_text: '[d]\nFast analysis\nof all legal moves'
size_hint: 1, 1
on_press: if not self.last_touch or self.last_touch.button=="left": root.katrain("analyze-extra","sweep")
# ---------- components of right pane -------
<ControlPanelSection@BoxLayout+BackgroundColor>:
background: BOX_BACKGROUND_COLOR
<PlayerInfo@BoxLayout>:
BlackCircleWithText:
text: '0'
size_hint: 0.2, 1
id: captures
Label:
id: description
<PonderInfo@ControlPanelSection>:
Label:
text: 'AI\nPonder\nO'
<Timer@ControlPanelSection>:
state: (30,5,1)
paused: True
TimerLabel:
size_hint: 0.45,1
id: timer
text: f"{root.state[0]//60}:{int(root.state[0] % 60):02d}"
DarkLabel:
size_hint: 0.125,1
id: periods
markup: True
text: f"x{root.state[1]}"
font_size: self.width*0.5
multiline: False
valign: 'top'
halign: 'left'
BoxLayout:
orientation: 'vertical'
size_hint: 0.15,1
Label:
StyledIconStyledToggleButton:
id: pause
height: self.width
size_hint: 1, None
icon_margin: 0.2 * self.size[0]
icon: 'img/flaticon/pause.png'
state: 'down' if root.paused else 'up'
on_press: root.paused = not root.paused
Label:
<ScoreGraph>:
background: BOX_BACKGROUND_COLOR
whalf: root.pos[1]+self.height*0.25*(1 + 2 * root.marginy)
bhalf: root.pos[1]+self.height*0.75*(1 - 2/3 * root.marginy)
mid: root.pos[1]+self.height*0.5
right_edge: root.pos[0] + root.width * (1 - root.marginx)
canvas.before:
Color:
rgba: GREY
Line:
points: [root.pos[0]+self.width*root.marginx,root.whalf,root.pos[0]+self.width*(1-root.marginx),root.whalf]
width: 1.0
dashes: [1,2]
Line:
points: [root.pos[0]+self.width*root.marginx,root.mid,root.pos[0]+self.width*(1-root.marginx),root.mid]
width: 1.0
dashes: [4,4]
Line:
points: [root.pos[0]+self.width*root.marginx,root.bhalf,root.pos[0]+self.width*(1-root.marginx),root.bhalf]
width: 1.0
dashes: [1,2]
Line:
rectangle: [root.pos[0] + root.marginx * self.width, root.pos[1] + root.marginy*self.height, self.width*(1-2*root.marginx), root.height*(1-2*root.marginy)]
canvas.after:
Color:
rgba: BLACK
Line:
points: root.line_points
width: 1.1
Color:
rgba: GRAPH_DOT_COLOR
Ellipse:
id: dot
pos: root.dot_pos
size: self.highlight_size,self.highlight_size
GraphMarkerLabel:
font_size: 0.1 * root.height
id: range_label_top
pos: root.right_edge - self.width-1, root.pos[1]+root.height*(1-root.marginy) - self.font_size
text: 'B+' + str(int(root.y_scale))
GraphMarkerLabel:
font_size: 0.1 * root.height
pos: root.right_edge - self.width-1, root.mid - self.height/2 + 2
text: 'Jigo'
GraphMarkerLabel:
font_size: 0.1 * root.height
pos: root.right_edge - self.width-1, root.pos[1]
text: 'W+' + str(int(root.y_scale))
<StatsBox@BoxLayout>
orientation: 'vertical'
CensorableLabel:
id: win_rate
label: 'Win rate'
text: ''
CensorableLabel:
id: score
label: 'Score Estimate'
text: ''
CensorableLabel:
id: point_loss
label: 'Score Estimate'
text: ''
<ScrollableLabel>:
do_scroll_x: False
scroll_type: ['bars']
bar_width: 5
bar_color: BUTTON_COLOR
label: label
canvas.before:
Color:
rgba: root.border_color
Line:
rectangle: [self.pos[0],self.pos[1]+1,self.width-1,self.height-2]
width:1
Color:
rgba: [*[(c+1)/2 for c in root.border_color[:3]], root.border_color[3]]
Line:
rectangle: [self.pos[0]+1,self.pos[1]+2,self.width-3,self.height-3]
width:1
Label:
id: label
markup: root.markup
padding: 5, 5
font_size: dp(18)
color: BLACK
size_hint_y: None
height: self.texture_size[1]
text_size: self.width, None
text: root.text
on_ref_press: root.dispatch('on_ref_press',args[1])
#:set PLAYER_BOX_HEIGHT 0.15
#:set TIMER_BOX_HEIGHT 0.3
#:set GRAPH_BOX_HEIGHT 0.33
#:set STATS_BOX_HEIGHT 0.27
#:set INFO_BOX_HEIGHT 1
#:set CP_SPACING 2
#:set CP_PADDING 2
<ControlsPanel>:
katrain: app.gui
orientation: 'vertical'
players: {'B':B_player,'W':W_player}
ponder: ponder
timer:timer
graph: graph
stats: stats
info: info
note: note
status: status
padding: CP_PADDING
spacing: CP_SPACING
BoxLayout: # -- Players
size_hint_y: PLAYER_BOX_HEIGHT
PlayerInfo:
id: B_player
PlayerInfo:
id: W_player
BoxLayout:
size_hint_y: TIMER_BOX_HEIGHT
spacing: CP_SPACING
PonderInfo:
id: ponder
size_hint_x: 0.2
Timer:
id: timer
size_hint_x: 0.7
ScoreGraph:
size_hint_y: GRAPH_BOX_HEIGHT
id: graph
BoxLayout:
size_hint_y: STATS_BOX_HEIGHT
StatsBox:
id: stats
BoxLayout:
size_hint_y: INFO_BOX_HEIGHT
orientation: 'vertical'
ScrollableLabel:
id: status
size_hint: 1, None
height: 50 #min(self.parent.height*0.66,self.label.text_size[1])
ScrollableLabel:
id: info
markup: True
on_ref_press: root.katrain.board_gui.show_pv_from_comments(args[1])
size_hint: 1, None
height: self.parent.height - status.height - note.height - 1
TextInput:
id: note
size_hint: 1, None
on_text: root.katrain.set_note(self.text)
hint_text: 'Your SGF notes for this position here.'
height: min( (len(self._lines)+0.7) * self.line_height, self.parent.height - status.height - 2.7*self.line_height)
<RHSButton@MDRectangleFlatButton>:
height: self.width * 0.3
width: self.parent.width
canvas.before:
Color:
rgb: (1,0,0,1)
Rectangle:
pos: self.pos
size: (self.size[0]-2,self.size[1]-5)
<ButtonBox@BoxLayout>
orientation: 'vertical'
spacing: CP_SPACING
<RightButtonControls@BoxLayout>:
orientation: 'vertical'
padding: CP_PADDING,CP_PADDING
spacing: CP_SPACING
ButtonBox:
size_hint: 1,PLAYER_BOX_HEIGHT
RHSButton:
text: 'PASS'
ButtonBox:
size_hint_y: TIMER_BOX_HEIGHT
RHSButton:
text: 'MAN'
RHSButton:
text: 'BYO'
ButtonBox:
size_hint_y: GRAPH_BOX_HEIGHT
RHSButton:
text: 'Win %'
RHSButton:
text: 'Score'
RHSButton:
text: 'PtLoss'
ButtonBox:
size_hint_y: STATS_BOX_HEIGHT
RHSButton:
text: 'Win %'
RHSButton:
text: 'Score'
RHSButton:
text: 'PtLoss'
ButtonBox:
size_hint_y: INFO_BOX_HEIGHT
<OldControls@BoxLayout>
orientation: 'horizontal'
BoxLayout: # ----------- analyze -----------
size_hint: 0,1
id: analyze_tab
padding: [3,3]
opacity: 0
orientation: 'vertical'
GridLayout:
cols: 5
rows: 2
size_hint: 1, 0.3
CheckBoxHintLabel:
text: 'next\nmoves'
tooltip_text: '[q]\nShow all next moves\nplayed from the current position'
CheckBoxHintLabel:
text: 'all\ndots'
tooltip_text: '[w]\nShow evaluation dots\non stones for all moves'
CheckBoxHintLabel:
text: 'top\nmoves'
tooltip_text: '[e]\nShow top\npredicted moves'
CheckBoxHintLabel:
text: 'show\nowner'
tooltip_text: '[r]\nShow predicted ownership\nof each intersection'
CheckBoxHintLabel:
text: 'NN\npolicy'
tooltip_text: "[t]\nShow Policy top moves\n(i.e. with no 'reading')"
CheckBox:
id: show_children
active: True
on_active: root.katrain.update_state()
CheckBox:
id: eval
on_active: root.katrain.update_state()
CheckBox:
id: hints
on_active: root.katrain.update_state()
CheckBox:
id: ownership
on_active: root.katrain.update_state()
CheckBox:
id: policy
on_active: root.katrain.update_state()
BoxLayout:
spacing:1
padding: 1,2,1,2
size_hint: 1,0.2
DarkLabel:
text: 'Analysis'
size_hint: 1, 1
multiline: False
font_size: 0.45*self.size[1]
StyledButton:
id: analyze_extra
text: 'Extra'
tooltip_text: '[a]\nExtra analysis\nto increase accuracy\nof top move predictions\nand score difference'
size_hint: 1, 1
on_press: if not self.last_touch or self.last_touch.button=="left": root.katrain("analyze-extra","extra")
StyledButton:
id: analyze_equalize
text: 'Equalize'
tooltip_text: '[s]\nAnalysis of all\npredicted top moves\nwith the same accuracy'
size_hint: 1, 1
on_press: if not self.last_touch or self.last_touch.button=="left": root.katrain("analyze-extra","equalize")
StyledButton:
id: analyze_sweep
text: 'Sweep'
tooltip_text: '[d]\nFast analysis\nof all legal moves'
size_hint: 1, 1
on_press: if not self.last_touch or self.last_touch.button=="left": root.katrain("analyze-extra","sweep")
ScoreGraph:
id: graph
size_hint: 1,0.7
BoxLayout:
orientation: 'vertical'
size_hint: 1,0.3
spacing: 3
BoxLayout: # ----------- play -----------
orientation: 'vertical'
size_hint: 1,1
opacity: 1
id: play_tab
Label:
size_hint: 1,0.02
GridLayout:
cols: 4
rows: 2
spacing: 1
padding: 1
size_hint: 1,0.125
BlackCircleWithText:
text: 'B'
size_hint: 0.1, 1
ToggleButtonContainer:
size_hint: 0.6, 1
id: B_player_mode
options: PLAYER_MODE_VALUES
labels: PLAYER_MODES
tooltips: PLAYER_TOOLTIPS
on_selection: root.katrain.update_state()
StyledSpinner:
id: B_AI_mode
values: ['Default']
size_hint: 0.3, 1
on_text: if B_player_mode.children: B_player_mode.children[0].trigger_action(duration=0)
Label:
size_hint: None,1
width: 3
WhiteCircleWithText:
text: 'W'
size_hint: 0.1, 1
ToggleButtonContainer:
size_hint: 0.6, 1
id: W_player_mode
options: PLAYER_MODE_VALUES
labels: PLAYER_MODES
tooltips: PLAYER_TOOLTIPS
on_selection: root.katrain.update_state()
StyledSpinner:
id: W_AI_mode
size_hint: 0.3, 1
values: ['Default']
on_text: if W_player_mode.children: W_player_mode.children[0].trigger_action(duration=0)
BoxLayout:
size_hint: 1,0.05
padding: 5,0
spacing: 1
StyledButton:
text: 'Configure Teacher'
tooltip_text: "Undos, dots, and\nSGF output settings"
on_release: if not self.last_touch or self.last_touch.button=="left": root.configure_teacher()
size_hint: 1.425, 1
StyledButton:
text: 'Configure AIs'
tooltip_text: "Strength Settings per AI"
on_release: if not self.last_touch or self.last_touch.button=="left": root.configure_ais()
Label:
size_hint: 1,0.1
BoxLayout:
orientation: 'horizontal'
size_hint: 1, None
spacing: 2
padding: 2
height: self.width * 0.25
StyledIconButton:
icon: 'img/flaticon/go-game.png'
tooltip_text: '[Ctrl-N]\nNew Game'
size_hint: 0.25, 1
on_release: if not self.last_touch or self.last_touch.button=="left": root.katrain("new-game-popup")
StyledIconButton:
icon: 'img/flaticon/open-folder.png'
tooltip_text: '[Ctrl-L]\nLoad Game'
size_hint: 0.25, 1
on_release: if not self.last_touch or self.last_touch.button=="left": root.katrain("analyze-sgf-popup")
StyledIconButton:
icon: 'img/flaticon/bar.png'
tooltip_text: '[Ctrl-S]\nSave Game'
size_hint: 0.25, 1
on_release: if not self.last_touch or self.last_touch.button=="left": root.katrain('output-sgf')
StyledIconButton:
icon: 'img/flaticon/gears.png'
tooltip_text: 'General Settings'
size_hint: 0.25, 1
on_release: if not self.last_touch or self.last_touch.button=="left": root.katrain('config-popup')
<KaTrainGui>:
board_gui: board_gui
controls: controls
board_controls: board_controls
analysis_controls: analysis_controls
zen: False
canvas.before:
Color:
rgb: BACKGROUND_COLOR
Rectangle:
pos: self.pos
size: self.size
BoxLayout:
orientation: 'vertical'
AnalysisControls:
id: analysis_controls
size_hint_y: None
height: min(100,self.width / 13.5)
BadukPanWidget:
id: board_gui
BadukPanControls:
id: board_controls
size_hint_y: None
height: min(100,self.width / 13.5)
ControlsPanel:
id: controls
size_hint_x: None
width: 0 if root.zen else self.height * 0.4
opacity: 0 if root.zen else 1
RightButtonControls:
id: button_controls
size_hint_x: None
hidden: False
width: 0 if root.zen else controls.width * 0.3
opacity: 0 if root.zen else 1
<LoadSGFPopup>:
fast: fast
rewind: rewind
filesel: filesel
orientation: 'vertical'
Label:
text: root.filesel.path
size_hint: 1,0.05
halign: 'left'
FileChooserListView:
id: filesel
multiselect: False
filters: ["*.sgf"]
path: "."
size_hint: 1,0.88
BoxLayout:
orientation: 'horizontal'
size_hint: 1,0.07
canvas.before:
Color:
rgb: 0.4, 0.4, 0.4
Rectangle:
pos: self.pos
size: self.size
Label:
text: "Analyze Extra Fast"
size_hint: 0.45,1
halign: 'right'
CheckBox:
id: fast
color: (0.95, 0.95, 0.95)
size_hint: 0.05,1
Label:
text: "Rewind to Start"
halign: 'right'
size_hint: 0.45,1
CheckBox:
id: rewind
active: True
color: (0.95, 0.95, 0.95)
size_hint: 0.05,1
<QuickInputButton@StyledButton>
on_press: if not self.last_touch or self.last_touch.button=="left": self.parent.parent.children[self.parent.parent.children.index(self.parent)+1].text = self.text # why +1 instead of -1?
<NewGamePopup>:
orientation: 'vertical'
rules_spinner: rules_spinner
info: info
restart: restart
GridLayout:
size_hint: 1, 0.8
rows: 6
cols: 3
spacing: 2
padding: 2
ScaledLightLabel:
text: "Size"
LabelledTextInput:
text: '19'
font_size: 0.5*self.size[1]
padding: 7, 0.2*self.size[1]
input_property: 'SZ'
BoxLayout:
spacing: 1
QuickInputButton:
text: '9'
QuickInputButton:
text: '13'
QuickInputButton:
text: '19'
ScaledLightLabel:
text: "Handicap"
LabelledIntInput:
text: '0'
input_property: 'HA'
BoxLayout:
spacing: 1
QuickInputButton:
text: '0'
on_press: if not self.last_touch or self.last_touch.button=="left": km.text='6.5'
QuickInputButton:
text: '2'
on_press: if not self.last_touch or self.last_touch.button=="left": km.text='0.5'
QuickInputButton:
text: '9'
on_press: if not self.last_touch or self.last_touch.button=="left": km.text='0.5'
ScaledLightLabel:
text: "Komi"
LabelledFloatInput:
text: '6.5'
id: km
input_property: 'KM'
BoxLayout:
spacing: 1
QuickInputButton:
text: '0.5'
QuickInputButton:
text: '5.5'
QuickInputButton:
text: '6.5'
ScaledLightLabel:
text: "Ruleset"
LabelledSpinner:
input_property: 'RU'
id: rules_spinner
Label:
ScaledLightLabel:
text: 'Clear cache'
CheckBox:
color: WHITE
id: restart
ScaledLightLabel:
font_size: 0.35*self.size[1]
text: 'avoids replaying\nidentical games'
LightHelpLabel:
text: "Use x:y (e.g. 19:9) to play on a non-square board."
size_hint: 1,2
text_size: self.width-6, None
font_size: self.size[1]/6
id: info
LightHelpLabel:
text: "Note that handicaps above 9 are not supported on non-square boards."
font_size: self.size[1]/6
text_size: self.width-6, None
id: info
StyledButton:
halign: 'center'
text: 'Start\nGame'
font_size: 0.3 * self.size[1]
on_press: if not self.last_touch or self.last_touch.button=="left": root.new_game()