From 3570bdf8b2e0f5ce1c97a405f0ed53cddd7c1677 Mon Sep 17 00:00:00 2001 From: Sander Land Date: Fri, 5 Jun 2020 20:15:29 +0200 Subject: [PATCH] detailed comment tab, save comment on note, styling --- CONTRIBUTORS | 1 + INSTALL.md | 3 +- README.md | 2 +- katrain/__main__.py | 21 +++++++++----- katrain/core/game_node.py | 17 ++++++------ katrain/gui.kv | 25 +++++++++++------ katrain/gui/controlspanel.py | 4 +-- katrain/gui/kivyutils.py | 2 +- katrain/gui/style.py | 1 + .../i18n/locales/en/LC_MESSAGES/katrain.mo | Bin 10630 -> 10671 bytes .../i18n/locales/en/LC_MESSAGES/katrain.po | 3 ++ .../i18n/locales/fr/LC_MESSAGES/katrain.mo | Bin 11759 -> 11802 bytes .../i18n/locales/fr/LC_MESSAGES/katrain.po | 4 +++ .../i18n/locales/haha/LC_MESSAGES/katrain.mo | Bin 11554 -> 11603 bytes .../i18n/locales/haha/LC_MESSAGES/katrain.po | 3 ++ .../i18n/locales/ko/LC_MESSAGES/katrain.mo | Bin 12078 -> 12121 bytes .../i18n/locales/ko/LC_MESSAGES/katrain.po | 4 +++ katrain/popups.kv | 26 ++++++++++-------- 18 files changed, 76 insertions(+), 40 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 1f37d7a..e1b4b25 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -5,6 +5,7 @@ Many thanks to these additional authors: Matthew Allred ("Kameone") for design of the v1.1 UI and providing MacOS installation instructions. "isty2e" for Korean translation. "Dontbtme" for detailed feedback and early testing of v1.0, and French translation. +"bale-go" for implementing and calibrating the 'calibrated rank' AI. Additional thanks to: "Seventeen" for explanatory youtube videos. diff --git a/INSTALL.md b/INSTALL.md index 76046cf..7cc515d 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -2,11 +2,12 @@ # Installation for MacOS users ## Installation pre-requisites -* Download and install [Python 3.7.5](https://www.python.org/downloads/release/python-375/) * Install [Homebrew](https://brew.sh) by running the following command in terminal: * ``` /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" ``` +* Install Python using [Homebrew](https://brew.sh/) by executing `brew install python3` + * Alternatively download and install [Python 3.7.5](https://www.python.org/downloads/release/python-375/) * Install Katago using [Homebrew](https://brew.sh/) by executing `brew install katago` * You can also follow instructions [here](https://github.com/lightvector/KataGo) to compile KataGo yourself. diff --git a/README.md b/README.md index 1f50bd3..047275b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# KaTrain v1.1 +# KaTrain v1.1 [![Latest Release](https://img.shields.io/github/release/sanderland/katrain?label=download)](https://github.com/sanderland/katrain/releases) [![License:MIT](https://img.shields.io/pypi/l/katrain)](https://en.wikipedia.org/wiki/MIT_License) ![Build Status](https://github.com/sanderland/katrain/workflows/release/badge.svg) diff --git a/katrain/__main__.py b/katrain/__main__.py index a7117cb..efd0895 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -64,7 +64,7 @@ from katrain.core.game import Game, IllegalMoveException, KaTrainSGF from katrain.core.sgf_parser import Move, ParseError from katrain.gui.kivyutils import * from katrain.gui.popups import ConfigPopup, LoadSGFPopup, NewGamePopup, AIPopup -from katrain.gui.style import ENGINE_BUSY_COL, ENGINE_DOWN_COL, ENGINE_READY_COL +from katrain.gui.style import ENGINE_BUSY_COL, ENGINE_DOWN_COL, ENGINE_READY_COL, LIGHTGREY from katrain.gui.widgets.graph import ScoreGraph from katrain.gui.widgets.filebrowser import I18NFileBrowser from katrain.gui.badukpan import AnalysisControls, BadukPanControls, BadukPanWidget @@ -431,21 +431,28 @@ class KaTrainGui(Screen, KaTrainBase): class KaTrainApp(MDApp): gui = ObjectProperty(None) language = StringProperty(DEFAULT_LANGUAGE) + + def __init__(self): + super().__init__() +# self.theme_cls.selected_color = WHITE +# self.theme_cls.secondary_text_color = LIGHTGREY + def build(self): self.icon = ICON # how you're supposed to set an icon + self.title = f"KaTrain v{VERSION}" + self.theme_cls.theme_style = "Dark" + self.theme_cls.primary_palette = "Gray" + self.theme_cls.primary_hue = "200" + kv_file = find_package_resource("katrain/gui.kv") popup_kv_file = find_package_resource("katrain/popups.kv") resource_add_path(os.path.split(kv_file)[0]) Builder.load_file(kv_file) Builder.load_file(popup_kv_file) - self.gui = KaTrainGui() - self.title = f"KaTrain v{VERSION}" - self.theme_cls.theme_style = "Dark" - self.theme_cls.primary_palette = "Blue" - Window.bind(on_request_close=self.on_request_close) + self.gui = KaTrainGui() return self.gui def on_language(self, _instance, language): @@ -459,7 +466,7 @@ class KaTrainApp(MDApp): self.gui.controls.set_status("") def webbrowser(self, site_key): - WEBSITES = {"homepage": HOMEPAGE, "support": HOMEPAGE + "#support"} + WEBSITES = {"homepage": HOMEPAGE + "#manual", "support": HOMEPAGE + "#support"} if site_key in WEBSITES: webbrowser.open(WEBSITES[site_key]) diff --git a/katrain/core/game_node.py b/katrain/core/game_node.py index 527b5d3..d832775 100644 --- a/katrain/core/game_node.py +++ b/katrain/core/game_node.py @@ -29,6 +29,7 @@ class GameNode(SGFNode): def sgf_properties(self, save_comments_player=None, save_comments_class=None, eval_thresholds=None): properties = copy.copy(super().sgf_properties()) + note = self.note.strip() if self.points_lost and save_comments_class is not None and eval_thresholds is not None: show_class = save_comments_class[evaluation_class(self.points_lost, eval_thresholds)] else: @@ -39,7 +40,7 @@ class GameNode(SGFNode): and self.analysis_ready and self.parent and self.parent.analysis_ready - ): + ) or note: candidate_moves = self.parent.candidate_moves top_x = Move.from_gtp(candidate_moves[0]["move"]).sgf(self.board_size) best_sq = [ @@ -59,7 +60,7 @@ class GameNode(SGFNode): + "\n".join(properties.get("C", "")) + "\nSGF with review generated by KaTrain." ] - if self.note.strip(): + if note: properties["C"] = ["\n".join(properties.get("C", "")) + f"\nNote: {self.note}"] return properties @@ -154,7 +155,7 @@ class GameNode(SGFNode): pvtext = f"[u][ref={pvtext}][color={INFO_PV_COLOR}]{pvtext}[/color][/ref][/u]" return pvtext - def comment(self, sgf=False, teach=False, hints=False, interactive=True): + def comment(self, sgf=False, teach=False, details=False, interactive=True): single_move = self.move if not self.parent or not single_move: # root return "" @@ -167,7 +168,7 @@ class GameNode(SGFNode): text += i18n._("Info:winrate").format(winrate=self.format_winrate()) + "\n" if self.parent and self.parent.analysis_ready: previous_top_move = self.parent.candidate_moves[0] - if sgf or hints: + if sgf or details: if previous_top_move["move"] != single_move.gtp(): points_lost = self.points_lost if sgf and points_lost > 0.5: @@ -181,7 +182,7 @@ class GameNode(SGFNode): ) else: text += i18n._("Info:best move") + "\n" - if previous_top_move.get("pv") and (sgf or hints): + if previous_top_move.get("pv") and (sgf or details): text += ( i18n._("Info:PV").format( pv=self.make_pv(single_move.player, previous_top_move["pv"], interactive) @@ -189,7 +190,7 @@ class GameNode(SGFNode): + "\n" ) - if sgf or hints or teach: + if sgf or details or teach: policy_ranking = self.parent.policy_ranking currmove_policy_with_ix = [ (ix + 1, p) @@ -203,7 +204,7 @@ class GameNode(SGFNode): ) + "\n" ) - if not currmove_policy_with_ix or currmove_policy_with_ix[0] != 1 and (sgf or hints): + if not currmove_policy_with_ix or currmove_policy_with_ix[0] != 1 and (sgf or details): text += ( i18n._("Info:policy best").format( move=policy_ranking[0][1].gtp(), probability=policy_ranking[0][0] @@ -215,7 +216,7 @@ class GameNode(SGFNode): top_pv = self.analysis_ready and self.candidate_moves[0].get("pv") if top_pv: text += i18n._("Info:undo predicted PV").format(pv=f"{self.next_player}{' '.join(top_pv)}") + "\n" - if self.ai_thoughts and (sgf or hints): + if self.ai_thoughts and (sgf or details): text += "\n" + i18n._("Info:AI thoughts").format(thoughts=self.ai_thoughts) else: text = i18n._("No analysis available") if sgf else i18n._("Analyzing move...") diff --git a/katrain/gui.kv b/katrain/gui.kv index 3998790..c7471f7 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -12,6 +12,7 @@ #:import RED katrain.gui.style.RED #:import WHITE katrain.gui.style.WHITE +#:import LIGHTGREY katrain.gui.style.LIGHTGREY #:import BACKGROUND_COLOR katrain.gui.style.BACKGROUND_COLOR #:import BOX_BACKGROUND_COLOR katrain.gui.style.BOX_BACKGROUND_COLOR #:import TEXT_COLOR katrain.gui.style.TEXT_COLOR @@ -19,14 +20,13 @@ #:import BOX_BACKGROUND_COLOR katrain.gui.style.BOX_BACKGROUND_COLOR #:set SPINNER_OPTION_COLOR [64 / 255, 85 / 255, 110 / 255, 1] -#:set LIGHTGREY [0.7,0.7,0.7,1] #:set BLACK [0.05,0.05,0.05,1] #:set GREY [0.5,0.5,0.5,1] #:set GREEN [0.1,0.8,0.1,1] #:set LIGHTBLUE [0.3,0.7,0.9,1] #:set YELLOW [0.8,0.8,0.1,1] #:set DARKRED [0.3,0.1,0.1,1] - +#:set ORANGE [242/255,96/255,34/255,1] #:set SCORE_COLOR LIGHTBLUE #:set POINTLOSS_COLOR YELLOW @@ -65,6 +65,7 @@ # new widgets + : ripple_duration_in_slow: 0.6 text_color: TEXT_COLOR @@ -301,7 +302,7 @@ min_size: min(self.height,self.width) inactive_line_color: WHITE inactive_fill_color: [1,1,1,0] - active_line_color: [242/255,96/255,34/255,1] + active_line_color: ORANGE active_fill_color: [1,1,1,0] line_width: max(1.1,self.min_size/20) line_color: root.active_line_color if self.active else root.inactive_line_color @@ -332,7 +333,8 @@ - color: GREEN + timeout: False + color: ORANGE if self.timeout else GREEN markup: True multiline: False font_name: 'fonts/digital-7 (mono).ttf' @@ -341,6 +343,7 @@ spacing: CP_SPACING padding: CP_PADDING * 4, CP_PADDING * 2 paused: True + timeout: self.state[1] <= 0 MDBoxLayout: size_hint: 0.7,1 MDFloatLayout: @@ -355,6 +358,7 @@ valign: 'middle' TimerLabel: id: timer + timeout: root.timeout text: "{:01d}:{:02d}".format(int(root.state[0]+0.99)//60,int((root.state[0]+0.99) % 60) ) text_size: self.size font_size: 0.85*self.height @@ -368,6 +372,7 @@ text_size: self.width, self.height * 0.95 halign: 'right' valign: 'top' + timeout: root.timeout TimerLabel: size_hint: 0.1,1 font_size: self.height * 0.35 @@ -377,6 +382,7 @@ id: periods text: str(root.state[1]) multiline: False + timeout: root.timeout MDBoxLayout: size_hint: 0.2,1 PauseButton: @@ -631,14 +637,16 @@ CollapsablePanel: size_hint_y_open: 1 closed_label: 'closedlabel:info¬es' - options: ['info','notes'] - option_colors: [WHITE,WHITE] - option_active: [True,False] + options: ['info','info-details','notes'] + option_colors: [WHITE,WHITE,YELLOW] + option_active: [True,False,False] on_option_state: info.size_hint_y = int(args[1]['info'])+1e-9 info.opacity = int(args[1]['info']) + info.detailed = args[1]['info-details'] notebox.size_hint_y = int(args[1]['notes'])*0.66+1e-9 notebox.opacity = int(args[1]['notes']) + app.gui.update_state() options_height: root.tab_option_height BGBoxLayout: background_color: BOX_BACKGROUND_COLOR @@ -651,6 +659,7 @@ background_color: DARKRED ScrollableLabel: id: info + detailed: False line_height: 1.25 markup: True on_ref_press: root.katrain.board_gui.show_pv_from_comments(args[1]) @@ -700,8 +709,6 @@ pos_hint: {'center_y': 0.5} width: self.height active: root.default_active - selected_color: WHITE - unselected_color: LIGHTGREY on_active: if app.gui: app.gui.update_state() : diff --git a/katrain/gui/controlspanel.py b/katrain/gui/controlspanel.py index 8b35aac..35dc18c 100644 --- a/katrain/gui/controlspanel.py +++ b/katrain/gui/controlspanel.py @@ -84,11 +84,11 @@ class ControlsPanel(BoxLayout): self.active_comment_node = current_node.parent lock_ai = katrain.config("trainer/lock_ai") and katrain.play_analyze_mode == MODE_PLAY - hints = katrain.analysis_controls.hints.active and not lock_ai + details = self.info.detailed and not lock_ai info = "" if current_node.move and not current_node.is_root: info = self.active_comment_node.comment( - teach=katrain.players_info[self.active_comment_node.player].being_taught, hints=hints + teach=katrain.players_info[self.active_comment_node.player].being_taught, details=details ) if self.active_comment_node.analysis_ready: diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index ae52b16..be9060a 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -302,7 +302,7 @@ class PlayerInfo(MDBoxLayout, BackgroundMixin): class Timer(BGBoxLayout): state = ListProperty([30, 5, 1]) - + timeout = BooleanProperty(False) class AnalysisToggle(MDBoxLayout): text = StringProperty("") diff --git a/katrain/gui/style.py b/katrain/gui/style.py index 53eddc9..cd35d55 100644 --- a/katrain/gui/style.py +++ b/katrain/gui/style.py @@ -7,6 +7,7 @@ DEFAULT_FONT = "fonts/NotoSans-Regular.ttf" # basic color definitions RED = [0.8, 0.1, 0.1, 1] WHITE = [0.95, 0.95, 0.95, 1] +LIGHTGREY = [0.7,0.7,0.7,1] # gui colors diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo index 88acc059ac16c912ae0fece19f56ec01cd4b3f48..9f3add45359cb97ccdd47dc4927a7ca7d11b98dc 100644 GIT binary patch delta 2571 zcmYM!duWzb9KiA8oSU0Ebz7Ua+}hO5dWV=uEX_Z1V?BxU#W5xZebs~RW`O< zfX-JDos~oWP2GGd9OzM`PpCs9eIb^&#qxV-yLNO1ooIkZ(Sc8+6ZPX*OrtT6VLTdG z1-j5mbRkv4$-f=vQensC=;7IbdAJQd^=)XoFQSLg0Zv6Ppog>{Gw?Dx-c{rZIdr}i z2s(ZRT7SR!cclx^OstMJpb9gEGNhC-~bcQ38$hF-iKUa0XO${722U5ZMPBaw>8!`qXW01fqWdx-Dvw`Xuzk@ ze!VG^;R+8%nno`N7=lhT4&AFsu{;$WXa?G@23^@=G_`AE{TAd3Z*numJJI(Y=)_;6 z3p|STe*YJEAcioX4R^0s;v(FP^YH|hV+p;+;38azSz|&th>zob zEaThj!Hd|1`$^L!eDQV;D6S!mGX{h(t%&>|p`xKUgqLyV9jVB=(Zg~WJqtZpg6GkI z(kU27J{oWlGIvNIyBTWGeoL?zSE22j&`h+T8E-8i|5mh7;i1|UU+hDY61ve${Dgi5 zy=dw#$NC%Sz&WL<`qAhXO+?47Ml(DQ*{!e)4Rk$D#^xjsWHEe+?)49`d>toH&gbU) zN_6G5cn>~_<+uYmpW$0Hu#;%!en&I#7rL+;=r7{1iK#<484V=4kOxoobFrcYovi424>_k_10v-4q`uY8d22x1DK+7-<6F3N`UaROc8OdNpK(Hb=isLjTKMhV9L*; z-~UG3gxh0z(B#xWW6@Jyj7~faP5o>%gG;d*>+tQ0ysFQ#Z)OgyTl-W)#j4foSJu_9 S+k1WFw1Uj4SV)vF8So!)>F>?} delta 2535 zcmYM!eMsL$9Ki8&IcHiv&9q>M0o^6)98R_@EV+q_4LdT3~(+Qa|PyO4Z5Iv@e164 zT%nnp{WfC;^M?clBi@cquw(i`2)ogaebFK03WvGb?>HLpINI+QG~lWD+zQ2zjV`bd zeXk0AZ<#WGxQ~J(S8{WVtWDF zUV-*siU|jl=`t!&b;U#n>uVOm(p#9!OC)kH(@Ce%POLPmz(5?DC*3)>& z`HG@dS>)f;t)RhyYLUL75smceSZ|N@ZD_wY(G~Qf0UkgH9z`b}$3mP$u8_q`23CYF zv;tko;%xHoi_2*6#d`GcY{1#rj-L8XwBLKtVRV4cqu-#1bR5(0M|8ZOktBh|MQ--niDs$?ecp?XGmHlE1sdSj=oXBj@BM~c z;qO>aWROP($VVqEK_je0uCR)md;1VNKoi<;Bl_NRu|0tf{4yHIu2}C!`yWID9!1~# zK4~JHrC_9!=mh_udo+_#tmmKu6rdB7p(|Q~rnD}$Hz8MemYb>Fiavh@o$xJmVSTs> zKfzqT|0*`xJzj~AU?Z-@0W8N9-nt%dLIbTue^?&G8?hA^VHe(k$Iyvq5T)(8cnjWz z*J2AYbl8Tee*fJRd|@|oh4;CY;ZbbE^Ee+ja-w>%0}o;K+~hCYBr<2XfZdqMYCME{ z(17M+CLz;fY$BIH2!CKOIXA0ZIYK~K{FDCz6DHN6@BkM*F$sTm?hj0NNMguy71~P>P zd{~QrKOtB6mzx1CWL0Kh5jx&-G_ZRx4IfChC&Hr?+{?$&4lQUPZD{Iu zpefviu5bVy_z?Q}eT4>c0Sz>b#u=E2GcgO(Fdz9qLLr*Ln(624e-i~Gej+|-LBV)fD{h>#z-e2PIyQrep&ftDJUqDh)dR!CvWPH9V zx)Hfjp_aQ7?8RH~2o~T8?1$&kn0`Yi`~wGKdf%S&0MZnS(G8Zw z_9^JN8Or)$J_S=$j&`gz^r-A?y#QS= z5uK7t{!QJJG&s>bWK1YWBYiE_H^ll5wBJ5-2ZzxBThNKy(1kj22&U7SVi<-7mOwW; z3Ejxl{^Z|*GiY$&LiFWXfw$rY^sTQ&`+X5@Mkn|wdI5b&J24Zx(fR&Du8_;%n}MM7 zC(!ms%)dLGjb@@Ox(toD3feWR0I0_Fgi~&8pzLRfalO7xQveb7r8<< z>9d|Hq~HXj&;?7;2qz;~n9a?zU4jlsqWxY)$5qGn&FI8C(Lg?m^`mJ2lW4$g=(tNg zrouG}Mw-qjC+LeVG!#9n(Xn2NPIN!oZyLI@xoB!DV*6_33Y)l@;yU#C0d(Q7&<(cW zOMd?sD0tRSa2t(_aWSsP=kY4uhcg*GZX=^h;D_dkn*XSNg_kiMz_?B-YT4YcPW- zeHquG8QzE<e%wU{!+?@@5zr|5uVXsS=315Tq8w4-PEE7s#RT#7r1c6eF{X?$~o zaU|QT#0QG__2l{fVf;K(f4Mk>BHTKh_YE6IkpFxNXGZcL1$L5O&* zE4+aQP=mgdpP&mLLIZ6=Gu4XDa}MvtOK87gV|wOIAg325qVK>AEWwp23L_|dfKJqm zz8tMM3V)9ljE!$UGIyAUzLXW{_&u13-=Tq?Lf@&j*xrE#a1qDhKbXMO7;0oI%t0f1 z9ZlID?1QJ#)ODZ}UWxTCbcZ+43}uh!+_4Bt@gcPR70kkQXn>p0quGiaMJjwq!81IF zp80V!6YXfkSI|_a5uFR>qGwoyE>MD|^g-kc3`umMHJF2M#`@dQ8g$+|9P9Ugh=LKG zN4}hJ8BK9Ivzm!<$Zu4bi|+76G!q-KH*SgUKo_h<-sP}2x-YgjU^eZC(D7em<^l>$ z6rAW}?9ht-!nI>9cA-1p#DN*;F0}rB^t0$Obb%jmGM;VxGW)SU{mLs|Se95)wtP`} bva<0;-mb#zl7}l6C95jSD;u{>n3wh+s2=`7 delta 2528 zcmYM#e@s?Y7{Kwv;&+Aynu#G`hLVa}i2V_BxpFzg)vPU&X2pmo{Ueh~7kib;)EO1! zG}2nJASbTcJIh*-wJd=OYpq2zXLA*9H65+Bidx^VoGo{`pL6a#Kc4fPb6?wQ&#p*crcp9hRXsl;m7=i&#MPn|-$#^xopd0Z5tVgcU z$jx?5n9cklLBWW3q7$^8e-XkfXv6O4+sGA;a z%Fuq5%KV{jtvVO$>2z|w zf@oO|`8Rb-dEh`RkhY-)jkF=wH^=&RwB3v73J#(H_MijzqZ1F~bR0#lkV7W}D?k@o ziY}ylBKfytB@gVl3Ozjan1`FuQ{RfV>xv#h2k47_g&xvjOvh8`ct0ao_?O%HKp4dF z3()6RnSWQh49&!?(Y0vAjpz!SkSnxsv)yxOruL)n52E87K?4~;13ZCl!4TT-EOLcE zV?B{g9vxsZI$<#y;e6x@%ec9>x1a;mqV4WM`)!EN6X?J@&_LQ_{Sex|7Y(={?f31t ziSQ!@BOOI2_#54$G)A#L2^}CGouC9=(GoPJ)$w^Pa)tHWOzjr*{WIu;y)O4TPQzWX-iZsS_hSYAg*V|MqBDRNT#aow4}U^` zkn%Vf6vIMH_4{8=!46fJk87|3AHo(qgsx=a)DYgprT875Lx0%@IHANE25~E%Mh{^< z(VE$H=oU6%8aAUDehd?KY^7j_SJ6}-Ksy{p2k1ff?i1|5udx9iA=;u8PCHJ+6qffO zPA}m958gjLBZS%1R~B;Oabr;kv#_n0t-^O^lK(p>^pjurXwDV zpF$_zg9h4(W-5se^Z_o$PtkV&pyN)MJ^ni|1w8}va4yy$NeE9QC^%3TdN`6e3r|FU zkMHy6j33ex^iWo#18l=|d>sw+4fOkeH$Lx0j!!s-rT9J0$8;(rCnU-#7}4!$%C=!9 z9!68wiw@Wq>tCQN96~cRf-`Xp7h&O*FDs-YdF&i6VeM58;I_?%E31JUr`28QHz!wva zBij~!Kr@la==>IiCFlxQpqW^QY4||&VRXV~l7g&WZN=ID;-Ud-Zo7gpk1$-b=RnaQHuz4^(H=G~U^A34tLCjbBd diff --git a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po index 06f18df..5a4cd90 100644 --- a/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/fr/LC_MESSAGES/katrain.po @@ -608,3 +608,7 @@ msgstr "" #. TODO msgid "ai:p:rank" msgstr "Calibrated Rank Bot" + +#. TODO +msgid "tab:info-details" +msgstr "+Analysis" diff --git a/katrain/i18n/locales/haha/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/haha/LC_MESSAGES/katrain.mo index 801b4f42b4f4c5ad3f942214f3f5c0329a2f5be5..6dc15a26af71515ff18c1d2ba58783a3e1ecd1e7 100644 GIT binary patch delta 2568 zcmYM$4QN(X7{KwPTfT12ZGJSJnOkj5+kBS`48$~7izG8qFif3bxa7sPLCa#Mz9eW) zs##d1hA~AcQ(_IWa%M=5C2CPE%ra9-9HIy+Y6bQGy93GH{oQl!`FPHA&fVNT|A+bM z--c$s9r(AEpV9nW&9oH4(X9U+!s9W@Bk^?f1{P5sk{!ZOtipV(!3565T&%@BtdH+k zMqfv+blAq-0Y1dR*og&r1at5V8q+0oz$W+kuq3+B zN$5gq^2om(XHsFuMd;yKj>B*Rdg`~K?e;~x(E)yro<$Go1ss5v(ebV$SIDLFtw7N6 zlW6_J=HHdhK{HVoZA2q(Mpw8Nxx!oAY_|i=)L!)cesr8}G>~7=0Dnifpcn1;FLH$} z(q}n6iU$WMMJKF6Bb{9&Ps`+HXy)Z$$^*j0UnhmJguqkD~#fMEjlZ zGaat+V5I%&hA=a-#uJ8soQ{0BWZ$~Ho3SHna zZ1DR(%fkpNX0zdAFom_a9_QjYti%WDRf@~d0XO2^_&z4_5KhF)I1S5)j>oVRtzU`v z<0n{ze`2BE|81NUS6YO2C`V84LpUB6;A&it_h5o(+cAlU@idyTot)HB_%UwBBj}2s zE9?t+1-j4{Bb^LPlm?&R+ZwvgWAxSHix_v5Q8CjZ}4(Rx=1>+l)!X=J@f*2CZE9_E#VFb<2* zfTp8?EJ6cr#9~~7ey%&vew|o`N743I(5=g4AI0|?*u zRp`oR;}l$qmADh#x*yTNE}@wVWBW2N99>u`lH@QMJ%qJbjOmR$5Nv3V6+fX9UPo6j zg1l=PnzD)LS(t`qW+oa~9h$M1u>!ZC0d=7nIDw9H5#5@9ka5x>=ia^-h3H<6LmNy+ z1DS!Qei@p=W^{$`pabtlKfi-$AQ#aXmepFU?^n*2yYKznbMCp%dCqgs#V=Ow zTA4hXKlzowzwP|4=XY_ktq|VN{NJm&JVg6C9Ex7R651(=5c07M^Kc%f<6_LgI?Tn! zc>mGpv&fMQU7QW@Dqe-XcrCt%+4wn{(^)j&Ih=-Lv7M0>f(aI&IalITycJ#0Qk;ZM z$PrpOIj#*8%pa0mnDI;K1Y57%2%#Gt*c*KpIl>W6jvGW19znt>}uLaR7FqrF{)qbl8uM?~nISpyP+p2`-><{zS(m2x5OB z+Fyx|Uw}yi*K=Xu)#$)AvArIN5jxS8Y{3lNiH>^{o!|gk!Q<$-ljtivgTAWYVtWb? zIbU(KCWrc4x;yDG&^^f5(12#z9NX=&{USPU2fBhDG{Hk?-~n{v5iG(nHospy1dXol6u5f*Xs-QJG|Xhg?7f`$VBH=&7akL~^F_`_(z1L$+7 zCrpO(T$t$?I>A5aJ4z#p?L0IDh0VAEk7ErM@zjmD3=OyrZ@>*$jommOhwv^;BRej`614w8oQqqq z1dri#{2mj2|KnWvKqfoJT{{D-@OIpQ&3F@z;@g;AKyr8(txzXBv=F;+7w$t>d@r+@ za04?R|8`1f;Vv=9j%ZX})qv*gdk(|OsG*BwhEqyK?#8Pa;(>RFp$@&#-CcMnBUI^tl~46MN9aPob4KhwiPh*#5Vi`cu`A%?tKMIl32W&`Q*yyS52U z@X6T!92$6M?0*Y=MMuzyM$r=gf&M3y;ASaS;4Qcm-3w18x$s?Yiyg;t7VYz~oyRg< z`5dgpC0K)<$lD2hXksVP%6)@Y;1as9Nfmt3Scq=I1z3vfklaFYbL=>PW;Beh;BqvL z`dgW)=w2v6D^rCgb~jqFl{g#MqY3RnD{v5vH;5)Sg2wr2qCXk_;=*^CUO6$K5KUwj zTKZ*Z2_HaL*oFq)gnoXnqlpZniGGI}_%r%<<1#v7DrIFqhFr9Q)tKe?-^hg-x5OLm z=quTWW;`7GN6`ePu}sHTq7&bNuJArg$A_XVn4tYQX5rK5o_Qg*w_#2l9lN>kyYEB4 u_o3LXCkq3tL3ei>I$;-D^4)0VKE&lXT-7&_xj3V*G{0kd-#fFrQ~m=z3GG|} diff --git a/katrain/i18n/locales/haha/LC_MESSAGES/katrain.po b/katrain/i18n/locales/haha/LC_MESSAGES/katrain.po index 41118a5..55f8578 100644 --- a/katrain/i18n/locales/haha/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/haha/LC_MESSAGES/katrain.po @@ -538,3 +538,6 @@ msgstr "" msgid "ai:p:rank" msgstr "ㅋㅋCalibrated Rank Bot" + +msgid "tab:info-details" +msgstr "ㅋㅋ+Analysis" diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo index ecd9e06c52fac348b2baefb63ea9ddd965928e1a..edd3fa516d37b65686e52f83113921f3f67a1333 100644 GIT binary patch delta 2567 zcmYM#drX#99Ki8|Aj(z2Qc@Bz#nNy&yP?UlT#bxqG@C7~ zHgPgPZA;+aJNz%?|6gg=LO7K1zj+i7Q!l_%(Ti9_Jufqae4K$JaUKrC1(=I9I0EbA z^B1D)kt-28xI4fnn1g$8G=78G_zN1-@92Q%@oF5Bm8=(_0Zu_5(f2Bq`NN|WOi>-$u?1aGyB)9tP3?AM@nJ98|6qK66zxBNPJ9s^XBaQrZ!FqA z6>Tp=``?cV2d<^yz>R3fRk8jmGFEsUUCA~aj@@X#9q0rH&}-8B zI$vqDJeT~Nx+)qR=n>?dP=`kPT&%an`detfE_4OE(Etyl1NWm74dOT)LT8F$JQ`Rj zy3jIoA@fF%e_yPm!53@M!?OZMVH3aBW^)g*os_XGdKHvh-RuAeZCtV=O7x$PiTNYqg!wmeeW`I zg$&YXJu#Mo1583EoPkC-2f0EuH}`f4`a(V0ZzcNPOR;?;I`CFBkj_}&i}wE(4Y(hD z?@ZD}_?v=}4&f~a$U-M7ME9yB)@Pst%|`p(i>_=Tn%aig{vvXP4ctueHuQN9I`QY| z0uSRdzyH$|jO+n6d@3%&*Ki#+<0yKUTgMXYLkIp1i}4a(i$z2;8|PpJw%}O&5@+H` zydCp77@m#!+zR~upP=B1S0l*?t;m?+O)SIh*p36}gw10}CvL&w6t;#F>Mz{dYmyVT z;eP5LqlfWnqA3v^aRPo6>j%(Goj?OWhm09g*&hR(j0SuY&cs=i^4Vx3OVJEuRN6?Nr zEZ;*l5y@h>6FvQpVJR*{59L;LprdFYm(Z=tx*=IFh?bxM-;6h6C2}4^Vikp3DQrR~ z`Z_v*u3#vigl40MY*eg|LC#|skDRk`3%UhWI1Qggx8^-GupV@r&(JOH!wlvRCn;po za0X5Jd9*_sqi}9QA-bYF&;ctj3v19bP=^oVYV`d>=!7TG_Xg34FCr6$%g7fWGDt(2 z-+v(mJ3Nf0z6NJu6VAnMbl`JXf#%CunEo7n&`{u_^+S=Y>f4-n7N3C z_bp%-=HL$Wv-=7+<0*9IP1BPDtVN%1Li=~28QX;};0J8Nf!k@6qfNcf)s delta 2528 zcmYM#ZA_L`7{KwvLJ|rvB~6fkUPwsT3VIbaZKYN?wOnFOJ|sBOa+$O;+vCa)5ss0~ z78W&I(g)Bj?ZpzBwXu?n$`2O9kqcXtZUt?*#&Z4tJZFpD+`s$W_qnfgo$H+Ec?Q-U zT$dP{nz|?Ox0nA}{GU&?6+(CV|6ajm5ACb)+vo@u&`!w+VJa5k6s*Kc@gB^=YRty9 z@%g6c^T?41Eu0O|hMCxf)A3Wh9KT0%8bSjO_G`op#t#WD%=l$=fZY=hLfD6P?23Mb9N`!z`<*}&9z^^7h9>-1d~Sowkd00- z4}Gs3eQ%yJez>0tOH_k)Y(QtU-457-miA3#(%}Hw|44lP725w4I=~1T=K|U?Tn{*J<@C+L7SL6s6IZY%& z5aZ{g_iwiT&U6u4iB-{BG~)(zhKe2VM#QO;}a1)xy-q=2X_Wuk`xDS2r z$E1ny3m0ZOh7K@}uF)i-*q(w0$VCSzMrU*zTGHxxe=Tx^$2nQr9q98`bilXKiFM&d z{2Vj={FkxNrQDc{%~+35;TX=h&0EE|9}Rp0i|{n&<3*f{v&d>GuEtz^2P?1#Z^uz| zPn2?UPc6iBKmTjEVA5ed5-U87cVIK_!d`U1l`}%<$E{eD62jd?nfPX#nH;bIzu@^! zbQ3Nn3oE+}t-!-*1=k~U3yqlYqA5OTM>`%wj&PKdOK=KZk~8=|p2G*RozK`9j-m;j z<@kKC2(xJ~LM9nD zVj;d5+wY>4>P8dqM`DJb(F9XjClk)b3Y>}FuSPfD>S#Tt(cW52{eAFUywQY~s5QDT z-ai!EpP*~khrTzAe$kAgKQ@^+Bm? z8K`0?KzILqEW`WIP5BHO=wmdI)9BLu9@`h9lS+~aPs2GppM&hfP=mK(Vlx*G)Di8) zG}>pQ=g>_y7TbR#`!W2B?6Z)=N5>^7#~X1ux-{F-#9GmKZ=p-NAJef1GZ;U7$%Q39 ziFO!9_DvW^XOu@&1I|V(QHAb-CAb{dpzn9019qeD^`Qg*fDSl>eB{FjTJiCT=dAxN z)Wyo5~{pp|Mt6Ysz+c=Yh`^m`{CE}XhK?{Hh$v6TM+eNykG diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po index 8eb7175..d5e073a 100644 --- a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po @@ -549,3 +549,7 @@ msgstr "" #. TODO msgid "ai:p:rank" msgstr "Calibrated Rank Bot" + +#. TODO +msgid "tab:info-details" +msgstr "+Analysis" diff --git a/katrain/popups.kv b/katrain/popups.kv index c3ec740..8bb3904 100644 --- a/katrain/popups.kv +++ b/katrain/popups.kv @@ -28,10 +28,12 @@ helper_text_mode: "none" hint_text: "" helper_text: "" + color_mode: 'custom' + line_color_focus: TEXT_COLOR : font_size: dp(16) - multiline: True # just for wrapping + multiline: False helper_text_mode: "on_error" helper_text: i18n._("file not found") @@ -47,6 +49,7 @@ size: DESC_FONT_SIZE*2,DESC_FONT_SIZE*2 size_hint: None,None + on_left_press: if self.target: self.target.text = self.text size: DESC_FONT_SIZE * 2, DESC_FONT_SIZE * 2 @@ -78,17 +81,22 @@ : configfile: configfile + BoxLayout: + size_hint: 1,1 + orientation: 'horizontal' + DescriptionLabel: + text: i18n._('general settings') + font_size: DESC_FONT_SIZE * 1.5 + DescriptionLabel: + font_size: DESC_FONT_SIZE * 1.5 + text: i18n._('engine settings') BoxLayout: size_hint: 1,9 orientation: 'horizontal' GridLayout: cols: 2 - rows: 8 + rows: 7 spacing: CP_SPACING - Label: - DescriptionLabel: - text: i18n._('general settings') - font_size: DESC_FONT_SIZE * 1.5 DescriptionLabel: text: i18n._("general:sgf_load") AnchorLayout: @@ -126,12 +134,8 @@ width: 2 GridLayout: cols: 2 - rows: 8 + rows: 7 spacing: CP_SPACING - Label: - DescriptionLabel: - font_size: DESC_FONT_SIZE * 1.5 - text: i18n._('engine settings') DescriptionLabel: text: i18n._("engine:katago") AnchorLayout: