diff --git a/CONTRIBUTIONS.md b/CONTRIBUTIONS.md index 5e48e29..09da604 100644 --- a/CONTRIBUTIONS.md +++ b/CONTRIBUTIONS.md @@ -51,6 +51,7 @@ Many thanks to these additional authors: * Carton He for contributions to sgf parsing and handling. * "blamarche" for adding the board coordinates toggle. * "pdeblanc" for adding the ancient chinese scoring option. +* "LiamHz" for adding the undo to main branch keyboard shortcut. ## Translators diff --git a/README.md b/README.md index daf7b9c..3a2bf1b 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,7 @@ In addition to shortcuts mentioned above and those shown in the main menu: * **[Ctrl-delete]** Delete current node. * **[c]** Collapse/Uncollapse the branch from the current node to the previous branching point. * **[b]** Go back to the previous branching point. +* **[Shift-b]** Go back the the main branch. * **[n]** As in clicking the forward red arrow, go to one move before the next mistake (orange or worse) by a human player. * **[Shift-n]** As in clicking the backward red arrow, go to one move before the previous mistake. * **[scroll up]**: Undo move. Only works when hovering the cursor over the board. diff --git a/katrain/__main__.py b/katrain/__main__.py index 1834d35..05e9dc6 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -610,6 +610,8 @@ class KaTrainGui(Screen, KaTrainBase): self.controls.set_status(i18n._("Copied SGF to clipboard."), STATUS_INFO) elif keycode[1] == "v" and ctrl_pressed: self.load_sgf_from_clipboard() + elif keycode[1] == "b" and shift_pressed: + self("undo", "main-branch") elif keycode[1] in shortcuts.keys() and not ctrl_pressed: shortcut = shortcuts[keycode[1]] if isinstance(shortcut, Widget): diff --git a/katrain/core/game.py b/katrain/core/game.py index 603d78d..a871605 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -279,9 +279,14 @@ class Game: self._calculate_groups() return break_on_branch = False + break_on_main_branch = False + last_branching_node = cn if n_times == "branch": n_times = 9999 break_on_branch = True + elif n_times == "main-branch": + n_times = 9999 + break_on_main_branch = True for move in range(n_times): if ( stop_on_mistake is not None @@ -297,6 +302,10 @@ class Game: cn = cn.parent if break_on_branch and len(cn.children) > 1: break + elif break_on_main_branch and len(cn.children) > 1: + last_branching_node = cn + if break_on_main_branch: + cn = last_branching_node self.set_current_node(cn) def redo(self, n_times=1, stop_on_mistake=None):