add: sliders

change: formatting
This commit is contained in:
ramollia
2025-10-04 15:56:07 +02:00
parent 732abedba5
commit af0db24b0a
11 changed files with 142 additions and 47 deletions

View File

@@ -1,6 +1,5 @@
package org.toop.app;
import org.toop.app.canvas.GameCanvas;
import org.toop.app.layer.Layer;
import org.toop.app.layer.layers.MainLayer;
import org.toop.app.layer.layers.QuitLayer;
@@ -52,8 +51,8 @@ public final class App extends Application {
App.stage = stage;
App.root = root;
App.width = (int)stage.getWidth();
App.height = (int)stage.getHeight();
App.width = (int) stage.getWidth();
App.height = (int) stage.getHeight();
App.isQuitting = false;
@@ -74,10 +73,6 @@ public final class App extends Application {
isQuitting = false;
}
public static void pushCanvas(GameCanvas canvas) {
root.getChildren().addLast(canvas.getCanvas());
}
public static void popAll() {
final int childrenCount = root.getChildren().size();
@@ -95,6 +90,11 @@ public final class App extends Application {
stage.close();
}
public static int getWidth() { return width; }
public static int getHeight() { return height; }
public static int getWidth() {
return width;
}
public static int getHeight() {
return height;
}
}

View File

@@ -6,7 +6,5 @@ import org.toop.framework.eventbus.events.EventsBase;
public class AppEvents extends EventsBase {
public record OnNodeHover() implements EventWithoutSnowflake {}
public record OnNodeClick() implements EventWithoutSnowflake {}
public record OnLanguageChange(String language) implements EventWithoutSnowflake {}
}

View File

@@ -7,6 +7,7 @@ import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.control.TextField;
import javafx.scene.layout.Region;
import javafx.scene.text.Text;
@@ -18,6 +19,7 @@ public abstract class Container {
public abstract Region getContainer();
public abstract void addNode(Node node);
public abstract void addContainer(Container container, boolean fill);
public void addText(String cssClass, String x, boolean wrap) {
@@ -26,7 +28,9 @@ public abstract class Container {
if (wrap) {
addNode(new TextFlow(element));
} else { addNode(element); }
} else {
addNode(element);
}
}
public void addText(String x, boolean wrap) {
@@ -42,7 +46,6 @@ public abstract class Container {
});
element.setOnMouseClicked(_ -> {
GlobalEventBus.post(new AppEvents.OnNodeClick());
runnable.run();
});
@@ -54,7 +57,7 @@ public abstract class Container {
}
public void addToggle(String cssClass, String x1, String x2, boolean toggled, Consumer<Boolean> consumer) {
final Label element = new Label(toggled? x2 : x1);
final Label element = new Label(toggled ? x2 : x1);
element.getStyleClass().add(cssClass);
final BooleanProperty checked = new SimpleBooleanProperty(toggled);
@@ -64,7 +67,6 @@ public abstract class Container {
});
element.setOnMouseClicked(_ -> {
GlobalEventBus.post(new AppEvents.OnNodeClick());
checked.set(!checked.get());
if (checked.get()) {
@@ -83,6 +85,32 @@ public abstract class Container {
addToggle("toggle", x1, x2, toggled, consumer);
}
public void addSlider(String cssClass, int max, int initial, Consumer<Integer> consumer) {
final Slider element = new Slider(0, max, initial);
element.getStyleClass().add(cssClass);
element.setMinorTickCount(0);
element.setMajorTickUnit(1);
element.setBlockIncrement(1);
element.setSnapToTicks(true);
element.setShowTickLabels(true);
element.setOnMouseEntered(_ -> {
GlobalEventBus.post(new AppEvents.OnNodeHover());
});
element.valueProperty().addListener((_, _, newValue) -> {
consumer.accept(newValue.intValue());
});
addNode(element);
}
public void addSlider(int max, int initial, Consumer<Integer> consumer) {
addSlider("slider", max, initial, consumer);
}
public void addInput(String cssClass, String input, Consumer<String> consumer) {
final TextField element = new TextField(input);
element.getStyleClass().add(cssClass);

View File

@@ -37,11 +37,15 @@ public abstract class Layer {
if (widthPercent > 0) {
container.getContainer().setMaxWidth(widthPercent * widthUnit);
} else { container.getContainer().setMaxWidth(Region.USE_PREF_SIZE); }
} else {
container.getContainer().setMaxWidth(Region.USE_PREF_SIZE);
}
if (heightPercent > 0) {
container.getContainer().setMaxHeight(heightPercent * heightUnit);
} else { container.getContainer().setMaxHeight(Region.USE_PREF_SIZE); }
} else {
container.getContainer().setMaxHeight(Region.USE_PREF_SIZE);
}
container.getContainer().setTranslateX(xOffset * widthUnit);
container.getContainer().setTranslateY(yOffset * heightUnit);
@@ -57,11 +61,15 @@ public abstract class Layer {
if (widthPercent > 0) {
canvas.getCanvas().setWidth(widthPercent * widthUnit);
} else { canvas.getCanvas().setWidth(Region.USE_PREF_SIZE); }
} else {
canvas.getCanvas().setWidth(Region.USE_PREF_SIZE);
}
if (heightPercent > 0) {
canvas.getCanvas().setHeight(heightPercent * heightUnit);
} else { canvas.getCanvas().setHeight(Region.USE_PREF_SIZE); }
} else {
canvas.getCanvas().setHeight(Region.USE_PREF_SIZE);
}
canvas.getCanvas().setTranslateX(xOffset * widthUnit);
canvas.getCanvas().setTranslateY(yOffset * heightUnit);
@@ -85,8 +93,13 @@ public abstract class Layer {
}
}
public StackPane getLayer() { return layer; }
public Region getBackground() { return background; }
public StackPane getLayer() {
return layer;
}
public Region getBackground() {
return background;
}
public abstract void reload();
}

View File

@@ -21,7 +21,9 @@ public final class HorizontalContainer extends Container {
}
@Override
public Region getContainer() { return container; }
public Region getContainer() {
return container;
}
@Override
public void addNode(Node node) {
@@ -51,7 +53,7 @@ public final class HorizontalContainer extends Container {
for (final Node child : children) {
if (child instanceof Region) {
((Region)child).setPrefWidth(widthPerChild);
((Region) child).setPrefWidth(widthPerChild);
}
}
}

View File

@@ -21,7 +21,9 @@ public final class VerticalContainer extends Container {
}
@Override
public Region getContainer() { return container; }
public Region getContainer() {
return container;
}
@Override
public void addNode(Node node) {
@@ -51,7 +53,7 @@ public final class VerticalContainer extends Container {
for (final Node child : children) {
if (child instanceof Region) {
((Region)child).setPrefHeight(heightPerChild);
((Region) child).setPrefHeight(heightPerChild);
}
}
}

View File

@@ -18,7 +18,10 @@ public class GameLayer extends Layer {
App.popAll();
final Container controlContainer = new VerticalContainer(5);
controlContainer.addButton("Back", () -> { App.activate(new MainLayer()); });
controlContainer.addButton("Back", () -> {
App.activate(new MainLayer());
});
addCanvas(new TicTacToeCanvas(), Pos.CENTER, 0, 0, 100, 100);
addContainer(controlContainer, Pos.BOTTOM_LEFT, 2, -2, 0, 0);

View File

@@ -19,13 +19,26 @@ public final class MainLayer extends Layer {
popAll();
final Container gamesContainer = new VerticalContainer(5);
gamesContainer.addButton("Tic Tac Toe", () -> { App.activate(new MultiplayerLayer(GameType.TICTACTOE)); });
gamesContainer.addButton("Othello", () -> { App.activate(new MultiplayerLayer(GameType.OTHELLO)); });
gamesContainer.addButton("Tic Tac Toe", () -> {
App.activate(new MultiplayerLayer(GameType.TICTACTOE));
});
gamesContainer.addButton("Othello", () -> {
App.activate(new MultiplayerLayer(GameType.OTHELLO));
});
final Container controlContainer = new VerticalContainer(5);
controlContainer.addButton("Credits", () -> {});
controlContainer.addButton("Options", () -> {});
controlContainer.addButton("Quit", () -> { App.quitPopup(); });
controlContainer.addButton("Credits", () -> {
});
controlContainer.addButton("Options", () -> {
});
controlContainer.addButton("Quit", () -> {
App.quitPopup();
});
addContainer(gamesContainer, Pos.TOP_LEFT, 2, 2, 25, 0);
addContainer(controlContainer, Pos.BOTTOM_LEFT, 2, -2, 25, 0);

View File

@@ -2,7 +2,6 @@ package org.toop.app.layer.layers;
import org.toop.app.App;
import org.toop.app.GameType;
import org.toop.app.canvas.TicTacToeCanvas;
import org.toop.app.layer.Container;
import org.toop.app.layer.Layer;
import org.toop.app.layer.containers.HorizontalContainer;
@@ -26,26 +25,33 @@ public class MultiplayerLayer extends Layer {
popAll();
final Container mainContainer = new VerticalContainer(5);
mainContainer.addToggle("Local", "Server", !isConnectionLocal, (server) -> {
isConnectionLocal = !server;
reload();
});
final Container playersContainer = new HorizontalContainer(50);
mainContainer.addContainer(playersContainer, true);
final Container player1Container = new VerticalContainer("player_container", 5);
playersContainer.addContainer(player1Container, true);
playersContainer.addText("VS", false);
final Container player2Container = new VerticalContainer("player_container", 5);
playersContainer.addContainer(player2Container, true);
if (isConnectionLocal) {
mainContainer.addButton("Start", () -> {});
mainContainer.addButton("Start", () -> {
});
} else {
mainContainer.addButton("Connnect", () -> { App.activate(new GameLayer()); });
mainContainer.addButton("Connnect", () -> {
App.activate(new GameLayer());
});
}
player1Container.addToggle("Human", "Computer", !isPlayer1Human, (computer) -> {
@@ -57,8 +63,9 @@ public class MultiplayerLayer extends Layer {
player1Container.addText("player is human", true);
player1Container.addText("input player name here: ...", true);
} else {
player1Container.addText("playing against ai", true);
player1Container.addToggle("Easy", "Hard", false, (hard) -> {});
player1Container.addText("Computer depth", true);
player1Container.addSlider(9, 2, (depth) -> {
});
}
if (isConnectionLocal) {
@@ -71,19 +78,25 @@ public class MultiplayerLayer extends Layer {
player2Container.addText("player is human", true);
player2Container.addText("input player name here: ...", true);
} else {
player2Container.addText("playing against ai", true);
player2Container.addToggle("Easy", "Hard", false, (hard) -> {});
player2Container.addText("Computer depth", true);
player2Container.addSlider(9, 2, (depth) -> {
});
}
} else {
player2Container.addText("Server IP", true);
player2Container.addInput("", (input) -> {});
player2Container.addInput("", (input) -> {
});
player2Container.addText("Server Port", true);
player2Container.addInput("", (input) -> {});
player2Container.addInput("", (input) -> {
});
}
final Container controlContainer = new VerticalContainer(5);
controlContainer.addButton("Back", () -> { App.activate(new MainLayer()); });
controlContainer.addButton("Back", () -> {
App.activate(new MainLayer());
});
addContainer(mainContainer, Pos.CENTER, 0, 0, 75, 75);
addContainer(controlContainer, Pos.BOTTOM_LEFT, 2, -2, 0, 0);

View File

@@ -19,13 +19,20 @@ public final class QuitLayer extends Layer {
popAll();
final Container mainContainer = new VerticalContainer(30);
mainContainer.addText("Are you sure?", false);
final Container controlContainer = new HorizontalContainer(30);
mainContainer.addContainer(controlContainer, false);
controlContainer.addButton("Yes", () -> { App.quit(); });
controlContainer.addButton("No", () -> { App.pop(); });
controlContainer.addButton("Yes", () -> {
App.quit();
});
controlContainer.addButton("No", () -> {
App.pop();
});
addContainer(mainContainer, Pos.CENTER, 0, 0, 30, 30);
}

View File

@@ -24,6 +24,7 @@
-fx-font-size: 20px;
-fx-background-color: transparent;
-fx-border-color: transparent;
}
@@ -37,9 +38,24 @@
}
.input:focused {
-fx-border-color: transparent;
-fx-background-color: linear-gradient(to bottom right, orange, indigo), #1d1d1d;
-fx-background-insets: 0, 2;
-fx-background-radius: 8;
-fx-border-color: transparent;
}
.slider {
-fx-padding: 10;
-fx-background-color: transparent;
}
.slider .track {
-fx-background-color: linear-gradient(to right, #00ff00, #ff0000);
-fx-background-radius: 2;
}
.slider .thumb {
-fx-background-color: linear-gradient(to bottom right, orange, indigo), #1d1d1d;
}