From 48ed6df6b41a3ea60d196537200adeea8f05cd5f Mon Sep 17 00:00:00 2001 From: ramollia <> Date: Tue, 28 Oct 2025 12:59:15 +0100 Subject: [PATCH] started working on the widget system --- app/src/main/java/org/toop/app/App.java | 9 ++++-- app/src/main/java/org/toop/app/Test.java | 14 ++++++++++ .../org/toop/app/canvas/ReversiCanvas.java | 5 ++-- .../java/org/toop/app/game/ReversiGame.java | 14 ++++------ .../main/java/org/toop/app/widget/Widget.java | 7 +++++ .../org/toop/app/widget/WidgetSystem.java | 28 +++++++++++++++++++ .../toop/app/widget/complex/PopupWidget.java | 16 +++++++++++ .../app/widget/complex/PrimaryWidget.java | 16 +++++++++++ .../toop/app/widget/complex/ViewWidget.java | 28 +++++++++++++++++++ .../widget/simple/LabeledButtonWidget.java | 26 +++++++++++++++++ .../org/toop/app/widget/view/QuitView.java | 12 ++++++++ 11 files changed, 163 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/org/toop/app/Test.java create mode 100644 app/src/main/java/org/toop/app/widget/Widget.java create mode 100644 app/src/main/java/org/toop/app/widget/WidgetSystem.java create mode 100644 app/src/main/java/org/toop/app/widget/complex/PopupWidget.java create mode 100644 app/src/main/java/org/toop/app/widget/complex/PrimaryWidget.java create mode 100644 app/src/main/java/org/toop/app/widget/complex/ViewWidget.java create mode 100644 app/src/main/java/org/toop/app/widget/simple/LabeledButtonWidget.java create mode 100644 app/src/main/java/org/toop/app/widget/view/QuitView.java diff --git a/app/src/main/java/org/toop/app/App.java b/app/src/main/java/org/toop/app/App.java index d9d1f7f..a24c518 100644 --- a/app/src/main/java/org/toop/app/App.java +++ b/app/src/main/java/org/toop/app/App.java @@ -3,6 +3,7 @@ package org.toop.app; import org.toop.app.view.ViewStack; import org.toop.app.view.views.MainView; import org.toop.app.view.views.QuitView; +import org.toop.app.widget.WidgetSystem; import org.toop.framework.audio.events.AudioEvents; import org.toop.framework.eventbus.EventFlow; import org.toop.framework.resource.ResourceManager; @@ -30,14 +31,18 @@ public final class App extends Application { @Override public void start(Stage stage) throws Exception { - final StackPane root = new StackPane(); + final StackPane root = WidgetSystem.setup(); + final Scene scene = new Scene(root); ViewStack.setup(scene); + scene.setRoot(root); stage.setTitle(AppContext.getString("app-title")); stage.setWidth(1080); stage.setHeight(720); + scene.getRoot(); + stage.setOnCloseRequest(event -> { event.consume(); startQuit(); @@ -59,7 +64,7 @@ public final class App extends Application { AppSettings.applySettings(); new EventFlow().addPostEvent(new AudioEvents.StartBackgroundMusic()).asyncPostEvent(); - ViewStack.push(new MainView()); + // ViewStack.push(new MainView()); } public static void startQuit() { diff --git a/app/src/main/java/org/toop/app/Test.java b/app/src/main/java/org/toop/app/Test.java new file mode 100644 index 0000000..5a4b40a --- /dev/null +++ b/app/src/main/java/org/toop/app/Test.java @@ -0,0 +1,14 @@ +//package org.toop.app; +// +//public class Quit { +// PopupWidget popup; +// Quit() { +// this.popup = new PopupWidget( +// new ConfirmationWidget( +// "are-you-sure", +// "yes", () -> App.quit(), +// "no", () -> popup.pop() +// ) +// ); +// } +//} \ No newline at end of file diff --git a/app/src/main/java/org/toop/app/canvas/ReversiCanvas.java b/app/src/main/java/org/toop/app/canvas/ReversiCanvas.java index 8eec0ad..313e0e9 100644 --- a/app/src/main/java/org/toop/app/canvas/ReversiCanvas.java +++ b/app/src/main/java/org/toop/app/canvas/ReversiCanvas.java @@ -17,7 +17,8 @@ public final class ReversiCanvas extends GameCanvas { drawDot(Color.WHITE, 27); } - public void drawLegalPosition(int cell) { - drawDot(new Color(1.0f, 0.0f, 0.0f, 0.5f), cell); + public void drawLegalPosition(Color color, int cell) { + fill(new Color(color.getRed() * 0.25, color.getGreen() * 0.25, color.getBlue() * 0.25, 1.0), cell); + drawDot(new Color(color.getRed() * 0.5, color.getGreen() * 0.5, color.getBlue() * 0.5, 1.0), cell); } } \ No newline at end of file diff --git a/app/src/main/java/org/toop/app/game/ReversiGame.java b/app/src/main/java/org/toop/app/game/ReversiGame.java index 64f0b6c..3645fb0 100644 --- a/app/src/main/java/org/toop/app/game/ReversiGame.java +++ b/app/src/main/java/org/toop/app/game/ReversiGame.java @@ -266,16 +266,14 @@ public final class ReversiGame { final SequentialTransition animation = new SequentialTransition(); isPaused.set(true); + final Color fromColor = game.getCurrentPlayer() == 0? Color.WHITE : Color.BLACK; + final Color toColor = game.getCurrentPlayer() == 0? Color.BLACK : Color.WHITE; + if (animate && flipped != null) { for (final Game.Move flip : flipped) { canvas.clear(flip.position()); - - final Color from = flip.value() == 'W' ? Color.BLACK : Color.WHITE; - final Color to = flip.value() == 'W' ? Color.WHITE : Color.BLACK; - - canvas.drawDot(from, flip.position()); - - animation.getChildren().addFirst(canvas.flipDot(from, to, flip.position())); + canvas.drawDot(fromColor, flip.position()); + animation.getChildren().addFirst(canvas.flipDot(fromColor, toColor, flip.position())); } } @@ -285,7 +283,7 @@ public final class ReversiGame { final Game.Move[] legalMoves = game.getLegalMoves(); for (final Game.Move legalMove : legalMoves) { - canvas.drawLegalPosition(legalMove.position()); + canvas.drawLegalPosition(toColor, legalMove.position()); } }); diff --git a/app/src/main/java/org/toop/app/widget/Widget.java b/app/src/main/java/org/toop/app/widget/Widget.java new file mode 100644 index 0000000..25b95cc --- /dev/null +++ b/app/src/main/java/org/toop/app/widget/Widget.java @@ -0,0 +1,7 @@ +package org.toop.app.widget; + +import javafx.scene.Node; + +public interface Widget { + T getNode(); +} \ No newline at end of file diff --git a/app/src/main/java/org/toop/app/widget/WidgetSystem.java b/app/src/main/java/org/toop/app/widget/WidgetSystem.java new file mode 100644 index 0000000..d02cb67 --- /dev/null +++ b/app/src/main/java/org/toop/app/widget/WidgetSystem.java @@ -0,0 +1,28 @@ +package org.toop.app.widget; + +import javafx.geometry.Pos; +import javafx.scene.layout.StackPane; + +public final class WidgetSystem { + private static StackPane root; + + public static StackPane setup() { + if (root != null) { + return root; + } + + root = new StackPane(); + root.getStyleClass().add("bg-primary"); + + return root; + } + + public static void add(Pos position, Widget widget) { + StackPane.setAlignment(widget.getNode(), position); + root.getChildren().add(widget.getNode()); + } + + public static void remove(Widget widget) { + root.getChildren().remove(widget.getNode()); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/toop/app/widget/complex/PopupWidget.java b/app/src/main/java/org/toop/app/widget/complex/PopupWidget.java new file mode 100644 index 0000000..9d44c80 --- /dev/null +++ b/app/src/main/java/org/toop/app/widget/complex/PopupWidget.java @@ -0,0 +1,16 @@ +package org.toop.app.widget.complex; + +import org.toop.app.widget.WidgetSystem; + +import javafx.geometry.Pos; + +public abstract class PopupWidget extends ViewWidget { + public PopupWidget() { + super("bg-popup"); + WidgetSystem.add(Pos.CENTER, this); + } + + public void pop() { + WidgetSystem.remove(this); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/toop/app/widget/complex/PrimaryWidget.java b/app/src/main/java/org/toop/app/widget/complex/PrimaryWidget.java new file mode 100644 index 0000000..462b30d --- /dev/null +++ b/app/src/main/java/org/toop/app/widget/complex/PrimaryWidget.java @@ -0,0 +1,16 @@ +package org.toop.app.widget.complex; + +import org.toop.app.widget.WidgetSystem; + +import javafx.geometry.Pos; + +public abstract class PrimaryWidget extends ViewWidget { + public PrimaryWidget() { + super("bg-primary"); + } + + public void transition(PrimaryWidget primary) { + WidgetSystem.add(Pos.CENTER, primary); + WidgetSystem.remove(this); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/toop/app/widget/complex/ViewWidget.java b/app/src/main/java/org/toop/app/widget/complex/ViewWidget.java new file mode 100644 index 0000000..dd6c9fb --- /dev/null +++ b/app/src/main/java/org/toop/app/widget/complex/ViewWidget.java @@ -0,0 +1,28 @@ +package org.toop.app.widget.complex; + +import javafx.geometry.Pos; +import org.toop.app.widget.Widget; + +import javafx.scene.layout.StackPane; + +public abstract class ViewWidget extends StackPane implements Widget { + public ViewWidget(String cssClass) { + getStyleClass().add(cssClass); + } + + public void add(Pos position, Widget widget) { + setAlignment(widget.getNode(), position); + getChildren().add(widget.getNode()); + } + + @Override + public StackPane getNode() { + return this; + } + + public void show() { + + } + + public abstract void reload(); +} \ No newline at end of file diff --git a/app/src/main/java/org/toop/app/widget/simple/LabeledButtonWidget.java b/app/src/main/java/org/toop/app/widget/simple/LabeledButtonWidget.java new file mode 100644 index 0000000..8436f95 --- /dev/null +++ b/app/src/main/java/org/toop/app/widget/simple/LabeledButtonWidget.java @@ -0,0 +1,26 @@ +package org.toop.app.widget.simple; + +import org.toop.app.widget.Widget; + +import javafx.scene.control.Button; +import javafx.scene.layout.VBox; +import javafx.scene.text.Text; + +public class LabeledButtonWidget extends VBox implements Widget { + public LabeledButtonWidget( + String labelText, + String buttonText, Runnable buttonOnAction + ) { + var text = new Text(labelText); + + var button = new Button(buttonText); + button.setOnAction(_ -> buttonOnAction.run()); + + super(text, button); + } + + @Override + public VBox getNode() { + return this; + } +} \ No newline at end of file diff --git a/app/src/main/java/org/toop/app/widget/view/QuitView.java b/app/src/main/java/org/toop/app/widget/view/QuitView.java new file mode 100644 index 0000000..bbd977c --- /dev/null +++ b/app/src/main/java/org/toop/app/widget/view/QuitView.java @@ -0,0 +1,12 @@ +package org.toop.app.widget.view; + +import org.toop.app.widget.complex.PopupWidget; + +public class QuitView extends PopupWidget { + protected QuitView() { + } + + @Override + public void reload() { + } +} \ No newline at end of file