summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Ferrari <69283684+Sowgro@users.noreply.github.com>2025-10-06 22:17:09 -0400
committerGitHub <noreply@github.com>2025-10-06 22:17:09 -0400
commit7ceecf80509e3387e9aa57d2996c333e4bfe4966 (patch)
treebe6673c6d3259face6c4936bdbc3d4801b3ec4c5
parent5b561d4743556a60cb4dc198489b48f8844a5c28 (diff)
parent97561886cb2ebc3f71558edd8d2202aa3a0cb03d (diff)
downloaddesignproject-design-6-7ceecf80509e3387e9aa57d2996c333e4bfe4966.tar.gz
designproject-design-6-7ceecf80509e3387e9aa57d2996c333e4bfe4966.tar.bz2
designproject-design-6-7ceecf80509e3387e9aa57d2996c333e4bfe4966.zip
Merge pull request #5 from RIT-SWEN-262/lizzio-holeplayUI
Lizzio holeplay UI
Diffstat (limited to '')
-rw-r--r--data/personaldb.json45
-rw-r--r--src/main/java/design/controller/userinput/Menu.java2
-rw-r--r--src/main/java/design/controller/userinput/menus/CourseSelectMenu.java52
-rw-r--r--src/main/java/design/controller/userinput/menus/HolePlayMenu.java89
-rw-r--r--src/main/java/design/controller/userinput/menus/MainMenu.java5
-rw-r--r--src/main/java/design/controller/userinput/menus/SelectUser.java12
-rw-r--r--src/main/java/design/persistence/JSONPersonalDatabase.java8
-rw-r--r--src/main/java/design/persistence/PersonalDatabase.java5
-rw-r--r--src/main/java/design/runtime/Session.java15
9 files changed, 194 insertions, 39 deletions
diff --git a/data/personaldb.json b/data/personaldb.json
index 069f15b..5ba73ac 100644
--- a/data/personaldb.json
+++ b/data/personaldb.json
@@ -1,36 +1,21 @@
[
{
- "username": "happy",
- "passwordHash": 1234567890,
- "fullName": "Happy Gilmore",
- "rounds": [
+ "username": "john_doe",
+ "passwordHash": 12345,
+ "fullName": "John Doe",
+ "courses": [],
+ "rounds": [],
+ "clubs": [
{
- "dateTime": "2025-10-02T14:35:00",
- "startingHole": { "number": 1, "par": 4 },
- "plays": [
- {
- "distance": 260,
- "swings": [
- {
- "distance": 240,
- "clubUsed": {
- "manufacture": "Titleist",
- "nickname": "Big Dog",
- "clubType": "Driver"
- }
- },
- {
- "distance": 20,
- "clubUsed": {
- "manufacture": "Cleveland",
- "nickname": "RTX ZipCore",
- "clubType": "SandWedge"
- }
- }
- ]
- }
- ]
+ "manufacture": "TaylorMade",
+ "nickname": "Old Faithful",
+ "clubType": "DRIVER"
+ },
+ {
+ "manufacture": "Callaway",
+ "nickname": "Lucky Seven",
+ "clubType": "IRON"
}
]
}
-]
+] \ No newline at end of file
diff --git a/src/main/java/design/controller/userinput/Menu.java b/src/main/java/design/controller/userinput/Menu.java
index 7677793..605b640 100644
--- a/src/main/java/design/controller/userinput/Menu.java
+++ b/src/main/java/design/controller/userinput/Menu.java
@@ -21,7 +21,7 @@ public abstract class Menu {
try {
int i = Integer.parseInt(split[0]);
menuOptions.get(i).onCommand(Arrays.copyOfRange(split, 1, split.length));
- } catch (Exception ex) {
+ } catch (ArrayIndexOutOfBoundsException ex) {
System.err.printf("Invalid option \"%s\"\n", line);
present();
}
diff --git a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java
new file mode 100644
index 0000000..881c393
--- /dev/null
+++ b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java
@@ -0,0 +1,52 @@
+package design.controller.userinput.menus;
+
+import design.controller.userinput.Menu;
+import design.controller.userinput.MenuOption;
+import design.model.Course;
+import design.model.Hole;
+import design.model.Round;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+import design.persistence.MasterDatabase;
+import design.runtime.Session;
+
+public class CourseSelectMenu extends Menu {
+
+ @Override
+ public String getTitle() {
+ return "course select";
+ }
+
+ @Override
+ public List<MenuOption> getMenuOptions() {
+ List<MenuOption> opts = new ArrayList<>();
+
+ // 0) back
+ opts.add(new MenuOption("back to main menu", a -> new MainMenu().present()));
+
+ // 1) pick course by number TODO: add error checking
+ opts.add(new MenuOption("pick course by number (1..1000)", a -> {
+ Scanner sc = new Scanner(System.in);
+
+ System.out.print("Course number (1..1000): ");
+ int n = Integer.parseInt(sc.nextLine().trim());
+ Course c = MasterDatabase.INSTANCE.getCourse(n - 1);
+
+ System.out.print("Starting hole (1..18, blank=1): ");
+ String s = sc.nextLine().trim();
+ int start = s.isEmpty() ? 1 : Integer.parseInt(s);
+
+ Hole startHole = c.getHoles().get(start - 1);
+
+ Round r = new Round(c, LocalDateTime.now(), startHole);
+ Session.getCurrentGolfer().addRound(r);
+ new HolePlayMenu(r).present();
+ }));
+
+ return opts;
+ }
+}
diff --git a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java
new file mode 100644
index 0000000..bcd7560
--- /dev/null
+++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java
@@ -0,0 +1,89 @@
+package design.controller.userinput.menus;
+
+import design.controller.userinput.Menu;
+import design.controller.userinput.MenuOption;
+import design.runtime.Session;
+import design.model.Club;
+import design.model.Round;
+import design.model.holeplay.HolePlayContext;
+import design.persistence.PersonalDatabase;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+public class HolePlayMenu extends Menu {
+
+ private final Round round;
+ private final HolePlayContext ctx;
+
+ public HolePlayMenu(Round round) {
+ this.round = round;
+ this.ctx = new HolePlayContext(Session.getCurrentGolfer(), round, PersonalDatabase.INSTANCE);
+ }
+
+ @Override
+ public String getTitle() {
+ return String.format("hole play - %s | hole %d", round.getCourse().getName(),
+ round.getCurrentHole().getNumber());
+ }
+
+ @Override
+ public List<MenuOption> getMenuOptions() {
+ List<MenuOption> opts = new ArrayList<>();
+
+ boolean inSetup = (ctx.getCurrentPlay() == null);
+
+ if (inSetup) {
+ // 0) Start hole
+ opts.add(new MenuOption("start hole", (a) -> {
+ ctx.startHole();
+ System.out.println("Started hole " + round.getCurrentHole().getNumber() + ".");
+ this.present();
+ }));
+ } else {
+ // 0) Take a shot
+ opts.add(new MenuOption("take a shot", (a) -> {
+ // Gets club
+ Scanner sc = new Scanner(System.in);
+ System.out.print("Club nickname: ");
+ String nick = sc.nextLine().trim();
+ // Defaulted to Driver for now
+ // TODO update logic
+ Club club = new Club("Generic", nick, Club.ClubType.DRIVER);
+
+ // Get shot distance (defaults to 0 of not stated)
+ System.out.print("Distance (yds, blank=0): ");
+ String ds = sc.nextLine().trim();
+ int dist = 0;
+ if (!ds.isEmpty()) {
+ dist = Integer.parseInt(ds);
+ }
+
+ // Records shot
+ ctx.recordShot(club, dist);
+ System.out.println("Shot recorded: " + dist + " yds with " + club.getNickname());
+
+ this.present();
+ }));
+
+ // 1) Hole out
+ opts.add(new MenuOption("hole out", (a) -> {
+ // Precedes to next hole
+ int prev = round.getCurrentHole().getNumber();
+ ctx.holeOut();
+ System.out.println("Holed out on " + prev + ". Next: " + round.getCurrentHole().getNumber());
+ this.present();
+ }));
+ }
+
+ // End round (always shown)
+ opts.add(new MenuOption("end round", (a) -> {
+ 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 fb3cee9..c76e61a 100644
--- a/src/main/java/design/controller/userinput/menus/MainMenu.java
+++ b/src/main/java/design/controller/userinput/menus/MainMenu.java
@@ -16,8 +16,7 @@ public class MainMenu extends Menu {
return List.of(
new MenuOption("user settings...", (a) -> new UserSettings().present()),
new MenuOption("statistics...", (a) -> new StatisticsMenu().present()),
- new MenuOption("log round...", (a) -> {}),
- new MenuOption("quit", (a) -> {})
- );
+ new MenuOption("log round...", (a) -> new CourseSelectMenu().present()),
+ new MenuOption("quit", (a) -> {}));
}
}
diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java
index 1963f1d..2f1a867 100644
--- a/src/main/java/design/controller/userinput/menus/SelectUser.java
+++ b/src/main/java/design/controller/userinput/menus/SelectUser.java
@@ -2,6 +2,7 @@ package design.controller.userinput.menus;
import design.controller.userinput.Menu;
import design.controller.userinput.MenuOption;
+import design.runtime.Session;
import design.persistence.PersonalDatabase;
import java.util.ArrayList;
@@ -19,9 +20,14 @@ public class SelectUser extends Menu {
@Override
public List<MenuOption> getMenuOptions() {
var l = new ArrayList<MenuOption>();
- l.addAll(Arrays.stream(personalDB.getGolfers())
- .map(i -> new MenuOption(i.getUsername(), (a) -> {})).toList());
- l.add(new MenuOption("<create>", (a) -> {}));
+ // Sets user in Session too
+ l.addAll(Arrays.stream(personalDB.getGolfers()).map(i -> new MenuOption(i.getUsername(), (a) -> {
+ Session.setCurrentGolfer(i);
+ System.out.printf("Loaded user: %s%n", i.getUsername());
+ new UserSettings().present();
+ })).toList());
+ l.add(new MenuOption("<create>", (a) -> {
+ }));
return l;
}
}
diff --git a/src/main/java/design/persistence/JSONPersonalDatabase.java b/src/main/java/design/persistence/JSONPersonalDatabase.java
index 0efa362..b034680 100644
--- a/src/main/java/design/persistence/JSONPersonalDatabase.java
+++ b/src/main/java/design/persistence/JSONPersonalDatabase.java
@@ -16,6 +16,7 @@ import design.model.Golfer;
import java.io.File;
import java.io.IOException;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@@ -30,6 +31,10 @@ public class JSONPersonalDatabase implements PersonalDatabase {
this.cache = new HashMap<>();
this.mapper = new ObjectMapper();
+ // TODO: Once the saved JSON matches the model, consider removing.
+ // TEMP: tolerate unknown props while the model stabilizes
+ mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
SimpleModule module = new SimpleModule();
module.addDeserializer(Course.class, new CourseIdDeserializer());
module.addSerializer(Course.class, new CourseIdSerializer());
@@ -58,9 +63,10 @@ public class JSONPersonalDatabase implements PersonalDatabase {
mapper.writer(new CustomPrettyPrinter()).writeValue(file, data);
}
+ // turns that collection into a real array of golfers
@Override
public Golfer[] getGolfers() {
- return new Golfer[0];
+ return cache.values().toArray(Golfer[]::new);
}
@Override
diff --git a/src/main/java/design/persistence/PersonalDatabase.java b/src/main/java/design/persistence/PersonalDatabase.java
index a045d59..428694b 100644
--- a/src/main/java/design/persistence/PersonalDatabase.java
+++ b/src/main/java/design/persistence/PersonalDatabase.java
@@ -1,15 +1,18 @@
package design.persistence;
import design.model.Golfer;
-
import java.io.IOException;
public interface PersonalDatabase {
PersonalDatabase INSTANCE = new JSONPersonalDatabase("data/personaldb.json");
Golfer[] getGolfers();
+
Golfer getGolfer(String name);
+
void addGolfer(Golfer golfer) throws IOException;
+
void removeGolfer(Golfer golfer) throws IOException;
+
void updateGolfer(Golfer golfer) throws IOException;
}
diff --git a/src/main/java/design/runtime/Session.java b/src/main/java/design/runtime/Session.java
new file mode 100644
index 0000000..fbf4b9c
--- /dev/null
+++ b/src/main/java/design/runtime/Session.java
@@ -0,0 +1,15 @@
+package design.runtime;
+
+import design.model.Golfer;
+
+public final class Session {
+ private static Golfer currentGolfer;
+
+ public static Golfer getCurrentGolfer() {
+ return currentGolfer;
+ }
+
+ public static void setCurrentGolfer(Golfer currentGolfer) {
+ Session.currentGolfer = currentGolfer;
+ }
+}