From fac7fb71260b901a893b5b90aae23e86d6c23550 Mon Sep 17 00:00:00 2001 From: sowgro Date: Sat, 11 Oct 2025 22:24:54 -0400 Subject: Menu cleanup - pass 2 --- .../controller/userinput/menus/CourseSearch.java | 6 +- .../userinput/menus/CourseSelectMenu.java | 2 +- .../controller/userinput/menus/FiltersMenu.java | 53 ---------- .../controller/userinput/menus/HolePlayMenu.java | 24 +---- .../controller/userinput/menus/ManageClubs.java | 83 +++++++--------- .../controller/userinput/menus/ManageCourses.java | 26 +---- .../controller/userinput/menus/SearchMenu.java | 41 ++++++-- .../controller/userinput/menus/SelectClub.java | 34 +++++++ .../controller/userinput/menus/SelectCourse.java | 34 +++++++ .../controller/userinput/menus/SelectUser.java | 29 +++--- .../controller/userinput/menus/StatisticsMenu.java | 109 +++++++++++---------- 11 files changed, 218 insertions(+), 223 deletions(-) delete mode 100644 src/main/java/design/controller/userinput/menus/FiltersMenu.java create mode 100644 src/main/java/design/controller/userinput/menus/SelectClub.java create mode 100644 src/main/java/design/controller/userinput/menus/SelectCourse.java (limited to 'src/main/java/design/controller/userinput/menus') diff --git a/src/main/java/design/controller/userinput/menus/CourseSearch.java b/src/main/java/design/controller/userinput/menus/CourseSearch.java index 65d4b3e..0d5efa6 100644 --- a/src/main/java/design/controller/userinput/menus/CourseSearch.java +++ b/src/main/java/design/controller/userinput/menus/CourseSearch.java @@ -19,8 +19,8 @@ import java.util.Scanner; * The actual SEARCH feature of course searching. */ public class CourseSearch extends Menu { - CurrentSearchQuery query = CurrentSearchQuery.INSTANCE; - PersonalDatabase GolferDB = PersonalDatabase.INSTANCE; + private final CurrentSearchQuery query = CurrentSearchQuery.INSTANCE; + private final PersonalDatabase personalDB = PersonalDatabase.INSTANCE; @Override public String getTitle() { @@ -85,7 +85,7 @@ public class CourseSearch extends Menu { // add the course, try to save to DB. currentGolfer.addCourse(c); try { - GolferDB.updateGolfer(currentGolfer); + personalDB.updateGolfer(currentGolfer); } catch (IOException e) { e.printStackTrace(); // not sure if we should format this prettier for the user if the DB fails. } diff --git a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java index 581b0b9..4b53adb 100644 --- a/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java +++ b/src/main/java/design/controller/userinput/menus/CourseSelectMenu.java @@ -15,7 +15,7 @@ import java.util.Scanner; import design.runtime.Session; public class CourseSelectMenu extends Menu { - Golfer golfer = Session.getCurrentGolfer(); + private final Golfer golfer = Session.getCurrentGolfer(); @Override public String getTitle() { diff --git a/src/main/java/design/controller/userinput/menus/FiltersMenu.java b/src/main/java/design/controller/userinput/menus/FiltersMenu.java deleted file mode 100644 index 103d62b..0000000 --- a/src/main/java/design/controller/userinput/menus/FiltersMenu.java +++ /dev/null @@ -1,53 +0,0 @@ -package design.controller.userinput.menus; - -import design.controller.userinput.Menu; -import design.controller.userinput.MenuOption; -import design.model.course_search.*; - -import java.util.List; - -import design.model.course_search.CurrentSearchQuery; - -/* - * Tracks the user's current filters on their search. - */ -public class FiltersMenu extends Menu { - CurrentSearchQuery query = CurrentSearchQuery.INSTANCE; - - @Override - public String getTitle() { - return "filter menu"; - } - - /* - * show our current filters. - */ - @Override - public List 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) { - CurrentSearchQuery.INSTANCE.addFilter(filter); - System.out.println("\nAdded filter.\n"); - new SearchMenu().present(); - } - - /* - * clear all of our filters. - */ - public void clearFilters() { - CurrentSearchQuery.INSTANCE.clearFilters(); - System.out.println("\nCleared all filters.\n"); - 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 33450c9..48fff4e 100644 --- a/src/main/java/design/controller/userinput/menus/HolePlayMenu.java +++ b/src/main/java/design/controller/userinput/menus/HolePlayMenu.java @@ -46,35 +46,19 @@ public class HolePlayMenu extends Menu { opts.add(new MenuOption("take a shot", () -> { // loads golfers clubs var golfer = Session.getCurrentGolfer(); - Club[] clubs = (golfer == null) ? new Club[0] : golfer.getClubs(); - if (clubs.length == 0) { + if (!golfer.hasClubs()) { System.out.println("You don't have any clubs yet. Add one first."); // new AddClubMenu().present(); this.present(); return; } - // list clubs - System.out.println("-- YOUR CLUBS --"); - for (int i = 0; i < clubs.length; i++) { - Club c = clubs[i]; - System.out.println(c); - } + var selectClub = new SelectClub(golfer); + selectClub.present(); + Club club = selectClub.getResult(); - // user selects one of their clubs Scanner sc = new Scanner(System.in); - Club club = null; - while (club == null) { - System.out.print("Select club # (1.." + clubs.length + "): "); - String line = sc.nextLine().trim(); - int idx = Integer.parseInt(line); - if (idx < 1 || idx > clubs.length) { - System.out.println("Out of range. Try again."); - continue; - } - club = clubs[idx - 1]; - } // Get shot distance (defaults to 0 of not stated) System.out.print("Distance (yds, blank=0): "); diff --git a/src/main/java/design/controller/userinput/menus/ManageClubs.java b/src/main/java/design/controller/userinput/menus/ManageClubs.java index 56d645f..6786553 100644 --- a/src/main/java/design/controller/userinput/menus/ManageClubs.java +++ b/src/main/java/design/controller/userinput/menus/ManageClubs.java @@ -8,12 +8,13 @@ import design.persistence.PersonalDatabase; 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 ManageClubs extends Menu { - Golfer golfer = Session.getCurrentGolfer(); + private final Golfer golfer = Session.getCurrentGolfer(); + private final PersonalDatabase personalDB = PersonalDatabase.INSTANCE; @Override public String getTitle() { @@ -33,34 +34,13 @@ public class ManageClubs extends Menu { })); opts.add(new MenuOption("remove club...", () -> { - new Menu() { - @Override - public String getTitle() { - return "remove club"; - } - - @Override - public List getMenuOptions() { - List 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(); + var selector = new SelectClub(golfer); + selector.present(); + golfer.removeClub(selector.getResult()); + this.present(); })); opts.add(new MenuOption("add club...", () -> { - if (golfer == null) { - System.out.println("No user loaded."); - new UserSettings().present(); - return; - } - Scanner sc = new Scanner(System.in); System.out.print("Manufacturer: "); @@ -69,37 +49,42 @@ public class ManageClubs extends Menu { System.out.print("Nickname: "); String nickname = sc.nextLine().trim(); - // Pick type - Club.ClubType[] types = Club.ClubType.values(); - System.out.println("Club type:"); - for (int i = 0; i < types.length; i++) { - System.out.printf("%d: %s%n", i + 1, types[i]); - } - - Club.ClubType type = null; - while (type == null) { - System.out.print("Select (1.." + types.length + "): "); - String line = sc.nextLine().trim(); - int idx = Integer.parseInt(line); - if (idx < 1 || idx > types.length) { - System.out.println("Out of range. Try again."); - continue; - } - type = types[idx - 1]; - } + var selector = new SelectClubType(); + selector.present(); + Club.ClubType type = selector.getResult(); golfer.addClub(manufacture, nickname, type); // Add club to JSON try { - PersonalDatabase.INSTANCE.updateGolfer(golfer); + personalDB.updateGolfer(golfer); System.out.println("Club added and saved."); } catch (IOException e) { throw new RuntimeException("Failed to save club", e); } - new UserSettings().present(); - }));// Pick type -// Add club to JSON + this.present(); + })); + return opts; } + + private static class SelectClubType extends Menu { + private Club.ClubType result; + + @Override + public String getTitle() { + return "select club type"; + } + + public Club.ClubType getResult() { + return result; + } + + @Override + public List getMenuOptions() { + return Arrays.stream(Club.ClubType.values()) + .map(t -> new MenuOption(t.name(), () -> result = t)) + .toList(); + } + } } diff --git a/src/main/java/design/controller/userinput/menus/ManageCourses.java b/src/main/java/design/controller/userinput/menus/ManageCourses.java index 5156a9b..dff48dc 100644 --- a/src/main/java/design/controller/userinput/menus/ManageCourses.java +++ b/src/main/java/design/controller/userinput/menus/ManageCourses.java @@ -6,11 +6,10 @@ 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(); + private final Golfer golfer = Session.getCurrentGolfer(); @Override public String getTitle() { @@ -30,25 +29,10 @@ public class ManageCourses extends Menu { })); opts.add(new MenuOption("remove course...", () -> { - new Menu() { - @Override - public String getTitle() { - return "remove course"; - } - - @Override - public List getMenuOptions() { - List 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(); + var selector = new SelectCourse(golfer); + selector.present(); + golfer.removeCourse(selector.getResult()); + this.present(); })); opts.add(new MenuOption("add course...", () -> new SearchMenu().present())); diff --git a/src/main/java/design/controller/userinput/menus/SearchMenu.java b/src/main/java/design/controller/userinput/menus/SearchMenu.java index 609ce23..6d9fe26 100644 --- a/src/main/java/design/controller/userinput/menus/SearchMenu.java +++ b/src/main/java/design/controller/userinput/menus/SearchMenu.java @@ -2,10 +2,7 @@ package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; -import design.model.course_search.SortByDifficulty; -import design.model.course_search.SortByHoles; -import design.model.course_search.SortByLocation; -import design.model.course_search.SortByPar; +import design.model.course_search.*; import java.util.List; @@ -13,6 +10,7 @@ import java.util.List; * The main control panel for course searching. */ public class SearchMenu extends Menu { + private final CurrentSearchQuery query = CurrentSearchQuery.INSTANCE; @Override public String getTitle() { @@ -24,12 +22,35 @@ public class SearchMenu extends Menu { return List.of( new MenuOption("return to main menu", () -> new MainMenu().present()), new MenuOption("search...", () -> new CourseSearch().present()), - new MenuOption("add difficulty filter...", () -> new FiltersMenu().addFilter(new SortByDifficulty())), - new MenuOption("add hole count filter...", () -> new FiltersMenu().addFilter(new SortByHoles())), - new MenuOption("add location filter...", () -> new FiltersMenu().addFilter(new SortByLocation())), - new MenuOption("add par filter...", () -> new FiltersMenu().addFilter(new SortByPar())), - new MenuOption("list filters", () -> new FiltersMenu().present()), - new MenuOption("clear all filters", () -> new FiltersMenu().clearFilters()) + new MenuOption("add difficulty filter...", () -> addFilter(new SortByDifficulty())), + new MenuOption("add hole count filter...", () -> addFilter(new SortByHoles())), + new MenuOption("add location filter...", () -> addFilter(new SortByLocation())), + new MenuOption("add par filter...", () -> addFilter(new SortByPar())), + new MenuOption("list filters", this::printFilters), + new MenuOption("clear all filters", this::clearFilters) ); } + + private void printFilters() { + System.out.println("\nYou are filtering by "); + System.out.println(query.printFilters()); + } + + /* + * Add a new filter to our filter list + */ + public void addFilter(CourseSorter filter) { + query.addFilter(filter); + System.out.println("\nAdded filter.\n"); + new SearchMenu().present(); + } + + /* + * clear all of our filters. + */ + public void clearFilters() { + query.clearFilters(); + System.out.println("\nCleared all filters.\n"); + new SearchMenu().present(); + } } diff --git a/src/main/java/design/controller/userinput/menus/SelectClub.java b/src/main/java/design/controller/userinput/menus/SelectClub.java new file mode 100644 index 0000000..09facdb --- /dev/null +++ b/src/main/java/design/controller/userinput/menus/SelectClub.java @@ -0,0 +1,34 @@ +package design.controller.userinput.menus; + +import design.controller.userinput.Menu; +import design.controller.userinput.MenuOption; +import design.model.Club; +import design.model.Golfer; + +import java.util.Arrays; +import java.util.List; + +public class SelectClub extends Menu { + private final Golfer golfer; + private Club result; + + public SelectClub(Golfer golfer) { + this.golfer = golfer; + } + + @Override + public String getTitle() { + return "select club"; + } + + public Club getResult() { + return result; + } + + @Override + public List getMenuOptions() { + return Arrays.stream(golfer.getClubs()) + .map(g -> new MenuOption(g.toString(), () -> result = g)) + .toList(); + } +} diff --git a/src/main/java/design/controller/userinput/menus/SelectCourse.java b/src/main/java/design/controller/userinput/menus/SelectCourse.java new file mode 100644 index 0000000..811586f --- /dev/null +++ b/src/main/java/design/controller/userinput/menus/SelectCourse.java @@ -0,0 +1,34 @@ +package design.controller.userinput.menus; + +import design.controller.userinput.Menu; +import design.controller.userinput.MenuOption; +import design.model.Course; +import design.model.Golfer; + +import java.util.Arrays; +import java.util.List; + +public class SelectCourse extends Menu { + private final Golfer golfer; + private Course result; + + public SelectCourse(Golfer golfer) { + this.golfer = golfer; + } + + @Override + public String getTitle() { + return "select course"; + } + + public Course getResult() { + return result; + } + + @Override + public List getMenuOptions() { + return Arrays.stream(golfer.getCourses()) + .map(c -> new MenuOption(c.toString(), () -> result = c)) + .toList(); + } +} diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java index 8f0a809..646124d 100644 --- a/src/main/java/design/controller/userinput/menus/SelectUser.java +++ b/src/main/java/design/controller/userinput/menus/SelectUser.java @@ -31,24 +31,11 @@ public class SelectUser extends Menu { var opts = new ArrayList(); for (Golfer i : personalDB.getGolfers()) { - 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); - doAfter.onAction(); - } else { - System.out.println("Incorrect password. "); - this.present(); - } - }); + MenuOption menuOption = new MenuOption(i.toString(), () -> login(i)); opts.add(menuOption); } opts.add(new MenuOption("", () -> { - System.out.print("Enter username: "); var username = scanner.nextLine(); @@ -68,4 +55,18 @@ public class SelectUser extends Menu { return opts; } + + private void login(Golfer g) { + System.out.print("Enter password: "); + var password = scanner.nextLine(); + if (g.checkPassword(password)) { + // Sets user in Session too + Session.setCurrentGolfer(g); + System.out.printf("Loaded user: %s%n", g); + doAfter.onAction(); + } else { + System.out.println("Incorrect password. "); + this.present(); + } + } } diff --git a/src/main/java/design/controller/userinput/menus/StatisticsMenu.java b/src/main/java/design/controller/userinput/menus/StatisticsMenu.java index 8835ce1..9ce0bd0 100644 --- a/src/main/java/design/controller/userinput/menus/StatisticsMenu.java +++ b/src/main/java/design/controller/userinput/menus/StatisticsMenu.java @@ -19,8 +19,7 @@ import java.util.List; import java.util.Scanner; public class StatisticsMenu extends Menu { - - Golfer golfer = Session.getCurrentGolfer(); + private final Golfer golfer = Session.getCurrentGolfer(); @Override public String getTitle() { @@ -29,54 +28,61 @@ public class StatisticsMenu extends Menu { @Override public List getMenuOptions() { - return List.of( - new MenuOption("return to main menu", () -> new MainMenu().present()), - new MenuOption("view lifetime statistics", () -> { - Statistics stats = new LifetimeStats(golfer); - - System.out.printf("Total swings: %d\n", stats.get_score()); - System.out.printf("Total distance: %.1f\n", stats.get_distance()); - this.present(); - }), - new MenuOption("view yearly statistics", () -> { - Statistics baseStats = new LifetimeStats(golfer); - Statistics yearStats = getUserYear(baseStats); - - System.out.printf("Total swings: %d\n", yearStats.get_score()); - System.out.printf("Total distance: %.1f\n", yearStats.get_distance()); - this.present(); - }), - new MenuOption("view course statistics", () -> { - Statistics baseStats = new LifetimeStats(golfer); - Statistics yearStats = getUserYear(baseStats); - Statistics courseStats = getUserCourse(yearStats); - - System.out.printf("Total swings: %d\n", courseStats.get_score()); - System.out.printf("Total distance: %.1f\n", courseStats.get_distance()); - this.present(); - }), - new MenuOption("view round statistics", () -> { - Statistics baseStats = new LifetimeStats(golfer); - Statistics yearStats = getUserYear(baseStats); - Statistics courseStats = getUserCourse(yearStats); - Statistics roundStats = getUserRound(courseStats); - - System.out.printf("Total swings: %d\n", roundStats.get_score()); - System.out.printf("Total distance: %.1f\n", roundStats.get_distance()); - this.present(); - }), - new MenuOption("view hole statistics", () -> { - Statistics baseStats = new LifetimeStats(golfer); - Statistics yearStats = getUserYear(baseStats); - Statistics courseStats = getUserCourse(yearStats); - Statistics roundStats = getUserRound(courseStats); - Statistics holeStats = getUserHole(roundStats); - - System.out.printf("Total swings: %d\n", holeStats.get_score()); - System.out.printf("Total distance: %.1f\n", holeStats.get_distance()); - this.present(); - }) - ); + List opts = new java.util.ArrayList<>(); + + opts.add(new MenuOption("return to main menu", () -> new MainMenu().present())); + + opts.add(new MenuOption("view lifetime statistics", () -> { + Statistics stats = new LifetimeStats(golfer); + + System.out.printf("Total swings: %d\n", stats.get_score()); + System.out.printf("Total distance: %.1f\n", stats.get_distance()); + this.present(); + })); + + opts.add(new MenuOption("view yearly statistics", () -> { + Statistics baseStats = new LifetimeStats(golfer); + Statistics yearStats = getUserYear(baseStats); + + System.out.printf("Total swings: %d\n", yearStats.get_score()); + System.out.printf("Total distance: %.1f\n", yearStats.get_distance()); + this.present(); + })); + + opts.add(new MenuOption("view course statistics", () -> { + Statistics baseStats = new LifetimeStats(golfer); + Statistics yearStats = getUserYear(baseStats); + Statistics courseStats = getUserCourse(yearStats); + + System.out.printf("Total swings: %d\n", courseStats.get_score()); + System.out.printf("Total distance: %.1f\n", courseStats.get_distance()); + this.present(); + })); + + opts.add(new MenuOption("view round statistics", () -> { + Statistics baseStats = new LifetimeStats(golfer); + Statistics yearStats = getUserYear(baseStats); + Statistics courseStats = getUserCourse(yearStats); + Statistics roundStats = getUserRound(courseStats); + + System.out.printf("Total swings: %d\n", roundStats.get_score()); + System.out.printf("Total distance: %.1f\n", roundStats.get_distance()); + this.present(); + })); + + opts.add(new MenuOption("view hole statistics", () -> { + Statistics baseStats = new LifetimeStats(golfer); + Statistics yearStats = getUserYear(baseStats); + Statistics courseStats = getUserCourse(yearStats); + Statistics roundStats = getUserRound(courseStats); + Statistics holeStats = getUserHole(roundStats); + + System.out.printf("Total swings: %d\n", holeStats.get_score()); + System.out.printf("Total distance: %.1f\n", holeStats.get_distance()); + this.present(); + })); + + return opts; } // Helper classes to get user input and handle finding the data they requested (Course, Hole, Year, etc.) @@ -86,8 +92,7 @@ public class StatisticsMenu extends Menu { System.out.println("Enter year to search: "); int year = Integer.parseInt(sc.nextLine()); - Statistics yearStats = new YearlyStats(baseStats, year); - return yearStats; + return new YearlyStats(baseStats, year); } private Statistics getUserCourse(Statistics baseStats){ -- cgit v1.2.3