summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/personaldb.json8
-rw-r--r--src/main/java/design/controller/userinput/UndoActions.java51
-rw-r--r--src/main/java/design/controller/userinput/menus/HolePlayMenu.java35
-rw-r--r--src/main/java/design/controller/userinput/menus/MainMenu.java19
-rw-r--r--src/main/java/design/controller/userinput/menus/SelectUser.java2
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 {