From b53bb321af8faf3a7c7d69a371778daa06daa6a5 Mon Sep 17 00:00:00 2001 From: Speiger Date: Tue, 23 Apr 2024 22:17:21 +0200 Subject: [PATCH] Start of the layout new system --- .../rendering/gui/helper/box/GuiBox.java | 4 - .../newGui/components/base/GuiComponent.java | 85 +++++++++++-------- .../newGui/layout/ConstraintContainer.java | 56 ++++++++++++ .../rendering/newGui/layout/Constraints.java | 30 +++++++ .../rendering/newGui/layout/IConstraint.java | 56 ++++++++++++ .../coreengine/utils/io/dataTag/DataTag.java | 2 + .../utils/io/settings/BaseSetting.java | 37 -------- .../utils/io/settings/BooleanSetting.java | 66 -------------- .../utils/io/settings/ISetting.java | 16 ---- .../utils/io/settings/IntSetting.java | 66 -------------- .../utils/io/settings/Settings.java | 50 ----------- 11 files changed, 193 insertions(+), 275 deletions(-) create mode 100644 src/main/java/speiger/src/coreengine/rendering/newGui/layout/ConstraintContainer.java create mode 100644 src/main/java/speiger/src/coreengine/rendering/newGui/layout/Constraints.java create mode 100644 src/main/java/speiger/src/coreengine/rendering/newGui/layout/IConstraint.java delete mode 100644 src/main/java/speiger/src/coreengine/utils/io/settings/BaseSetting.java delete mode 100644 src/main/java/speiger/src/coreengine/utils/io/settings/BooleanSetting.java delete mode 100644 src/main/java/speiger/src/coreengine/utils/io/settings/ISetting.java delete mode 100644 src/main/java/speiger/src/coreengine/utils/io/settings/IntSetting.java delete mode 100644 src/main/java/speiger/src/coreengine/utils/io/settings/Settings.java diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/helper/box/GuiBox.java b/src/main/java/speiger/src/coreengine/rendering/gui/helper/box/GuiBox.java index 548e89c..ad3c50b 100644 --- a/src/main/java/speiger/src/coreengine/rendering/gui/helper/box/GuiBox.java +++ b/src/main/java/speiger/src/coreengine/rendering/gui/helper/box/GuiBox.java @@ -32,10 +32,6 @@ public class GuiBox implements IGuiBox onChanged(); } - public static IGuiBox simple(float x, float y, float width, float height) { - return new GuiBox(x, y, width, height); - } - public static IGuiBox clone(IGuiBox box) { return new GuiBox(box.getMinX(), box.getMinY(), box.getWidth(), box.getHeight()); } diff --git a/src/main/java/speiger/src/coreengine/rendering/newGui/components/base/GuiComponent.java b/src/main/java/speiger/src/coreengine/rendering/newGui/components/base/GuiComponent.java index e8497b3..083028b 100644 --- a/src/main/java/speiger/src/coreengine/rendering/newGui/components/base/GuiComponent.java +++ b/src/main/java/speiger/src/coreengine/rendering/newGui/components/base/GuiComponent.java @@ -11,13 +11,14 @@ import speiger.src.coreengine.utils.collections.FlagObject; import speiger.src.coreengine.utils.misc.ICastable; public non-sealed class GuiComponent extends FlagObject implements ICastable, ILayoutComponent, IListableComponent { - private static final int FLAG_FOCUSED = 1<<0; - private static final int FLAG_ENABLED = 1<<1; - private static final int FLAG_VISIBLE = 1<<2; - private static final int FLAG_MANUAL_MANAGED = 1<<3; - private static final int FLAG_SCISSORED = 1<<4; - + private static final int FLAG_FOCUSED = 1 << 0; + private static final int FLAG_ENABLED = 1 << 1; + private static final int FLAG_VISIBLE = 1 << 2; + private static final int FLAG_MANUAL_MANAGED = 1 << 3; + private static final int FLAG_SCISSORED = 1 << 4; IGuiBox box; + Object constraints; // TODO implement + Object animator; // TODO implement GuiComponent parent; List children = new ObjectArrayList<>(); InteractionContainer interactions = new InteractionContainer(this::isInteractable); @@ -30,8 +31,8 @@ public non-sealed class GuiComponent extends FlagObject implements ICastable, IL public GuiComponent(IGuiBox box) { this.box = box; - if(this instanceof IInteractable actor) { - interactions.add(actor); + if(this instanceof IInteractable actor) { + interactions.add(actor); } } @@ -99,16 +100,35 @@ public non-sealed class GuiComponent extends FlagObject implements ICastable, IL } } - @Override - public IGuiBox getBox() { - return box; + public void onChanged(boolean repaint) { + // TODO implement changes xD + if(constraints != null) { + // TODO implement constraints + } + if(animator != null) { + // TODO implement animations; + } + box.onChanged(); + notifyListeners(LISTENER_ON_CHANGE); + if(repaint) repaint(); + if(children.isEmpty()) return; + for(GuiComponent comp : children) { + comp.onChanged(repaint); + } } + protected void repaint() { + + } + + @Override + public IGuiBox getBox() { return box; } + @Override public GuiComponent set(float x, float y) { if(box.getBaseX() != x || box.getBaseY() != y) { box.setXY(x, y); - //TODO implement onChanged + onChanged(false); } return this; } @@ -117,7 +137,7 @@ public non-sealed class GuiComponent extends FlagObject implements ICastable, IL public GuiComponent bounds(float width, float height) { if(box.getBaseWidth() != width || box.getBaseHeight() != height) { box.setBounds(width, height); - //TODO implement onChanged + onChanged(true); } return this; } @@ -126,7 +146,7 @@ public non-sealed class GuiComponent extends FlagObject implements ICastable, IL public GuiComponent resize(float width, float height) { if(width != 0F || height != 0F) { box.grow(width, height); - //TODO implement onChanged + onChanged(true); } return this; } @@ -135,34 +155,27 @@ public non-sealed class GuiComponent extends FlagObject implements ICastable, IL public GuiComponent move(float moveX, float moveY) { if(moveX != 0F || moveY != 0F) { box.move(moveX, moveY); - //TODO implement onChanged + onChanged(false); } return this; } - private final boolean isInteractable() { - return isFlagSet(FLAG_ENABLED | FLAG_VISIBLE); + public final GuiComponent scale(float newScale) { + if(newScale != box.getBaseScale()) { + box.setScale(newScale); + // TODO implement onChanged + } + return this; } - public final boolean isFocused() { - return isFlagSet(FLAG_FOCUSED); - } - - public final boolean isEnabled() { - return isFlagSet(FLAG_ENABLED); - } - - public final boolean isVisible() { - return isFlagSet(FLAG_VISIBLE); - } - - public final boolean isManualManaged() { - return isFlagSet(FLAG_MANUAL_MANAGED); - } - - public final boolean isScissored() { - return isFlagSet(FLAG_SCISSORED); - } + //@formatter:off + private final boolean isInteractable() { return isFlagSet(FLAG_ENABLED | FLAG_VISIBLE); } + public final boolean isFocused() { return isFlagSet(FLAG_FOCUSED); } + public final boolean isEnabled() { return isFlagSet(FLAG_ENABLED); } + public final boolean isVisible() { return isFlagSet(FLAG_VISIBLE); } + public final boolean isManualManaged() { return isFlagSet(FLAG_MANUAL_MANAGED); } + public final boolean isScissored() { return isFlagSet(FLAG_SCISSORED); } + //@formatter:on public final void setFocused(boolean value) { setFlag(FLAG_FOCUSED, value); diff --git a/src/main/java/speiger/src/coreengine/rendering/newGui/layout/ConstraintContainer.java b/src/main/java/speiger/src/coreengine/rendering/newGui/layout/ConstraintContainer.java new file mode 100644 index 0000000..e2445cd --- /dev/null +++ b/src/main/java/speiger/src/coreengine/rendering/newGui/layout/ConstraintContainer.java @@ -0,0 +1,56 @@ +package speiger.src.coreengine.rendering.newGui.layout; + +import speiger.src.coreengine.rendering.newGui.components.base.GuiComponent; +import speiger.src.coreengine.rendering.newGui.layout.IConstraint.Target; + +public class ConstraintContainer { + private static final int CONSTRAINT_LENGTH = 4; + IConstraint[] constraints = new IConstraint[CONSTRAINT_LENGTH]; + + private ConstraintContainer() {} + + public void apply(GuiComponent owner, GuiComponent parent) { + for(int i = 0;i<4;i++) { + if(constraints[i] == null) continue; + constraints[i].apply(owner, parent, Target.by(i)); + } + } + + public static Builder builder() { return new Builder(); } + public Builder copy() { return new Builder(this); } + + public static class Builder { + ConstraintContainer container = new ConstraintContainer(); + + private Builder() {} + private Builder(ConstraintContainer container) { + System.arraycopy(container.constraints, 0, this.container.constraints, 0, CONSTRAINT_LENGTH); + } + + public Builder x(IConstraint value) { + container.constraints[Target.X.ordinal()] = value; + return this; + } + + public Builder y(IConstraint value) { + container.constraints[Target.Y.ordinal()] = value; + return this; + } + + public Builder width(IConstraint value) { + container.constraints[Target.WIDTH.ordinal()] = value; + return this; + } + + public Builder height(IConstraint value) { + container.constraints[Target.HEIGHT.ordinal()] = value; + return this; + } + + public ConstraintContainer build() { + var result = container; + container = null; + return result; + } + } +} diff --git a/src/main/java/speiger/src/coreengine/rendering/newGui/layout/Constraints.java b/src/main/java/speiger/src/coreengine/rendering/newGui/layout/Constraints.java new file mode 100644 index 0000000..2e795e0 --- /dev/null +++ b/src/main/java/speiger/src/coreengine/rendering/newGui/layout/Constraints.java @@ -0,0 +1,30 @@ +package speiger.src.coreengine.rendering.newGui.layout; + +import speiger.src.coreengine.rendering.gui.helper.box.IGuiBox; +import speiger.src.coreengine.rendering.newGui.layout.IConstraint.ISimpleConstraint; + +public class Constraints { + public static record Pixels(float value, boolean inverted) implements ISimpleConstraint { + + public static Pixels of(float value) { return new Pixels(value, false); } + public static Pixels inverted(float value) { return new Pixels(value, true); } + + @Override + public void apply(IGuiBox owner, IGuiBox parent, Target target) { + target.set(owner, inverted ? target.asArea().get(parent) - value : value); + } + } + + public static record Parent(float padding, boolean inv) implements ISimpleConstraint { + + public static Parent of() { return new Parent(0F, false); } + public static Parent of(float padding) { return new Parent(padding, false); } + public static Parent inverted() { return new Parent(0F, true); } + public static Parent inverted(float padding) { return new Parent(padding, true); } + + @Override + public void apply(IGuiBox owner, IGuiBox parent, Target target) { + //TODO implement + } + } +} diff --git a/src/main/java/speiger/src/coreengine/rendering/newGui/layout/IConstraint.java b/src/main/java/speiger/src/coreengine/rendering/newGui/layout/IConstraint.java new file mode 100644 index 0000000..c8a1cc7 --- /dev/null +++ b/src/main/java/speiger/src/coreengine/rendering/newGui/layout/IConstraint.java @@ -0,0 +1,56 @@ +package speiger.src.coreengine.rendering.newGui.layout; + +import speiger.src.coreengine.rendering.gui.helper.box.IGuiBox; +import speiger.src.coreengine.rendering.newGui.components.base.GuiComponent; + +public interface IConstraint { + public void apply(GuiComponent owner, GuiComponent child, Target target); + + public static interface ISimpleConstraint extends IConstraint { + @Override + default void apply(GuiComponent owner, GuiComponent parent, Target target) { apply(owner.getBox(), parent.getBox(), target); } + public void apply(IGuiBox owner, IGuiBox parent, Target target); + } + + public static enum Target { + X, + Y, + WIDTH, + HEIGHT; + + static final Target[] BY_INDEX = values(); + + public static Target by(int index) { return BY_INDEX[index & 3]; } + public static Target pos(boolean x) { return x ? X : Y; } + public static Target bounds(boolean x) { return x ? WIDTH : HEIGHT; } + public boolean isPosition() { return this == X || this == Y; } + public Target asArea() { + return switch(this) { + case X -> WIDTH; + case Y -> HEIGHT; + default -> this; + }; + } + + public float get(GuiComponent comp) { return get(comp.getBox()); } + public void set(GuiComponent comp, float value) { set(comp.getBox(), value); } + + public float get(IGuiBox box) { + return switch(this) { + case X -> box.getMinX(); + case Y -> box.getMinY(); + case WIDTH -> box.getBaseWidth(); + case HEIGHT -> box.getBaseHeight(); + }; + } + + public void set(IGuiBox box, float value) { + switch(this) { + case X -> box.setX(value); + case Y -> box.setY(value); + case WIDTH -> box.setWidth(value); + case HEIGHT -> box.setHeight(value); + } + } + } +} diff --git a/src/main/java/speiger/src/coreengine/utils/io/dataTag/DataTag.java b/src/main/java/speiger/src/coreengine/utils/io/dataTag/DataTag.java index 2fe0665..24c6603 100644 --- a/src/main/java/speiger/src/coreengine/utils/io/dataTag/DataTag.java +++ b/src/main/java/speiger/src/coreengine/utils/io/dataTag/DataTag.java @@ -46,7 +46,9 @@ public interface DataTag public DataTag copy(); + @SuppressWarnings("unchecked") public default T cast(){return (T)this;} + @SuppressWarnings("unchecked") public default T cast(Class clz){return (T)this;} public default String prettyPrint(){return prettyPrint(" ", 0);} diff --git a/src/main/java/speiger/src/coreengine/utils/io/settings/BaseSetting.java b/src/main/java/speiger/src/coreengine/utils/io/settings/BaseSetting.java deleted file mode 100644 index 2960b21..0000000 --- a/src/main/java/speiger/src/coreengine/utils/io/settings/BaseSetting.java +++ /dev/null @@ -1,37 +0,0 @@ -package speiger.src.coreengine.utils.io.settings; - -import java.util.List; -import java.util.function.Consumer; - -import speiger.src.collections.objects.lists.ObjectArrayList; - -public abstract class BaseSetting> implements ISetting -{ - protected final String id; - List> listeners = new ObjectArrayList>(); - - public BaseSetting(String id) - { - this.id = id; - } - - @Override - public T addListener(Consumer listener) - { - listeners.add(listener); - return (T)this; - } - - protected void notifyListeners() - { - if(listeners.isEmpty()) - { - return; - } - T value = (T)this; - for(int i = 0,m=listeners.size();i -{ - final boolean defaultValue; - boolean value; - - public BooleanSetting(String id, boolean defaultValue) - { - super(id); - this.defaultValue = defaultValue; - value = defaultValue; - } - - @Override - public boolean isDefault() - { - return value == defaultValue; - } - - @Override - public void setDefault() - { - if(value != defaultValue) - { - value = defaultValue; - notifyListeners(); - } - } - - public BooleanSetting setValue(boolean value) - { - if(this.value != value) - { - this.value = value; - notifyListeners(); - } - return this; - } - - public boolean getDefaultValue() - { - return defaultValue; - } - - public boolean getValue() - { - return value; - } - - @Override - public void write(JsonObject object) - { - object.addProperty(id, value); - } - - @Override - public void read(JsonObject object) - { - value = JsonUtil.getOrDefault(object, id, defaultValue); - } -} diff --git a/src/main/java/speiger/src/coreengine/utils/io/settings/ISetting.java b/src/main/java/speiger/src/coreengine/utils/io/settings/ISetting.java deleted file mode 100644 index c50b313..0000000 --- a/src/main/java/speiger/src/coreengine/utils/io/settings/ISetting.java +++ /dev/null @@ -1,16 +0,0 @@ -package speiger.src.coreengine.utils.io.settings; - -import java.util.function.Consumer; - -import com.google.gson.JsonObject; - -public interface ISetting> -{ - public T addListener(Consumer listener); - - public boolean isDefault(); - public void setDefault(); - - public void write(JsonObject object); - public void read(JsonObject object); -} diff --git a/src/main/java/speiger/src/coreengine/utils/io/settings/IntSetting.java b/src/main/java/speiger/src/coreengine/utils/io/settings/IntSetting.java deleted file mode 100644 index a7259b5..0000000 --- a/src/main/java/speiger/src/coreengine/utils/io/settings/IntSetting.java +++ /dev/null @@ -1,66 +0,0 @@ -package speiger.src.coreengine.utils.io.settings; - -import com.google.gson.JsonObject; - -import speiger.src.coreengine.utils.helpers.JsonUtil; - -public class IntSetting extends BaseSetting -{ - final int defaultValue; - int value; - - public IntSetting(String id, int defaultValue) - { - super(id); - this.defaultValue = defaultValue; - value = defaultValue; - } - - @Override - public boolean isDefault() - { - return value == defaultValue; - } - - @Override - public void setDefault() - { - if(value != defaultValue) - { - value = defaultValue; - notifyListeners(); - } - } - - public int getValue() - { - return value; - } - - public int getDefaultValue() - { - return defaultValue; - } - - public IntSetting setValue(int value) - { - if(this.value != value) - { - this.value = value; - notifyListeners(); - } - return this; - } - - @Override - public void write(JsonObject object) - { - object.addProperty(id, value); - } - - @Override - public void read(JsonObject object) - { - value = JsonUtil.getOrDefault(object, id, defaultValue); - } -} diff --git a/src/main/java/speiger/src/coreengine/utils/io/settings/Settings.java b/src/main/java/speiger/src/coreengine/utils/io/settings/Settings.java deleted file mode 100644 index 90b44b0..0000000 --- a/src/main/java/speiger/src/coreengine/utils/io/settings/Settings.java +++ /dev/null @@ -1,50 +0,0 @@ -package speiger.src.coreengine.utils.io.settings; - -import java.io.File; -import java.io.FileWriter; - -import com.google.gson.JsonObject; -import com.google.gson.internal.Streams; -import com.google.gson.stream.JsonWriter; - -import speiger.src.coreengine.utils.helpers.JsonUtil; - -public class Settings -{ - File file; - ISetting[] settings; - - public Settings(File path, ISetting[] settings) - { - file = path; - this.settings = settings; - } - - public void load() - { - JsonObject obj = JsonUtil.loadFile(file); - for(int i = 0,m=settings.length;i