diff options
| author | sowgro <tpoke.ferrari@gmail.com> | 2025-10-09 21:03:25 -0400 |
|---|---|---|
| committer | sowgro <tpoke.ferrari@gmail.com> | 2025-10-09 21:03:25 -0400 |
| commit | 5f1ea0ee335a73edf53939b87218a34e93fe4de9 (patch) | |
| tree | 077878354a1c17dca986a843d9ecfb9f8169e3b2 /src/main/java | |
| parent | 1eca2f8681752ad359e8372780cdf719e2b1747d (diff) | |
| download | designproject-design-6-5f1ea0ee335a73edf53939b87218a34e93fe4de9.tar.gz designproject-design-6-5f1ea0ee335a73edf53939b87218a34e93fe4de9.tar.bz2 designproject-design-6-5f1ea0ee335a73edf53939b87218a34e93fe4de9.zip | |
Menu cleanup - pass 1
Diffstat (limited to '')
13 files changed, 239 insertions, 181 deletions
diff --git a/src/main/java/design/controller/userinput/Menu.java b/src/main/java/design/controller/userinput/Menu.java index 0b2fb26..6bf3da4 100644 --- a/src/main/java/design/controller/userinput/Menu.java +++ b/src/main/java/design/controller/userinput/Menu.java @@ -11,17 +11,17 @@ public abstract class Menu { var menuOptions = getMenuOptions(); System.out.println(); System.out.printf("-- %s --\n", getTitle().toUpperCase()); - for (int i = 0; i < menuOptions.size(); i++) { - MenuOption menuOption = menuOptions.get(i); + for (int i = 1; i <= menuOptions.size(); i++) { + MenuOption menuOption = menuOptions.get(i-1); System.out.printf("%s: %s\n", i, menuOption.getName()); } - System.out.print("Selection: "); + System.out.printf("Selection (%s..%s): ", 1, menuOptions.size()); Scanner sc = new Scanner(System.in); var line = sc.nextLine(); try { - int i = Integer.parseInt(line); + int i = Integer.parseInt(line) - 1; menuOptions.get(i).onAction(); } catch (ArrayIndexOutOfBoundsException ex) { System.err.printf("Invalid option \"%s\"\n", line); diff --git a/src/main/java/design/controller/userinput/menus/CourseSearch.java b/src/main/java/design/controller/userinput/menus/CourseSearch.java index 019965c..65d4b3e 100644 --- a/src/main/java/design/controller/userinput/menus/CourseSearch.java +++ b/src/main/java/design/controller/userinput/menus/CourseSearch.java @@ -28,22 +28,6 @@ public class CourseSearch extends Menu { } /* - * Prompt for input and search. - */ - public void search() { - System.out.print("Enter search term (blank for all): "); - Scanner sc = new Scanner(System.in); - String searchTerm = sc.nextLine(); - - // search and present - query.search(searchTerm); - this.present(); - - // reset the query after we're done. - query.reset(); - } - - /* * Display the results of our search. */ @Override @@ -64,6 +48,22 @@ public class CourseSearch extends Menu { return l; } + /* + * Prompt for input and search. + */ + @Override + public void present() { + System.out.print("Enter search term (blank for all): "); + Scanner sc = new Scanner(System.in); + String searchTerm = sc.nextLine(); + + // search and present + query.search(searchTerm); + super.present(); + + // reset the query after we're done. + query.reset(); + } // recursively go through tree structure of courselist to make menu options. // this is all for displaying the menu options, not the actual sorting. diff --git a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java index af825e0..581b0b9 100644 --- a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java +++ b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java @@ -3,18 +3,19 @@ package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; import design.model.Course; +import design.model.Golfer; import design.model.Hole; import design.model.Round; import java.time.LocalDateTime; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Scanner; -import design.persistence.MasterDatabase; import design.runtime.Session; public class CourseSelectMenu extends Menu { + Golfer golfer = Session.getCurrentGolfer(); @Override public String getTitle() { @@ -23,78 +24,45 @@ public class CourseSelectMenu extends Menu { @Override public List<MenuOption> getMenuOptions() { - List<MenuOption> opts = new ArrayList<>(); - - // 0) back - opts.add(new MenuOption("back to main menu", () -> new MainMenu().present())); - - // 1) go to CourseSearchMenu to search for a course and add it profile - opts.add(new MenuOption("Add Course to Profile", () -> new MainMenu().present())); - - // 2) pick course from MY PROFILE only - opts.add(new MenuOption("pick course from my profile", () -> { - var golfer = Session.getCurrentGolfer(); - Course[] mine = (golfer == null) ? new Course[0] : golfer.getCourses(); - - // Checks user has courses of not informs them to add one to there profile - if (mine == null || mine.length == 0) { - System.out.println("You don't have any courses saved to your profile yet."); - System.out.println("Use the 'Add Course to Profile' menu first."); - this.present(); - return; - } - // Select a course - Scanner sc = new Scanner(System.in); + return Arrays.stream(golfer.getCourses()) + .map(i -> new MenuOption(i.toString(), () -> promptHole(i))) + .toList(); + } - // Prints all courses - System.out.println("-- MY COURSES --"); - for (int i = 0; i < mine.length; i++) { - Course c = mine[i]; - System.out.printf("%d: %s (%s) | Holes: %d | Total Par: %d | Difficulty: %.1f%n", - i + 1, c.getName(), c.getLocation(), c.getHoleCount(), c.getTotalPar(), - c.getDifficultyRating()); - } - // Select course by number - Course selected = null; - while (selected == null) { - System.out.print("Select course # (1.." + mine.length + "): "); - String line = sc.nextLine().trim(); - int idx = Integer.parseInt(line); - if (idx < 1 || idx > mine.length) { - System.out.println("Out of range. Try again."); - continue; - } - selected = mine[idx - 1]; - } - // Gets starting hole on course - int startHoleNum = readStartingHole(sc, selected.getHoleCount()); - // Starts round and sends user to HolePlayMenu - startRound(selected, startHoleNum); - })); + @Override + public void present() { + // Checks user has courses of not informs them to add one to there profile + if (golfer.getCourses().length == 0) { + System.out.println("You don't have any courses saved to your profile yet."); + System.out.println("Use the 'Add Course to Profile' menu first."); + new MainMenu().present(); + return; + } - return opts; + super.present(); } - private int readStartingHole(Scanner sc, int holeCount) { + private void promptHole(Course selected) { + Scanner sc = new Scanner(System.in); + // Gets starting hole on course + int startHoleNum = 1; + int holeCount = selected.getHoleCount(); // Asks for a hole number until a valid number is selected - while (true) { - System.out.print("Starting hole (1.." + holeCount + ", blank=1): "); - String s = sc.nextLine().trim(); - if (s.isEmpty()) - return 1; + System.out.print("Starting hole (1.." + holeCount + ", blank=1): "); + String s = sc.nextLine().trim(); + if (!s.isEmpty()) { int start = Integer.parseInt(s); if (start < 1 || start > holeCount) { System.out.println("Starting hole must be between 1 and " + holeCount + "."); - continue; + return; } - return start; + startHoleNum = start; } - } - - private void startRound(Course c, int startHoleNum) { - Hole startHole = c.getHoles().get(startHoleNum - 1); - Round r = new Round(c, LocalDateTime.now(), startHole); - Session.getCurrentGolfer().addRound(r); + // Starts round and sends user to HolePlayMenu + Hole startHole = selected.getHoles().get(startHoleNum - 1); + Round r = new Round(selected, LocalDateTime.now(), startHole); + golfer.addRound(r); new HolePlayMenu(r).present(); } + } diff --git a/src/main/java/design/controller/userinput/menus/FiltersMenu.java b/src/main/java/design/controller/userinput/menus/FiltersMenu.java index 9f2d8df..103d62b 100644 --- a/src/main/java/design/controller/userinput/menus/FiltersMenu.java +++ b/src/main/java/design/controller/userinput/menus/FiltersMenu.java @@ -20,6 +20,20 @@ public class FiltersMenu extends Menu { } /* + * show our current filters. + */ + @Override + public List<MenuOption> getMenuOptions() { + + System.out.println("\nYou are filtering by "); + System.out.println(query.printFilters()); + + return List.of( + new MenuOption("return to search", () -> new SearchMenu().present()) + ); + } + + /* * Add a new filter to our filter list */ public void addFilter(CourseSorter filter) { @@ -34,20 +48,6 @@ public class FiltersMenu extends Menu { public void clearFilters() { CurrentSearchQuery.INSTANCE.clearFilters(); System.out.println("\nCleared all filters.\n"); - new SearchMenu().present(); - } - - /* - * show our current filters. - */ - @Override - public List<MenuOption> getMenuOptions() { - - System.out.println("\nYou are filtering by "); - System.out.println(query.printFilters()); - - return List.of( - new MenuOption("return to search", () -> new SearchMenu().present()) - ); + new SearchMenu().present(); } } diff --git a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java index 14e5345..33450c9 100644 --- a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java +++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java @@ -50,7 +50,7 @@ public class HolePlayMenu extends Menu { if (clubs.length == 0) { System.out.println("You don't have any clubs yet. Add one first."); - new AddClubMenu().present(); +// new AddClubMenu().present(); this.present(); return; } @@ -59,8 +59,7 @@ public class HolePlayMenu extends Menu { System.out.println("-- YOUR CLUBS --"); for (int i = 0; i < clubs.length; i++) { Club c = clubs[i]; - System.out.printf("%d: #%d %s - %s (%s)%n", - i + 1, c.getId(), c.getNickname(), c.getManufacture(), c.getClubType()); + System.out.println(c); } // user selects one of their clubs diff --git a/src/main/java/design/controller/userinput/menus/MainMenu.java b/src/main/java/design/controller/userinput/menus/MainMenu.java index 71a93b0..05c3518 100644 --- a/src/main/java/design/controller/userinput/menus/MainMenu.java +++ b/src/main/java/design/controller/userinput/menus/MainMenu.java @@ -14,10 +14,12 @@ public class MainMenu extends Menu { @Override public List<MenuOption> getMenuOptions() { return List.of( + new MenuOption("quit", () -> {}), new MenuOption("user settings...", () -> new UserSettings().present()), - new MenuOption("add course to profile...", () -> new SearchMenu().present()), + new MenuOption("manage courses...", () -> new ManageCourses().present()), + new MenuOption("manage clubs...", () -> new ManageClubs().present()), new MenuOption("statistics...", () -> new StatisticsMenu().present()), - new MenuOption("log round...", () -> new CourseSelectMenu().present()), - new MenuOption("quit", () -> {})); + new MenuOption("log round...", () -> new CourseSelectMenu().present()) + ); } } diff --git a/src/main/java/design/controller/userinput/menus/AddClubMenu.java b/src/main/java/design/controller/userinput/menus/ManageClubs.java index ea18ed5..56d645f 100644 --- a/src/main/java/design/controller/userinput/menus/AddClubMenu.java +++ b/src/main/java/design/controller/userinput/menus/ManageClubs.java @@ -9,24 +9,53 @@ import design.runtime.Session; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Scanner; -public class AddClubMenu extends Menu { +public class ManageClubs extends Menu { + Golfer golfer = Session.getCurrentGolfer(); @Override public String getTitle() { - return "add a club"; + return "manage clubs"; } @Override public List<MenuOption> getMenuOptions() { - List<MenuOption> opts = new ArrayList<>(); + List<MenuOption> opts = new java.util.ArrayList<>(); + opts.add(new MenuOption("return to main menu", () -> new MainMenu().present())); - opts.add(new MenuOption("create new club", () -> { - Golfer g = Session.getCurrentGolfer(); - if (g == null) { + opts.add(new MenuOption("list clubs", () -> { + for (Club club : golfer.getClubs()) { + System.out.printf("- %s\n", club); + } + this.present(); + })); + + opts.add(new MenuOption("remove club...", () -> { + new Menu() { + @Override + public String getTitle() { + return "remove club"; + } + + @Override + public List<MenuOption> getMenuOptions() { + List<MenuOption> list = new ArrayList<>(); + for (Club c : golfer.getClubs()) { + MenuOption menuOption = new MenuOption(c.toString(), () -> { + golfer.removeClub(c); + this.present(); + }); + list.add(menuOption); + } + return list; + } + }.present(); + })); + + opts.add(new MenuOption("add club...", () -> { + if (golfer == null) { System.out.println("No user loaded."); new UserSettings().present(); return; @@ -59,19 +88,18 @@ public class AddClubMenu extends Menu { type = types[idx - 1]; } - g.addClub(manufacture, nickname, type); + golfer.addClub(manufacture, nickname, type); // Add club to JSON try { - PersonalDatabase.INSTANCE.updateGolfer(g); + PersonalDatabase.INSTANCE.updateGolfer(golfer); System.out.println("Club added and saved."); } catch (IOException e) { throw new RuntimeException("Failed to save club", e); } new UserSettings().present(); - })); - - opts.add(new MenuOption("cancel", () -> new UserSettings().present())); + }));// Pick type +// Add club to JSON return opts; } } diff --git a/src/main/java/design/controller/userinput/menus/ManageCourses.java b/src/main/java/design/controller/userinput/menus/ManageCourses.java new file mode 100644 index 0000000..5156a9b --- /dev/null +++ b/src/main/java/design/controller/userinput/menus/ManageCourses.java @@ -0,0 +1,58 @@ +package design.controller.userinput.menus; + +import design.controller.userinput.Menu; +import design.controller.userinput.MenuOption; +import design.model.Course; +import design.model.Golfer; +import design.runtime.Session; + +import java.util.ArrayList; +import java.util.List; + +public class ManageCourses extends Menu { + Golfer golfer = Session.getCurrentGolfer(); + + @Override + public String getTitle() { + return "manage courses"; + } + + @Override + public List<MenuOption> getMenuOptions() { + List<MenuOption> opts = new java.util.ArrayList<>(); + opts.add(new MenuOption("return to main menu", () -> new MainMenu().present())); + + opts.add(new MenuOption("list courses", () -> { + for (Course course : golfer.getCourses()) { + System.out.printf("- %s\n", course); + } + this.present(); + })); + + opts.add(new MenuOption("remove course...", () -> { + new Menu() { + @Override + public String getTitle() { + return "remove course"; + } + + @Override + public List<MenuOption> getMenuOptions() { + List<MenuOption> list = new ArrayList<>(); + for (Course c : golfer.getCourses()) { + MenuOption menuOption = new MenuOption(c.toString(), () -> { + golfer.removeCourse(c); + this.present(); + }); + list.add(menuOption); + } + return list; + } + }.present(); + })); + + opts.add(new MenuOption("add course...", () -> new SearchMenu().present())); + + return opts; + } +} diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java index ffae559..8f0a809 100644 --- a/src/main/java/design/controller/userinput/menus/SelectUser.java +++ b/src/main/java/design/controller/userinput/menus/SelectUser.java @@ -31,13 +31,13 @@ public class SelectUser extends Menu { var opts = new ArrayList<MenuOption>(); for (Golfer i : personalDB.getGolfers()) { - MenuOption menuOption = new MenuOption(i.getUsername(), () -> { + MenuOption menuOption = new MenuOption(i.toString(), () -> { System.out.print("Enter password: "); var password = scanner.nextLine(); if (i.checkPassword(password)) { // Sets user in Session too Session.setCurrentGolfer(i); - System.out.printf("Loaded user: %s%n", i.getUsername()); + System.out.printf("Loaded user: %s%n", i); doAfter.onAction(); } else { System.out.println("Incorrect password. "); diff --git a/src/main/java/design/controller/userinput/menus/StatisticsMenu.java b/src/main/java/design/controller/userinput/menus/StatisticsMenu.java index 3af790e..8835ce1 100644 --- a/src/main/java/design/controller/userinput/menus/StatisticsMenu.java +++ b/src/main/java/design/controller/userinput/menus/StatisticsMenu.java @@ -27,62 +27,6 @@ public class StatisticsMenu extends Menu { return "statistics menu"; } - // Helper classes to get user input and handle finding the data they requested (Course, Hole, Year, etc.) - @SuppressWarnings("resource") - private Statistics getUserYear(Statistics baseStats){ - Scanner sc = new Scanner(System.in); - - System.out.println("Enter year to search: "); - int year = Integer.parseInt(sc.nextLine()); - - Statistics yearStats = new YearlyStats(baseStats, year); - return yearStats; - } - - @SuppressWarnings("resource") - private Statistics getUserCourse(Statistics baseStats){ - Scanner sc = new Scanner(System.in); - Course[] courses = golfer.getCourses(); - for(int i = 0; i < courses.length; i++){ - System.out.println((i+1) + ".) Name: " + courses[i].getName() + ". Location: " + courses[i].getLocation()); - } - System.out.println("Select the course number corresponding to the course. "); - int selection = Integer.parseInt(sc.nextLine()); - return new CourseStats(baseStats, courses[selection - 1]); - } - - @SuppressWarnings("resource") - private Statistics getUserRound(Statistics baseStats){ - Scanner sc = new Scanner(System.in); - Round[] rounds = baseStats.getRounds(); - for(int i = 0; i < rounds.length; i++){ - System.out.println((i+1) + ".) Date: " + rounds[i].getDateTime().toLocalDate() + ". Time: " + rounds[i].getDateTime().toLocalTime() + ". Final Score: " + rounds[i].getTotalSwings() + ". Total Distance: " + rounds[i].getTotalDistance()); - } - System.out.println("Select the round number: "); - int selection = Integer.parseInt(sc.nextLine()); - return new RoundStats(baseStats, rounds[selection - 1]); - } - - @SuppressWarnings("resource") - private Statistics getUserHole(Statistics baseStats){ - Scanner sc = new Scanner(System.in); - Round round = baseStats.getRounds()[0]; // Only 1 round - Play[] plays = round.getPlays(); - for(Play play : plays){ - System.out.println("Hole number: " + play.getHoleNumber()); - } - System.out.println("Enter the hole number: "); - int holeNum = Integer.parseInt(sc.nextLine()); - - Course course = round.getCourse(); - for(Hole hole : course.getHoles()){ - if(hole.getNumber() == holeNum){ - return new HoleStats(baseStats, hole); - } - } - return baseStats; - } - @Override public List<MenuOption> getMenuOptions() { return List.of( @@ -134,4 +78,56 @@ public class StatisticsMenu extends Menu { }) ); } + + // Helper classes to get user input and handle finding the data they requested (Course, Hole, Year, etc.) + private Statistics getUserYear(Statistics baseStats){ + Scanner sc = new Scanner(System.in); + + System.out.println("Enter year to search: "); + int year = Integer.parseInt(sc.nextLine()); + + Statistics yearStats = new YearlyStats(baseStats, year); + return yearStats; + } + + private Statistics getUserCourse(Statistics baseStats){ + Scanner sc = new Scanner(System.in); + Course[] courses = golfer.getCourses(); + for(int i = 0; i < courses.length; i++){ + System.out.println((i+1) + ".) Name: " + courses[i].getName() + ". Location: " + courses[i].getLocation()); + } + System.out.println("Select the course number corresponding to the course. "); + int selection = Integer.parseInt(sc.nextLine()); + return new CourseStats(baseStats, courses[selection - 1]); + } + + private Statistics getUserRound(Statistics baseStats){ + Scanner sc = new Scanner(System.in); + Round[] rounds = baseStats.getRounds(); + for(int i = 0; i < rounds.length; i++){ + System.out.println((i+1) + ".) Date: " + rounds[i].getDateTime().toLocalDate() + ". Time: " + rounds[i].getDateTime().toLocalTime() + ". Final Score: " + rounds[i].getTotalSwings() + ". Total Distance: " + rounds[i].getTotalDistance()); + } + System.out.println("Select the round number: "); + int selection = Integer.parseInt(sc.nextLine()); + return new RoundStats(baseStats, rounds[selection - 1]); + } + + private Statistics getUserHole(Statistics baseStats){ + Scanner sc = new Scanner(System.in); + Round round = baseStats.getRounds()[0]; // Only 1 round + Play[] plays = round.getPlays(); + for(Play play : plays){ + System.out.println("Hole number: " + play.getHoleNumber()); + } + System.out.println("Enter the hole number: "); + int holeNum = Integer.parseInt(sc.nextLine()); + + Course course = round.getCourse(); + for(Hole hole : course.getHoles()){ + if(hole.getNumber() == holeNum){ + return new HoleStats(baseStats, hole); + } + } + return baseStats; + } }
\ No newline at end of file diff --git a/src/main/java/design/controller/userinput/menus/UserSettings.java b/src/main/java/design/controller/userinput/menus/UserSettings.java index 34b645d..04ec4d0 100644 --- a/src/main/java/design/controller/userinput/menus/UserSettings.java +++ b/src/main/java/design/controller/userinput/menus/UserSettings.java @@ -60,8 +60,6 @@ public class UserSettings extends Menu { this.present(); })); - opts.add(new MenuOption("add a club...", () -> new AddClubMenu().present())); - return opts; } } diff --git a/src/main/java/design/model/Course.java b/src/main/java/design/model/Course.java index c199563..ce7c0e3 100644 --- a/src/main/java/design/model/Course.java +++ b/src/main/java/design/model/Course.java @@ -1,6 +1,5 @@ package design.model; -import design.model.course_search.CourseList; import design.model.course_search.ICourse; import java.util.List; @@ -9,7 +8,7 @@ public class Course implements ICourse { private final int id; private final String name; - private final int difficultyRating; + private final float difficultyRating; private final String location; private final int holeCount; private final int totalPar; @@ -61,6 +60,7 @@ public class Course implements ICourse { @Override public String toString() { - return name + ", " + location + ", " + difficultyRating + ", " + holeCount + ", " + totalPar; + return String.format("%s (%s) | Holes: %d | Total Par: %d | Difficulty: %.1f", + name, location, holeCount, totalPar, difficultyRating); } } diff --git a/src/main/java/design/model/Golfer.java b/src/main/java/design/model/Golfer.java index d34073f..07c2368 100644 --- a/src/main/java/design/model/Golfer.java +++ b/src/main/java/design/model/Golfer.java @@ -12,7 +12,7 @@ public class Golfer { private final List<Course> courses; private final List<Round> rounds; private final List<Club> clubs; // Keep track of golfer's clubs - private int nextClubId = 1; + private int nextClubId; @JsonCreator private Golfer(String username, int passwordHash, String fullName, List<Course> courses, List<Round> rounds, @@ -93,4 +93,13 @@ public class Golfer { public Club[] getClubs() { return clubs.toArray(Club[]::new); } + + @Override + public String toString() { + return String.format("%s (@%s)", fullName, username); + } + + public void removeClub(Club c) { + clubs.remove(c); + } } |
