diff options
Diffstat (limited to '')
5 files changed, 84 insertions, 31 deletions
diff --git a/data/personaldb.json b/data/personaldb.json index d40ed4a..078c1bb 100644 --- a/data/personaldb.json +++ b/data/personaldb.json @@ -82,11 +82,11 @@ ], "currentHoleIndex": 2, "totalSwings": 5, - "totalDistance": 1108.0, "currentHole": { "number": 3, "par": 4 - } + }, + "totalDistance": 1108.0 }, { "course": 1, @@ -118,11 +118,11 @@ ], "currentHoleIndex": 9, "totalSwings": 1, - "totalDistance": 204.0, "currentHole": { "number": 10, "par": 3 - } + }, + "totalDistance": 204.0 } ] } diff --git a/src/main/java/design/controller/userinput/UndoActions.java b/src/main/java/design/controller/userinput/UndoActions.java new file mode 100644 index 0000000..6417284 --- /dev/null +++ b/src/main/java/design/controller/userinput/UndoActions.java @@ -0,0 +1,51 @@ +package design.controller.userinput; + +import design.model.undo.UndoManager; +import design.persistence.PersonalDatabase; +import design.runtime.Session; +import java.io.IOException; + +public final class UndoActions { + + private UndoActions() { + } + + public static void undoWithSave() { + UndoManager um = UndoManager.instance(); + if (!um.canUndo()) { + System.out.println("Nothing to undo."); + return; + } + + String label = um.peekUndoLabel(); + um.undo(); + System.out.println("Undo: " + label); + + saveCurrentGolfer(); + } + + public static void redoWithSave() { + UndoManager um = UndoManager.instance(); + if (!um.canRedo()) { + System.out.println("Nothing to redo."); + return; + } + + String label = um.peekRedoLabel(); + um.redo(); + System.out.println("Redo: " + label); + + saveCurrentGolfer(); + } + + private static void saveCurrentGolfer() { + try { + var g = Session.getCurrentGolfer(); + if (g != null) { + PersonalDatabase.instance().updateGolfer(g); + } + } catch (IOException e) { + System.err.println("Failed to save after undo/redo: " + e.getMessage()); + } + } +} diff --git a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java index 2a7fc5d..6651500 100644 --- a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java +++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java @@ -11,6 +11,7 @@ import design.model.Round; import design.model.holeplay.HolePlayContext; import design.persistence.PersonalDatabase; import design.model.undo.UndoManager; +import design.controller.userinput.UndoActions; import java.util.ArrayList; import java.util.List; @@ -37,17 +38,37 @@ public class HolePlayMenu extends Menu { public List<MenuOption> getMenuOptions() { List<MenuOption> opts = new ArrayList<>(); + // End round (always shown) 1 + opts.add(new MenuOption("end round", () -> { + UndoManager.instance().capture(golfer, "End round on " + round.getCourse().getName()); + ctx.endRoundNow(); + System.out.println("Round ended."); + new MainMenu().present(); + })); + + // 2 + opts.add(new MenuOption("undo", () -> { + UndoActions.undoWithSave(); + this.present(); + })); + + // 3 + opts.add(new MenuOption("redo", () -> { + UndoActions.redoWithSave(); + this.present(); + })); + boolean inSetup = (ctx.getCurrentPlay() == null); if (inSetup) { - // 0) Start hole + // 4) Start hole opts.add(new MenuOption("start hole", () -> { ctx.startHole(); System.out.println("Started hole " + round.getCurrentHole().getNumber() + "."); this.present(); })); } else { - // 0) Take a shot + // 4) Take a shot opts.add(new MenuOption("take a shot", () -> { var selector = new SelectClub(); selector.present(); @@ -72,7 +93,7 @@ public class HolePlayMenu extends Menu { this.present(); })); - // 1) Hole out + // 5) Hole out opts.add(new MenuOption("hole out", () -> { // Precedes to next hole int prev = round.getCurrentHole().getNumber(); @@ -85,14 +106,6 @@ public class HolePlayMenu extends Menu { })); } - // End round (always shown) - opts.add(new MenuOption("end round", () -> { - UndoManager.instance().capture(golfer, "End round on " + round.getCourse().getName()); - ctx.endRoundNow(); - System.out.println("Round ended."); - new MainMenu().present(); - })); - return opts; } diff --git a/src/main/java/design/controller/userinput/menus/MainMenu.java b/src/main/java/design/controller/userinput/menus/MainMenu.java index 07caffa..4a221f0 100644 --- a/src/main/java/design/controller/userinput/menus/MainMenu.java +++ b/src/main/java/design/controller/userinput/menus/MainMenu.java @@ -2,7 +2,7 @@ package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; -import design.model.undo.UndoManager; +import design.controller.userinput.UndoActions; import java.util.List; @@ -14,27 +14,14 @@ public class MainMenu extends Menu { @Override public List<MenuOption> getMenuOptions() { - - UndoManager um = UndoManager.instance(); - return List.of( new MenuOption("quit", () -> System.exit(0)), new MenuOption("undo", () -> { - if (!um.canUndo()) { - System.out.println("Nothing to undo."); - } else { - System.out.println("Undo: " + um.peekUndoLabel()); - um.undo(); - } + UndoActions.undoWithSave(); this.present(); }), new MenuOption("redo", () -> { - if (!um.canRedo()) { - System.out.println("Nothing to redo."); - } else { - System.out.println("Redo: " + um.peekRedoLabel()); - um.redo(); - } + UndoActions.redoWithSave(); this.present(); }), new MenuOption("user settings...", () -> new UserSettings().present()), diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java index 4b7928c..a2c7071 100644 --- a/src/main/java/design/controller/userinput/menus/SelectUser.java +++ b/src/main/java/design/controller/userinput/menus/SelectUser.java @@ -6,6 +6,7 @@ import design.controller.userinput.MenuOption; import design.model.Golfer; import design.runtime.Session; import design.persistence.PersonalDatabase; +import design.model.undo.UndoManager; import java.io.IOException; import java.util.ArrayList; @@ -61,6 +62,7 @@ public class SelectUser extends Menu { if (g.checkPassword(password)) { // Sets user in Session too Session.setCurrentGolfer(g); + UndoManager.instance().purge(); System.out.printf("Loaded user: %s%n", g); doAfter.onAction(); } else { |
