mirror of
https://github.com/2OOP/pism.git
synced 2026-02-04 19:04:49 +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.geometry.Orientation;
|
||||
import javafx.scene.Node;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.control.Separator;
|
||||
import javafx.scene.control.Slider;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.layout.Region;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.scene.text.TextFlow;
|
||||
@@ -21,9 +18,10 @@ 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) {
|
||||
public Text addText(String cssClass, String x, boolean wrap) {
|
||||
final Text element = new Text(x);
|
||||
element.getStyleClass().add(cssClass);
|
||||
|
||||
@@ -32,13 +30,15 @@ public abstract class Container {
|
||||
} else {
|
||||
addNode(element);
|
||||
}
|
||||
|
||||
return element;
|
||||
}
|
||||
|
||||
public void addText(String x, boolean wrap) {
|
||||
addText("text", x, wrap);
|
||||
public Text addText(String x, boolean 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);
|
||||
element.getStyleClass().add(cssClass);
|
||||
|
||||
@@ -51,13 +51,14 @@ public abstract class Container {
|
||||
});
|
||||
|
||||
addNode(element);
|
||||
return element;
|
||||
}
|
||||
|
||||
public void addButton(String x, Runnable runnable) {
|
||||
addButton("button", x, runnable);
|
||||
public Label addButton(String x, Runnable 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);
|
||||
element.getStyleClass().add(cssClass);
|
||||
|
||||
@@ -80,13 +81,14 @@ public abstract class Container {
|
||||
});
|
||||
|
||||
addNode(element);
|
||||
return element;
|
||||
}
|
||||
|
||||
public void addToggle(String x1, String x2, boolean toggled, Consumer<Boolean> consumer) {
|
||||
addToggle("toggle", x1, x2, toggled, consumer);
|
||||
public Label addToggle(String x1, String x2, boolean toggled, Consumer<Boolean> 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);
|
||||
element.getStyleClass().add(cssClass);
|
||||
|
||||
@@ -106,13 +108,14 @@ public abstract class Container {
|
||||
});
|
||||
|
||||
addNode(element);
|
||||
return element;
|
||||
}
|
||||
|
||||
public void addSlider(int max, int initial, Consumer<Integer> consumer) {
|
||||
addSlider("slider", max, initial, consumer);
|
||||
public Slider addSlider(int max, int initial, Consumer<Integer> 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);
|
||||
element.getStyleClass().add(cssClass);
|
||||
|
||||
@@ -125,21 +128,43 @@ public abstract class Container {
|
||||
});
|
||||
|
||||
addNode(element);
|
||||
return element;
|
||||
}
|
||||
|
||||
public void addInput(String input, Consumer<String> consumer) {
|
||||
addInput("input", input, consumer);
|
||||
public TextField addInput(String input, Consumer<String> 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);
|
||||
element.getStyleClass().add(cssClass);
|
||||
element.setMinSize(50, 50);
|
||||
|
||||
addNode(element);
|
||||
return element;
|
||||
}
|
||||
|
||||
public void addSeparator(boolean horizontal) {
|
||||
addSeparator("separator", horizontal);
|
||||
public Separator addSeparator(boolean 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.Layer;
|
||||
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.scene.control.ChoiceBox;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
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;
|
||||
|
||||
OptionsLayer() {
|
||||
@@ -19,21 +31,20 @@ public final class OptionsLayer extends Layer {
|
||||
public void reload() {
|
||||
popAll();
|
||||
|
||||
final Container mainContainer = new VerticalContainer(50);
|
||||
|
||||
mainContainer.addText("Options", false);
|
||||
|
||||
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);
|
||||
|
||||
optionsContainer.addToggle("Windowed", "Fullscreen", !isWindowed, (fullscreen) -> {
|
||||
isWindowed = !fullscreen;
|
||||
App.setFullscreen(fullscreen);
|
||||
});
|
||||
|
||||
final Container controlContainer = new VerticalContainer(5);
|
||||
|
||||
controlContainer.addButton("Back", () -> {
|
||||
App.activate(new MainLayer());
|
||||
});
|
||||
@@ -41,4 +52,39 @@ public final class OptionsLayer extends Layer {
|
||||
addContainer(mainContainer, Pos.CENTER, 0, 0, 30, 60);
|
||||
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 {
|
||||
-fx-padding: 10;
|
||||
-fx-padding: 5 10 5 10;
|
||||
|
||||
-fx-fill: white;
|
||||
-fx-text-fill: white;
|
||||
@@ -75,6 +75,38 @@
|
||||
-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 {
|
||||
-fx-background-color: linear-gradient(to bottom right, orange, indigo), #1d1d1d;
|
||||
}
|
||||
Reference in New Issue
Block a user