mirror of
https://github.com/2OOP/pism.git
synced 2026-02-04 10:54:51 +00:00
add: options layer
This commit is contained in:
@@ -7,10 +7,7 @@ import javafx.beans.property.BooleanProperty;
|
|||||||
import javafx.beans.property.SimpleBooleanProperty;
|
import javafx.beans.property.SimpleBooleanProperty;
|
||||||
import javafx.geometry.Orientation;
|
import javafx.geometry.Orientation;
|
||||||
import javafx.scene.Node;
|
import javafx.scene.Node;
|
||||||
import javafx.scene.control.Label;
|
import javafx.scene.control.*;
|
||||||
import javafx.scene.control.Separator;
|
|
||||||
import javafx.scene.control.Slider;
|
|
||||||
import javafx.scene.control.TextField;
|
|
||||||
import javafx.scene.layout.Region;
|
import javafx.scene.layout.Region;
|
||||||
import javafx.scene.text.Text;
|
import javafx.scene.text.Text;
|
||||||
import javafx.scene.text.TextFlow;
|
import javafx.scene.text.TextFlow;
|
||||||
@@ -21,9 +18,10 @@ public abstract class Container {
|
|||||||
public abstract Region getContainer();
|
public abstract Region getContainer();
|
||||||
|
|
||||||
public abstract void addNode(Node node);
|
public abstract void addNode(Node node);
|
||||||
|
|
||||||
public abstract void addContainer(Container container, boolean fill);
|
public abstract void addContainer(Container container, boolean fill);
|
||||||
|
|
||||||
public void addText(String cssClass, String x, boolean wrap) {
|
public Text addText(String cssClass, String x, boolean wrap) {
|
||||||
final Text element = new Text(x);
|
final Text element = new Text(x);
|
||||||
element.getStyleClass().add(cssClass);
|
element.getStyleClass().add(cssClass);
|
||||||
|
|
||||||
@@ -32,13 +30,15 @@ public abstract class Container {
|
|||||||
} else {
|
} else {
|
||||||
addNode(element);
|
addNode(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addText(String x, boolean wrap) {
|
public Text addText(String x, boolean wrap) {
|
||||||
addText("text", x, wrap);
|
return addText("text", x, wrap);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addButton(String cssClass, String x, Runnable runnable) {
|
public Label addButton(String cssClass, String x, Runnable runnable) {
|
||||||
final Label element = new Label(x);
|
final Label element = new Label(x);
|
||||||
element.getStyleClass().add(cssClass);
|
element.getStyleClass().add(cssClass);
|
||||||
|
|
||||||
@@ -51,13 +51,14 @@ public abstract class Container {
|
|||||||
});
|
});
|
||||||
|
|
||||||
addNode(element);
|
addNode(element);
|
||||||
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addButton(String x, Runnable runnable) {
|
public Label addButton(String x, Runnable runnable) {
|
||||||
addButton("button", x, runnable);
|
return addButton("button", x, runnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToggle(String cssClass, String x1, String x2, boolean toggled, Consumer<Boolean> consumer) {
|
public Label 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);
|
element.getStyleClass().add(cssClass);
|
||||||
|
|
||||||
@@ -80,13 +81,14 @@ public abstract class Container {
|
|||||||
});
|
});
|
||||||
|
|
||||||
addNode(element);
|
addNode(element);
|
||||||
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToggle(String x1, String x2, boolean toggled, Consumer<Boolean> consumer) {
|
public Label addToggle(String x1, String x2, boolean toggled, Consumer<Boolean> consumer) {
|
||||||
addToggle("toggle", x1, x2, toggled, consumer);
|
return addToggle("toggle", x1, x2, toggled, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSlider(String cssClass, int max, int initial, Consumer<Integer> consumer) {
|
public Slider addSlider(String cssClass, int max, int initial, Consumer<Integer> consumer) {
|
||||||
final Slider element = new Slider(0, max, initial);
|
final Slider element = new Slider(0, max, initial);
|
||||||
element.getStyleClass().add(cssClass);
|
element.getStyleClass().add(cssClass);
|
||||||
|
|
||||||
@@ -106,13 +108,14 @@ public abstract class Container {
|
|||||||
});
|
});
|
||||||
|
|
||||||
addNode(element);
|
addNode(element);
|
||||||
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSlider(int max, int initial, Consumer<Integer> consumer) {
|
public Slider addSlider(int max, int initial, Consumer<Integer> consumer) {
|
||||||
addSlider("slider", max, initial, consumer);
|
return addSlider("slider", max, initial, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addInput(String cssClass, String input, Consumer<String> consumer) {
|
public TextField addInput(String cssClass, String input, Consumer<String> consumer) {
|
||||||
final TextField element = new TextField(input);
|
final TextField element = new TextField(input);
|
||||||
element.getStyleClass().add(cssClass);
|
element.getStyleClass().add(cssClass);
|
||||||
|
|
||||||
@@ -125,21 +128,43 @@ public abstract class Container {
|
|||||||
});
|
});
|
||||||
|
|
||||||
addNode(element);
|
addNode(element);
|
||||||
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addInput(String input, Consumer<String> consumer) {
|
public TextField addInput(String input, Consumer<String> consumer) {
|
||||||
addInput("input", input, consumer);
|
return addInput("input", input, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSeparator(String cssClass, boolean horizontal) {
|
public <T> ChoiceBox<T> addChoiceBox(String cssClass, Consumer<T> consumer) {
|
||||||
|
final ChoiceBox<T> element = new ChoiceBox<>();
|
||||||
|
element.getStyleClass().add(cssClass);
|
||||||
|
|
||||||
|
element.setOnMouseEntered(_ -> {
|
||||||
|
GlobalEventBus.post(new AppEvents.OnNodeHover());
|
||||||
|
});
|
||||||
|
|
||||||
|
element.valueProperty().addListener((_, _, newValue) -> {
|
||||||
|
consumer.accept(newValue);
|
||||||
|
});
|
||||||
|
|
||||||
|
addNode(element);
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> ChoiceBox<T> addChoiceBox(Consumer<T> consumer) {
|
||||||
|
return addChoiceBox("choicebox", consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Separator addSeparator(String cssClass, boolean horizontal) {
|
||||||
final Separator element = new Separator(horizontal ? Orientation.HORIZONTAL : Orientation.VERTICAL);
|
final Separator element = new Separator(horizontal ? Orientation.HORIZONTAL : Orientation.VERTICAL);
|
||||||
element.getStyleClass().add(cssClass);
|
element.getStyleClass().add(cssClass);
|
||||||
element.setMinSize(50, 50);
|
element.setMinSize(50, 50);
|
||||||
|
|
||||||
addNode(element);
|
addNode(element);
|
||||||
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSeparator(boolean horizontal) {
|
public Separator addSeparator(boolean horizontal) {
|
||||||
addSeparator("separator", horizontal);
|
return addSeparator("separator", horizontal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,10 +4,22 @@ import org.toop.app.App;
|
|||||||
import org.toop.app.layer.Container;
|
import org.toop.app.layer.Container;
|
||||||
import org.toop.app.layer.Layer;
|
import org.toop.app.layer.Layer;
|
||||||
import org.toop.app.layer.containers.VerticalContainer;
|
import org.toop.app.layer.containers.VerticalContainer;
|
||||||
|
import org.toop.framework.asset.ResourceManager;
|
||||||
|
import org.toop.framework.asset.resources.LocalizationAsset;
|
||||||
|
import org.toop.framework.audio.events.AudioEvents;
|
||||||
|
import org.toop.framework.eventbus.EventFlow;
|
||||||
|
import org.toop.local.AppContext;
|
||||||
|
|
||||||
import javafx.geometry.Pos;
|
import javafx.geometry.Pos;
|
||||||
|
import javafx.scene.control.ChoiceBox;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
public final class OptionsLayer extends Layer {
|
public final class OptionsLayer extends Layer {
|
||||||
|
private Locale currentLocale = AppContext.getLocale();
|
||||||
|
private LocalizationAsset locale = ResourceManager.get("localization");
|
||||||
|
|
||||||
|
private static int currentVolume = 25;
|
||||||
private static boolean isWindowed = true;
|
private static boolean isWindowed = true;
|
||||||
|
|
||||||
OptionsLayer() {
|
OptionsLayer() {
|
||||||
@@ -19,21 +31,20 @@ public final class OptionsLayer extends Layer {
|
|||||||
public void reload() {
|
public void reload() {
|
||||||
popAll();
|
popAll();
|
||||||
|
|
||||||
final Container mainContainer = new VerticalContainer(50);
|
|
||||||
|
|
||||||
mainContainer.addText("Options", false);
|
|
||||||
|
|
||||||
final Container optionsContainer = new VerticalContainer(5);
|
final Container optionsContainer = new VerticalContainer(5);
|
||||||
|
optionsContainer.addText("Language", false);
|
||||||
|
addLanguageBox(optionsContainer);
|
||||||
|
optionsContainer.addSeparator(true);
|
||||||
|
optionsContainer.addText("Volume", false);
|
||||||
|
addVolumeSlider(optionsContainer);
|
||||||
|
optionsContainer.addSeparator(true);
|
||||||
|
addFullscreenToggle(optionsContainer);
|
||||||
|
|
||||||
|
final Container mainContainer = new VerticalContainer(50);
|
||||||
|
mainContainer.addText("Options", false);
|
||||||
mainContainer.addContainer(optionsContainer, true);
|
mainContainer.addContainer(optionsContainer, true);
|
||||||
|
|
||||||
optionsContainer.addToggle("Windowed", "Fullscreen", !isWindowed, (fullscreen) -> {
|
|
||||||
isWindowed = !fullscreen;
|
|
||||||
App.setFullscreen(fullscreen);
|
|
||||||
});
|
|
||||||
|
|
||||||
final Container controlContainer = new VerticalContainer(5);
|
final Container controlContainer = new VerticalContainer(5);
|
||||||
|
|
||||||
controlContainer.addButton("Back", () -> {
|
controlContainer.addButton("Back", () -> {
|
||||||
App.activate(new MainLayer());
|
App.activate(new MainLayer());
|
||||||
});
|
});
|
||||||
@@ -41,4 +52,39 @@ public final class OptionsLayer extends Layer {
|
|||||||
addContainer(mainContainer, Pos.CENTER, 0, 0, 30, 60);
|
addContainer(mainContainer, Pos.CENTER, 0, 0, 30, 60);
|
||||||
addContainer(controlContainer, Pos.BOTTOM_LEFT, 2, -2, 0, 0);
|
addContainer(controlContainer, Pos.BOTTOM_LEFT, 2, -2, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addLanguageBox(Container container) {
|
||||||
|
final ChoiceBox<Locale> languageBox = container.addChoiceBox((locale) -> {
|
||||||
|
if (locale == currentLocale) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AppContext.setLocale(locale);
|
||||||
|
|
||||||
|
this.currentLocale = AppContext.getLocale();
|
||||||
|
this.locale = ResourceManager.get("localization");
|
||||||
|
|
||||||
|
App.reloadAll();
|
||||||
|
});
|
||||||
|
|
||||||
|
for (final Locale localeFile : locale.getAvailableLocales()) {
|
||||||
|
languageBox.getItems().add(localeFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
languageBox.setValue(currentLocale);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addVolumeSlider(Container container) {
|
||||||
|
container.addSlider(100, currentVolume, (volume) -> {
|
||||||
|
currentVolume = volume;
|
||||||
|
new EventFlow().addPostEvent(new AudioEvents.ChangeVolume(volume.doubleValue() / 100.0)).asyncPostEvent();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addFullscreenToggle(Container container) {
|
||||||
|
container.addToggle("Windowed", "Fullscreen", !isWindowed, (fullscreen) -> {
|
||||||
|
isWindowed = !fullscreen;
|
||||||
|
App.setFullscreen(fullscreen);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.text, .button, .toggle {
|
.text, .button, .toggle {
|
||||||
-fx-padding: 10;
|
-fx-padding: 5 10 5 10;
|
||||||
|
|
||||||
-fx-fill: white;
|
-fx-fill: white;
|
||||||
-fx-text-fill: white;
|
-fx-text-fill: white;
|
||||||
@@ -75,6 +75,38 @@
|
|||||||
-fx-background-color: linear-gradient(to bottom right, orange, indigo), #1d1d1d;
|
-fx-background-color: linear-gradient(to bottom right, orange, indigo), #1d1d1d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.choicebox {
|
||||||
|
-fx-alignment: center;
|
||||||
|
|
||||||
|
-fx-background-color: linear-gradient(to bottom right, orange, indigo), #1d1d1d;
|
||||||
|
-fx-background-insets: 0, 2;
|
||||||
|
-fx-background-radius: 8;
|
||||||
|
|
||||||
|
-fx-border-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.choicebox .label {
|
||||||
|
-fx-text-fill: white;
|
||||||
|
-fx-alignment: center;
|
||||||
|
-fx-padding: 5 10 5 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.choicebox .arrow {
|
||||||
|
-fx-background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.choicebox .context-menu {
|
||||||
|
-fx-background-color: linear-gradient(to bottom right, orange, indigo), #1d1d1d;
|
||||||
|
-fx-background-insets: 0, 2;
|
||||||
|
-fx-background-radius: 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.choicebox .menu-item:hover {
|
||||||
|
-fx-cursor: hand;
|
||||||
|
|
||||||
|
-fx-background-color: #ffffff11;
|
||||||
|
}
|
||||||
|
|
||||||
.separator {
|
.separator {
|
||||||
-fx-background-color: linear-gradient(to bottom right, orange, indigo), #1d1d1d;
|
-fx-background-color: linear-gradient(to bottom right, orange, indigo), #1d1d1d;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user