From de898569b6ed7c2e495687ac6fb9395ce7cda5be Mon Sep 17 00:00:00 2001 From: Sander Land Date: Sun, 13 Dec 2020 22:10:14 +0100 Subject: [PATCH] fix rule default, gui input tabbing, scroll wheel, cache gamenode moves --- katrain/core/game.py | 3 ++- katrain/core/sgf_parser.py | 18 +++++++++++++----- katrain/gui/popups.py | 2 +- katrain/gui/widgets/graph.py | 5 +++-- katrain/gui/widgets/movetree.py | 7 ++++++- .../i18n/locales/de/LC_MESSAGES/katrain.mo | Bin 16368 -> 16323 bytes .../i18n/locales/de/LC_MESSAGES/katrain.po | 4 +--- .../i18n/locales/fr/LC_MESSAGES/katrain.po | 1 - katrain/popups.kv | 4 ++++ 9 files changed, 30 insertions(+), 14 deletions(-) diff --git a/katrain/core/game.py b/katrain/core/game.py index a4dc887..3f2c788 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -75,11 +75,12 @@ class Game: self.root.place_handicap_stones(handicap) else: board_size = katrain.config("game/size") + rules = katrain.config("game/rules") self.komi = katrain.config("game/komi") self.root = GameNode( properties={ **Game.DEFAULT_PROPERTIES, - **{"SZ": board_size, "KM": self.komi, "DT": self.game_id}, + **{"SZ": board_size, "KM": self.komi, "DT": self.game_id, "RU": rules}, **(game_properties or {}), } ) diff --git a/katrain/core/sgf_parser.py b/katrain/core/sgf_parser.py index a233d9f..edd4037 100644 --- a/katrain/core/sgf_parser.py +++ b/katrain/core/sgf_parser.py @@ -82,6 +82,10 @@ class SGFNode: self.parent.children.append(self) if parent and move: self.set_property(move.player, move.sgf(self.board_size)) + self._clear_cache() + + def _clear_cache(self): + self.moves_cache = None def sgf_properties(self, **xargs) -> Dict: """For hooking into in a subclass and overriding/formatting any additional properties to be output.""" @@ -134,6 +138,7 @@ class SGFNode: """Add some values to the property list.""" # SiZe[19] ==> SZ[19] etc. for old SGF normalized_property = re.sub("[a-z]", "", property) + self._clear_cache() self.properties[normalized_property] += values def get_list_property(self, property, default=None) -> Any: @@ -144,6 +149,7 @@ class SGFNode: """Add some values to the property. If not a list, it will be made into a single-value list.""" if not isinstance(value, list): value = [value] + self._clear_cache() self.properties[property] = value def get_property(self, property, default=None) -> Any: @@ -207,11 +213,13 @@ class SGFNode: @property def moves(self) -> List[Move]: """Returns all moves in the node - typically 'move' will be better.""" - return [ - Move.from_sgf(move, player=pl, board_size=self.board_size) - for pl in Move.PLAYERS - for move in self.get_list_property(pl, []) - ] + if self.moves_cache is None: + self.moves_cache = [ + Move.from_sgf(move, player=pl, board_size=self.board_size) + for pl in Move.PLAYERS + for move in self.get_list_property(pl, []) + ] + return self.moves_cache @property def placements(self) -> List[Move]: diff --git a/katrain/gui/popups.py b/katrain/gui/popups.py index 5911773..b2436e5 100644 --- a/katrain/gui/popups.py +++ b/katrain/gui/popups.py @@ -254,7 +254,7 @@ class NewGamePopup(QuickConfigGui): def normalized_rules(self): rules = self.katrain.game.root.get_property("RU", "japanese").strip().lower() for abbr, name in self.katrain.engine.RULESETS_ABBR: - if abbr == rules or abbr == rules: + if abbr == rules or name == rules: return name def update_playerinfo(self, *args): diff --git a/katrain/gui/widgets/graph.py b/katrain/gui/widgets/graph.py index 5e923cd..1c208a0 100644 --- a/katrain/gui/widgets/graph.py +++ b/katrain/gui/widgets/graph.py @@ -76,7 +76,8 @@ class ScoreGraph(Graph): navigate_move = ListProperty([None, 0, 0, 0]) def on_touch_down(self, touch): - if self.collide_point(*touch.pos): + if self.collide_point(*touch.pos) and "scroll" not in getattr(touch, "button",''): + print(touch) ix, _ = min(enumerate(self.score_points[::2]), key=lambda ix_v: abs(ix_v[1] - touch.x)) self.navigate_move = [ self.nodes[ix], @@ -91,7 +92,7 @@ class ScoreGraph(Graph): return self.on_touch_down(touch) def on_touch_up(self, touch): - if self.collide_point(*touch.pos) and self.navigate_move[0]: + if self.collide_point(*touch.pos) and self.navigate_move[0] and "scroll" not in getattr(touch, "button",''): katrain = MDApp.get_running_app().gui if katrain and katrain.game: katrain.game.set_current_node(self.navigate_move[0]) diff --git a/katrain/gui/widgets/movetree.py b/katrain/gui/widgets/movetree.py index 2074e89..a848108 100644 --- a/katrain/gui/widgets/movetree.py +++ b/katrain/gui/widgets/movetree.py @@ -247,6 +247,12 @@ class MoveTree(ScrollView, BackgroundMixin): sy = (y - self.height / 2) / (vp.height - self.height) self.scroll_y = max(0, min(1, sy)) + # disable mousewheel + def on_scroll_start(self, touch, check_children=True): + if "button" in touch.profile and touch.button.startswith("scroll"): + return False + return super().on_scroll_start(touch, check_children) + Builder.load_string( """ @@ -256,7 +262,6 @@ Builder.load_string( : background_color: Theme.BOX_BACKGROUND_COLOR move_tree_canvas: move_tree_canvas - scroll_distance: 0 # scroll wheel is for forward/backward MoveTreeCanvas: scroll_view_widget: root id: move_tree_canvas diff --git a/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/de/LC_MESSAGES/katrain.mo index e21009352c09361fcd1e125c035429886d6595cb..c8553d190e33ab7cf0a52a737d37256b50073790 100644 GIT binary patch delta 1063 zcmXZbPe@cz6vy$SWvMw$R#TQSJk1t@XDYrOR<%Z0x zyWOk>Ph&NXVGZ8FP51x<_`+YG#zy8Juo6qyflF9{9Wk>ocB0~EunW)NMl9ksd>b>@ zG7P@^3n`*RnP*TN$8bB2V;xT64xGb!EZ=3e4#SwnDDK2j?81kreZMe)E8<=PNj%ED zH}0B|wB2W6Ext!p`VFga9u=U3N+d{>HjLp`9PsBZs-hw~ID@P44=PRx8_;%p2{htL zrU{pUTAo4$Oyhd&LsfVl75Fwb;}hJBv#81!Q2WdFm~Frs)YUnttBK$mjH3!Wh}zeS zL3FbW>KL3wb>JE*k$dRiGt^ywLIwVdbkiz2y#td-adr$9_zJGVyQuHSu^b=!>l3KX zJjX4ZZ?C<9&7v}1M6TEVp#rrfy}$`n1xGM~C$R-Dqbhugt@sL+@H{F`Fy(dhFskBH zzC&2a`8LWxExd$fc-{8~>M`9y-PIdZ=F_MH-=Qk}g6iB)T>cwS@s_X&tM_ts1dgKC zGyA;G4Pc1#?E-^(yot*25$X-RL_MAv)Nl0})se5LgMOeA`;B2-M8&Dy?>*KC>P;NS v9vt-N6KDtWd8aQ|nEV(x*AzOG?H?X=vW0B^;z(}9$rYRv>F&v^?ZbipkTQWo delta 1108 zcmXZbUr19?9Ki8k;?m8Q{h8@p>8&X^n17n3S!U)#5+i!)B{S$c=XT+?)wT#ByAQ>n zm%`{VdI)Be1YnBewKqpZHPoh?E4mZ5&tTH$Bx!XKy!hX>s_gQy)n zi(2tz&l_0F`7*~qTX+xG;A77xsE_Fx>RtUp&3py*z(1%J*6epX7sCI418TfDwqZZU z2t4ksmxtWW&0+)R%N+(0e2SXk2h@zeqdvk_)ZeQ5fZLG(>OmV(6Klp6Y((k5yn=Gjwv7oZH~%hJXd6kHschOXbEZ9Aw2DS4Zxl0Afeza&WYPs=%CghN kxRKA<(?%+P`ixn!ChW9v-YR8{q