From 5f8bc7b2e35cf005b44e22e56f8be3f95127fd1b Mon Sep 17 00:00:00 2001 From: sowgro Date: Thu, 2 Oct 2025 17:36:01 -0400 Subject: Begin impl of user input subsystem --- src/main/java/design/HelloWorld.java | 7 ------ src/main/java/design/Main.java | 10 ++++++++ .../java/design/controller/userinput/Action.java | 5 ++++ .../design/controller/userinput/CommandOption.java | 19 +++++++++++++++ .../design/controller/userinput/ParPalCLI.java | 28 ++++++++++++++++++++++ 5 files changed, 62 insertions(+), 7 deletions(-) delete mode 100644 src/main/java/design/HelloWorld.java create mode 100644 src/main/java/design/Main.java create mode 100644 src/main/java/design/controller/userinput/Action.java create mode 100644 src/main/java/design/controller/userinput/CommandOption.java create mode 100644 src/main/java/design/controller/userinput/ParPalCLI.java (limited to 'src') diff --git a/src/main/java/design/HelloWorld.java b/src/main/java/design/HelloWorld.java deleted file mode 100644 index ea552f9..0000000 --- a/src/main/java/design/HelloWorld.java +++ /dev/null @@ -1,7 +0,0 @@ -package design; - -public class HelloWorld { - public static void main(String[] args) { - System.out.println("Hello, World!"); - } -} diff --git a/src/main/java/design/Main.java b/src/main/java/design/Main.java new file mode 100644 index 0000000..43a8eb6 --- /dev/null +++ b/src/main/java/design/Main.java @@ -0,0 +1,10 @@ +package design; + +import design.controller.userinput.ParPalCLI; + +public class Main { + public static void main(String[] args) { + var cli = new ParPalCLI(); + cli.start(args); + } +} diff --git a/src/main/java/design/controller/userinput/Action.java b/src/main/java/design/controller/userinput/Action.java new file mode 100644 index 0000000..0569c48 --- /dev/null +++ b/src/main/java/design/controller/userinput/Action.java @@ -0,0 +1,5 @@ +package design.controller.userinput; + +public interface Action { + void onCommand(String[] args); +} diff --git a/src/main/java/design/controller/userinput/CommandOption.java b/src/main/java/design/controller/userinput/CommandOption.java new file mode 100644 index 0000000..31b63d4 --- /dev/null +++ b/src/main/java/design/controller/userinput/CommandOption.java @@ -0,0 +1,19 @@ +package design.controller.userinput; + +public class CommandOption { + Action action; + String name; + + public CommandOption(Action action, String name) { + this.action = action; + this.name = name; + } + + public String getName() { + return name; + } + + public void onCommand(String[] args) { + action.onCommand(args); + } +} diff --git a/src/main/java/design/controller/userinput/ParPalCLI.java b/src/main/java/design/controller/userinput/ParPalCLI.java new file mode 100644 index 0000000..7707754 --- /dev/null +++ b/src/main/java/design/controller/userinput/ParPalCLI.java @@ -0,0 +1,28 @@ +package design.controller.userinput; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class ParPalCLI { + + public void start(String[] args) { + + } + + public void promptUser(List commandOptions) { + for (int i = 0; i < commandOptions.size(); i++) { + CommandOption commandOption = commandOptions.get(i); + System.out.printf("%s: %s\n", i, commandOption.getName()); + } + Scanner sc = new Scanner(System.in); + var line = sc.nextLine().split(" "); + + if (line.length > 0) { + int i = Integer.parseInt(line[0]); + + commandOptions.get(i).onCommand(Arrays.copyOfRange(line, 1, line.length)); + } + } +} -- cgit v1.2.3 From d97f1a846bb872db8a0954c2214fb0a757542e8b Mon Sep 17 00:00:00 2001 From: sowgro Date: Sat, 4 Oct 2025 15:13:22 -0400 Subject: Initial version mostly working --- src/main/java/design/Main.java | 10 ---- src/main/java/design/ParPal.java | 9 +--- .../java/design/controller/userinput/Action.java | 1 + .../design/controller/userinput/CommandOption.java | 19 -------- .../java/design/controller/userinput/Menu.java | 54 ++++++++++++++++++++++ .../design/controller/userinput/MenuOption.java | 19 ++++++++ .../design/controller/userinput/ParPalCLI.java | 28 ----------- .../controller/userinput/menus/MainMenu.java | 17 +++++++ .../controller/userinput/menus/SelectUser.java | 20 ++++++++ .../controller/userinput/menus/StatisticsMenu.java | 14 ++++++ .../controller/userinput/menus/UserSettings.java | 18 ++++++++ 11 files changed, 145 insertions(+), 64 deletions(-) delete mode 100644 src/main/java/design/Main.java delete mode 100644 src/main/java/design/controller/userinput/CommandOption.java create mode 100644 src/main/java/design/controller/userinput/Menu.java create mode 100644 src/main/java/design/controller/userinput/MenuOption.java delete mode 100644 src/main/java/design/controller/userinput/ParPalCLI.java create mode 100644 src/main/java/design/controller/userinput/menus/MainMenu.java create mode 100644 src/main/java/design/controller/userinput/menus/SelectUser.java create mode 100644 src/main/java/design/controller/userinput/menus/StatisticsMenu.java create mode 100644 src/main/java/design/controller/userinput/menus/UserSettings.java (limited to 'src') diff --git a/src/main/java/design/Main.java b/src/main/java/design/Main.java deleted file mode 100644 index 43a8eb6..0000000 --- a/src/main/java/design/Main.java +++ /dev/null @@ -1,10 +0,0 @@ -package design; - -import design.controller.userinput.ParPalCLI; - -public class Main { - public static void main(String[] args) { - var cli = new ParPalCLI(); - cli.start(args); - } -} diff --git a/src/main/java/design/ParPal.java b/src/main/java/design/ParPal.java index db6891e..4ed6949 100644 --- a/src/main/java/design/ParPal.java +++ b/src/main/java/design/ParPal.java @@ -1,14 +1,9 @@ package design; -import design.persistence.MasterDatabase; -import design.persistence.PersonalDatabase; +import design.controller.userinput.menus.MainMenu; public class ParPal { public static void main(String[] args) { - var mdb = MasterDatabase.INSTANCE; - var pdb = PersonalDatabase.INSTANCE; - - System.out.println("done"); - + new MainMenu().present(); } } diff --git a/src/main/java/design/controller/userinput/Action.java b/src/main/java/design/controller/userinput/Action.java index 0569c48..0b52bfc 100644 --- a/src/main/java/design/controller/userinput/Action.java +++ b/src/main/java/design/controller/userinput/Action.java @@ -1,5 +1,6 @@ package design.controller.userinput; +@FunctionalInterface public interface Action { void onCommand(String[] args); } diff --git a/src/main/java/design/controller/userinput/CommandOption.java b/src/main/java/design/controller/userinput/CommandOption.java deleted file mode 100644 index 31b63d4..0000000 --- a/src/main/java/design/controller/userinput/CommandOption.java +++ /dev/null @@ -1,19 +0,0 @@ -package design.controller.userinput; - -public class CommandOption { - Action action; - String name; - - public CommandOption(Action action, String name) { - this.action = action; - this.name = name; - } - - public String getName() { - return name; - } - - public void onCommand(String[] args) { - action.onCommand(args); - } -} diff --git a/src/main/java/design/controller/userinput/Menu.java b/src/main/java/design/controller/userinput/Menu.java new file mode 100644 index 0000000..407d2ca --- /dev/null +++ b/src/main/java/design/controller/userinput/Menu.java @@ -0,0 +1,54 @@ +package design.controller.userinput; + +import java.util.*; + +public class Menu { + private final String title; + private final List menuOptions; + + public Menu(String title, List menuOptions) { + this.title = title; + this.menuOptions = menuOptions; + } + + public Menu(String title) { + this.title = title; + this.menuOptions = new ArrayList<>(); + } + + public boolean remove(MenuOption menuOption) { + return menuOptions.remove(menuOption); + } + + public boolean addAll(List c) { + return menuOptions.addAll(c); + } + + public boolean addAll(MenuOption... c) { + return addAll(Arrays.stream(c).toList()); + } + + public boolean add(MenuOption menuOption) { + return menuOptions.add(menuOption); + } + + public void present() { + System.out.printf("-- %s --\n", title.toUpperCase()); + for (int i = 0; i < menuOptions.size(); i++) { + MenuOption menuOption = menuOptions.get(i); + System.out.printf("%s: %s\n", i, menuOption.getName()); + } + Scanner sc = new Scanner(System.in); + var line = sc.nextLine(); + var split = line.split(" "); + + try { + int i = Integer.parseInt(split[0]); + menuOptions.get(i).onCommand(Arrays.copyOfRange(split, 1, split.length)); + } catch (Exception ex) { + System.err.printf("Invalid option \"%s\"\n", line); + present(); + } + } + +} diff --git a/src/main/java/design/controller/userinput/MenuOption.java b/src/main/java/design/controller/userinput/MenuOption.java new file mode 100644 index 0000000..9635ebd --- /dev/null +++ b/src/main/java/design/controller/userinput/MenuOption.java @@ -0,0 +1,19 @@ +package design.controller.userinput; + +public class MenuOption { + String name; + Action action; + + public MenuOption(String name, Action action) { + this.name = name; + this.action = action; + } + + public String getName() { + return name; + } + + public void onCommand(String[] args) { + action.onCommand(args); + } +} diff --git a/src/main/java/design/controller/userinput/ParPalCLI.java b/src/main/java/design/controller/userinput/ParPalCLI.java deleted file mode 100644 index 7707754..0000000 --- a/src/main/java/design/controller/userinput/ParPalCLI.java +++ /dev/null @@ -1,28 +0,0 @@ -package design.controller.userinput; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Scanner; - -public class ParPalCLI { - - public void start(String[] args) { - - } - - public void promptUser(List commandOptions) { - for (int i = 0; i < commandOptions.size(); i++) { - CommandOption commandOption = commandOptions.get(i); - System.out.printf("%s: %s\n", i, commandOption.getName()); - } - Scanner sc = new Scanner(System.in); - var line = sc.nextLine().split(" "); - - if (line.length > 0) { - int i = Integer.parseInt(line[0]); - - commandOptions.get(i).onCommand(Arrays.copyOfRange(line, 1, line.length)); - } - } -} diff --git a/src/main/java/design/controller/userinput/menus/MainMenu.java b/src/main/java/design/controller/userinput/menus/MainMenu.java new file mode 100644 index 0000000..b6fca7c --- /dev/null +++ b/src/main/java/design/controller/userinput/menus/MainMenu.java @@ -0,0 +1,17 @@ +package design.controller.userinput.menus; + +import design.controller.userinput.Menu; +import design.controller.userinput.MenuOption; + +public class MainMenu extends Menu { + public MainMenu() { + super("main menu"); + + addAll( + new MenuOption("user settings...", (a) -> new UserSettings().present()), + new MenuOption("statistics...", (a) -> new StatisticsMenu().present()), + new MenuOption("log round...", (a) -> {}), + 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 new file mode 100644 index 0000000..f5ddd64 --- /dev/null +++ b/src/main/java/design/controller/userinput/menus/SelectUser.java @@ -0,0 +1,20 @@ +package design.controller.userinput.menus; + +import design.controller.userinput.Menu; +import design.controller.userinput.MenuOption; +import design.persistence.PersonalDatabase; + +import java.util.Arrays; + +public class SelectUser extends Menu { + + PersonalDatabase personalDB = PersonalDatabase.INSTANCE; + + public SelectUser() { + super("select user"); + + addAll(Arrays.stream(personalDB.getGolfers()) + .map(i -> new MenuOption(i.getUsername(), (a) -> {})).toList()); + add(new MenuOption("", (a) -> {})); + } +} diff --git a/src/main/java/design/controller/userinput/menus/StatisticsMenu.java b/src/main/java/design/controller/userinput/menus/StatisticsMenu.java new file mode 100644 index 0000000..1d6de4b --- /dev/null +++ b/src/main/java/design/controller/userinput/menus/StatisticsMenu.java @@ -0,0 +1,14 @@ +package design.controller.userinput.menus; + +import design.controller.userinput.Menu; +import design.controller.userinput.MenuOption; + +public class StatisticsMenu extends Menu { + public StatisticsMenu() { + super("statistics menu"); + + addAll( + new MenuOption("return to main menu", (c) -> new MainMenu().present()) + ); + } +} diff --git a/src/main/java/design/controller/userinput/menus/UserSettings.java b/src/main/java/design/controller/userinput/menus/UserSettings.java new file mode 100644 index 0000000..fd9a311 --- /dev/null +++ b/src/main/java/design/controller/userinput/menus/UserSettings.java @@ -0,0 +1,18 @@ +package design.controller.userinput.menus; + +import design.controller.userinput.Menu; +import design.controller.userinput.MenuOption; + +public class UserSettings extends Menu { + + public UserSettings() { + super("user settings"); + + addAll( + new MenuOption("return to main menu", (a) -> new MainMenu().present()), + new MenuOption("switch user...", (a) -> new SelectUser().present()), + new MenuOption("set username...", (a -> {})), + new MenuOption("set password...", (a) -> {}) + ); + } +} -- cgit v1.2.3 From 75ef9ca83d43051616c0083af85eacbd71b4b4b6 Mon Sep 17 00:00:00 2001 From: sowgro Date: Sun, 5 Oct 2025 14:06:20 -0400 Subject: Reorganize menu api --- .../java/design/controller/userinput/Menu.java | 34 ++++------------------ .../controller/userinput/menus/MainMenu.java | 12 ++++++-- .../controller/userinput/menus/SelectUser.java | 17 +++++++---- .../controller/userinput/menus/StatisticsMenu.java | 13 +++++++-- .../controller/userinput/menus/UserSettings.java | 12 ++++++-- 5 files changed, 45 insertions(+), 43 deletions(-) (limited to 'src') diff --git a/src/main/java/design/controller/userinput/Menu.java b/src/main/java/design/controller/userinput/Menu.java index 407d2ca..7677793 100644 --- a/src/main/java/design/controller/userinput/Menu.java +++ b/src/main/java/design/controller/userinput/Menu.java @@ -2,38 +2,14 @@ package design.controller.userinput; import java.util.*; -public class Menu { - private final String title; - private final List menuOptions; +public abstract class Menu { + public abstract String getTitle(); - public Menu(String title, List menuOptions) { - this.title = title; - this.menuOptions = menuOptions; - } - - public Menu(String title) { - this.title = title; - this.menuOptions = new ArrayList<>(); - } - - public boolean remove(MenuOption menuOption) { - return menuOptions.remove(menuOption); - } - - public boolean addAll(List c) { - return menuOptions.addAll(c); - } - - public boolean addAll(MenuOption... c) { - return addAll(Arrays.stream(c).toList()); - } - - public boolean add(MenuOption menuOption) { - return menuOptions.add(menuOption); - } + public abstract List getMenuOptions(); public void present() { - System.out.printf("-- %s --\n", title.toUpperCase()); + var menuOptions = getMenuOptions(); + System.out.printf("-- %s --\n", getTitle().toUpperCase()); for (int i = 0; i < menuOptions.size(); i++) { MenuOption menuOption = menuOptions.get(i); System.out.printf("%s: %s\n", i, menuOption.getName()); diff --git a/src/main/java/design/controller/userinput/menus/MainMenu.java b/src/main/java/design/controller/userinput/menus/MainMenu.java index b6fca7c..fb3cee9 100644 --- a/src/main/java/design/controller/userinput/menus/MainMenu.java +++ b/src/main/java/design/controller/userinput/menus/MainMenu.java @@ -3,11 +3,17 @@ package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; +import java.util.List; + public class MainMenu extends Menu { - public MainMenu() { - super("main menu"); + @Override + public String getTitle() { + return "main menu"; + } - addAll( + @Override + public List getMenuOptions() { + return List.of( new MenuOption("user settings...", (a) -> new UserSettings().present()), new MenuOption("statistics...", (a) -> new StatisticsMenu().present()), new MenuOption("log round...", (a) -> {}), diff --git a/src/main/java/design/controller/userinput/menus/SelectUser.java b/src/main/java/design/controller/userinput/menus/SelectUser.java index f5ddd64..1963f1d 100644 --- a/src/main/java/design/controller/userinput/menus/SelectUser.java +++ b/src/main/java/design/controller/userinput/menus/SelectUser.java @@ -4,17 +4,24 @@ import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; import design.persistence.PersonalDatabase; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; public class SelectUser extends Menu { - PersonalDatabase personalDB = PersonalDatabase.INSTANCE; - public SelectUser() { - super("select user"); + @Override + public String getTitle() { + return "select user"; + } - addAll(Arrays.stream(personalDB.getGolfers()) + @Override + public List getMenuOptions() { + var l = new ArrayList(); + l.addAll(Arrays.stream(personalDB.getGolfers()) .map(i -> new MenuOption(i.getUsername(), (a) -> {})).toList()); - add(new MenuOption("", (a) -> {})); + l.add(new MenuOption("", (a) -> {})); + return l; } } diff --git a/src/main/java/design/controller/userinput/menus/StatisticsMenu.java b/src/main/java/design/controller/userinput/menus/StatisticsMenu.java index 1d6de4b..66d60e3 100644 --- a/src/main/java/design/controller/userinput/menus/StatisticsMenu.java +++ b/src/main/java/design/controller/userinput/menus/StatisticsMenu.java @@ -3,11 +3,18 @@ package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; +import java.util.List; + public class StatisticsMenu extends Menu { - public StatisticsMenu() { - super("statistics menu"); - addAll( + @Override + public String getTitle() { + return "statistics menu"; + } + + @Override + public List getMenuOptions() { + return List.of( new MenuOption("return to main menu", (c) -> new MainMenu().present()) ); } diff --git a/src/main/java/design/controller/userinput/menus/UserSettings.java b/src/main/java/design/controller/userinput/menus/UserSettings.java index fd9a311..a866889 100644 --- a/src/main/java/design/controller/userinput/menus/UserSettings.java +++ b/src/main/java/design/controller/userinput/menus/UserSettings.java @@ -3,12 +3,18 @@ package design.controller.userinput.menus; import design.controller.userinput.Menu; import design.controller.userinput.MenuOption; +import java.util.List; + public class UserSettings extends Menu { - public UserSettings() { - super("user settings"); + @Override + public String getTitle() { + return "user settings"; + } - addAll( + @Override + public List getMenuOptions() { + return List.of( new MenuOption("return to main menu", (a) -> new MainMenu().present()), new MenuOption("switch user...", (a) -> new SelectUser().present()), new MenuOption("set username...", (a -> {})), -- cgit v1.2.3