diff --git a/pom.xml b/pom.xml index 9745481..a74db60 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,11 @@ javafx-fxml ${javafx.version} + + com.andrewlalis + javafx-scene-router + 1.1.0 + com.fasterxml.jackson.core diff --git a/src/main/java/com/andrewlalis/perfin/PerfinApp.java b/src/main/java/com/andrewlalis/perfin/PerfinApp.java index 918dd4a..3ad66d4 100644 --- a/src/main/java/com/andrewlalis/perfin/PerfinApp.java +++ b/src/main/java/com/andrewlalis/perfin/PerfinApp.java @@ -1,7 +1,7 @@ package com.andrewlalis.perfin; +import com.andrewlalis.javafx_scene_router.SceneRouter; import com.andrewlalis.perfin.control.MainViewController; -import com.andrewlalis.perfin.view.SceneRouter; import com.andrewlalis.perfin.view.SplashScreenStage; import javafx.application.Application; import javafx.scene.Scene; @@ -16,6 +16,11 @@ import java.util.function.Consumer; public class PerfinApp extends Application { public static final Path APP_DIR = Path.of(System.getProperty("user.home", "."), ".perfin"); + /** + * The router that's used for navigating between different "pages" in the application. + */ + public static final SceneRouter router = new SceneRouter(); + public static void main(String[] args) { launch(args); } @@ -24,6 +29,7 @@ public class PerfinApp extends Application { public void start(Stage stage) { SplashScreenStage splashStage = new SplashScreenStage("Loading", SceneUtil.load("/startup-splash-screen.fxml")); splashStage.show(); + defineRoutes(); initMainScreen(stage); splashStage.stateProperty().addListener((v, oldState, state) -> { if (state == SplashScreenStage.State.DONE) stage.show(); @@ -34,11 +40,15 @@ public class PerfinApp extends Application { private void initMainScreen(Stage stage) { stage.hide(); Scene mainViewScene = SceneUtil.load("/main-view.fxml", (Consumer) c -> { - c.router = new SceneRouter(c.mainContainer::setCenter) - .map("accounts", "/accounts-view.fxml") - .map("edit-account", "/edit-account.fxml"); + c.mainContainer.setCenter(router.getViewPane()); + router.navigate("accounts"); }); stage.setScene(mainViewScene); stage.setTitle("Perfin"); } + + private static void defineRoutes() { + router.map("accounts", SceneUtil.loadNode("/accounts-view.fxml")); + router.map("edit-account", SceneUtil.loadNode("/edit-account.fxml")); + } } \ No newline at end of file diff --git a/src/main/java/com/andrewlalis/perfin/control/MainViewController.java b/src/main/java/com/andrewlalis/perfin/control/MainViewController.java index af7fb5d..13363f8 100644 --- a/src/main/java/com/andrewlalis/perfin/control/MainViewController.java +++ b/src/main/java/com/andrewlalis/perfin/control/MainViewController.java @@ -1,12 +1,13 @@ package com.andrewlalis.perfin.control; -import com.andrewlalis.perfin.view.SceneRouter; +import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; +import static com.andrewlalis.perfin.PerfinApp.router; + public class MainViewController { - public SceneRouter router; @FXML public BorderPane mainContainer; @FXML @@ -14,11 +15,21 @@ public class MainViewController { @FXML public void goToAccounts() { - router.goTo("accounts"); + router.navigate("accounts"); } @FXML public void goToEditAccounts() { - router.goTo("edit-account"); + router.navigate("edit-account"); + } + + @FXML + public void goBack() { + router.navigateBack(); + } + + @FXML + public void goForward() { + router.navigateForward(); } } diff --git a/src/main/java/com/andrewlalis/perfin/view/SceneRouter.java b/src/main/java/com/andrewlalis/perfin/view/SceneRouter.java deleted file mode 100644 index 96a925c..0000000 --- a/src/main/java/com/andrewlalis/perfin/view/SceneRouter.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.andrewlalis.perfin.view; - -import com.andrewlalis.perfin.SceneUtil; -import javafx.application.Platform; -import javafx.scene.Parent; -import javafx.scene.layout.Pane; - -import java.util.HashMap; -import java.util.Map; -import java.util.function.Consumer; - -public class SceneRouter { - private final Consumer setter; - private final Map routeMap = new HashMap<>(); - public Object context = null; - - public SceneRouter(Pane pane) { - this(p -> pane.getChildren().setAll(p)); - } - - public SceneRouter(Consumer setter) { - this.setter = setter; - } - - public SceneRouter map(String route, Parent scene) { - routeMap.put(route, scene); - return this; - } - - public SceneRouter map(String route, String fxml) { - return map(route, SceneUtil.loadNode(fxml)); - } - - public void goTo(String route, Object context) { - Parent node = routeMap.get(route); - if (node == null) throw new IllegalArgumentException("Route " + route + " is not mapped to any node."); - this.context = context; - Platform.runLater(() -> setter.accept(node)); - } - - public void goTo(String route) { - goTo(route, null); - } - - @SuppressWarnings("unchecked") - public T getContext() { - return (T) context; - } -} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 68f3184..f349b22 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -3,11 +3,13 @@ module com.andrewlalis.perfin { requires javafx.controls; requires javafx.fxml; requires javafx.graphics; + requires com.andrewlalis.javafx_scene_router; requires com.fasterxml.jackson.databind; requires java.sql; exports com.andrewlalis.perfin to javafx.graphics; + exports com.andrewlalis.perfin.view to javafx.graphics; opens com.andrewlalis.perfin.control to javafx.fxml; } \ No newline at end of file diff --git a/src/main/resources/main-view.fxml b/src/main/resources/main-view.fxml index b2c380e..3184886 100644 --- a/src/main/resources/main-view.fxml +++ b/src/main/resources/main-view.fxml @@ -13,6 +13,8 @@