From dce550da0d04eb3364ed82ccff28b92cbec6b1c8 Mon Sep 17 00:00:00 2001 From: Speiger Date: Thu, 23 Jan 2025 10:20:02 +0100 Subject: [PATCH] New weighted constrained --- .../speiger/src/coreengine/NewInputTest.java | 4 +- .../gui/components/base/GuiComponent.java | 18 +++- .../constraints/ConstrainedContext.java | 89 +++++++++++++++++++ .../constraints/ConstraintContainer.java | 15 +++- .../gui/layout/constraints/Constraints.java | 70 +++++++++++++-- .../gui/layout/constraints/IConstraint.java | 16 +++- 6 files changed, 194 insertions(+), 18 deletions(-) create mode 100644 src/main/java/speiger/src/coreengine/rendering/gui/layout/constraints/ConstrainedContext.java diff --git a/src/main/java/speiger/src/coreengine/NewInputTest.java b/src/main/java/speiger/src/coreengine/NewInputTest.java index a6846dc..e79f656 100644 --- a/src/main/java/speiger/src/coreengine/NewInputTest.java +++ b/src/main/java/speiger/src/coreengine/NewInputTest.java @@ -18,10 +18,10 @@ import speiger.src.coreengine.math.vector.matrix.Matrix4f; import speiger.src.coreengine.rendering.gui.font.Font; import speiger.src.coreengine.rendering.gui.font.FontManager; import speiger.src.coreengine.rendering.gui.font.glyth.Glyth; -import speiger.src.coreengine.rendering.gui.font.glyth.UnbakedGlyth; -import speiger.src.coreengine.rendering.gui.font.glyth.UnbakedGlyth.GlythBaker; import speiger.src.coreengine.rendering.gui.font.glyth.IGlythSheetInfo; import speiger.src.coreengine.rendering.gui.font.glyth.MissingGlyth; +import speiger.src.coreengine.rendering.gui.font.glyth.UnbakedGlyth; +import speiger.src.coreengine.rendering.gui.font.glyth.UnbakedGlyth.GlythBaker; import speiger.src.coreengine.rendering.gui.font.providers.IFontProvider; import speiger.src.coreengine.rendering.gui.font.providers.STBTrueTypeProvider; import speiger.src.coreengine.rendering.input.devices.FileDrop; diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/components/base/GuiComponent.java b/src/main/java/speiger/src/coreengine/rendering/gui/components/base/GuiComponent.java index 9990b4f..9fa02e5 100644 --- a/src/main/java/speiger/src/coreengine/rendering/gui/components/base/GuiComponent.java +++ b/src/main/java/speiger/src/coreengine/rendering/gui/components/base/GuiComponent.java @@ -5,6 +5,7 @@ import java.util.function.Consumer; import speiger.src.collections.objects.lists.ObjectArrayList; import speiger.src.coreengine.rendering.gui.animation.GuiAnimator; +import speiger.src.coreengine.rendering.gui.layout.constraints.ConstrainedContext; import speiger.src.coreengine.rendering.gui.layout.constraints.ConstraintContainer; import speiger.src.coreengine.rendering.gui.renderer.IUIRenderer; import speiger.src.coreengine.rendering.guiOld.helper.box.IGuiBox; @@ -21,6 +22,7 @@ public abstract non-sealed class GuiComponent extends FlagObject implements ICas final IGuiBox box; IComponentScreen screen; ConstraintContainer constraints; + ConstrainedContext constraintedContext = new ConstrainedContext(); GuiAnimator animator; GuiComponent parent; List children = new ObjectArrayList<>(); @@ -102,12 +104,20 @@ public abstract non-sealed class GuiComponent extends FlagObject implements ICas return true; } + private ConstrainedContext parentContext() { + return parent != null ? parent.constraintedContext : null; + } + public GuiComponent withConstraints(ConstraintContainer container) { this.constraints = container; - if((screen != null || parent != null) && constraints != null) constraints.apply(this, parent); + if((screen != null || parent != null) && constraints != null) constraints.apply(this, parent, parentContext()); return this; } + public ConstraintContainer constraint() { + return constraints; + } + public GuiComponent addChild(GuiComponent child) { if(child.parent != null) throw new IllegalArgumentException("A Child can not have multiple parents"); child.parent = this; @@ -155,13 +165,16 @@ public abstract non-sealed class GuiComponent extends FlagObject implements ICas } public void onChanged(boolean repaint) { - if(constraints != null) constraints.apply(this, parent); + if(constraints != null) constraints.apply(this, parent, parentContext()); if(animator != null) animator.apply(); box.onChanged(); + constraintedContext.update(this, children); notifyListeners(LISTENER_ON_CHANGE); if(repaint) repaint(); if(children.isEmpty()) return; + int index = 0; for(GuiComponent comp : children) { + constraintedContext.setCurrent(index++); comp.onChanged(repaint); } } @@ -173,6 +186,7 @@ public abstract non-sealed class GuiComponent extends FlagObject implements ICas public IGuiBox getBox() { return box; } public IInteractable interactContainer() { return interactions; } + @Override public GuiComponent set(float x, float y) { if(box.getBaseX() != x || box.getBaseY() != y) { diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/layout/constraints/ConstrainedContext.java b/src/main/java/speiger/src/coreengine/rendering/gui/layout/constraints/ConstrainedContext.java new file mode 100644 index 0000000..a2f6c61 --- /dev/null +++ b/src/main/java/speiger/src/coreengine/rendering/gui/layout/constraints/ConstrainedContext.java @@ -0,0 +1,89 @@ +package speiger.src.coreengine.rendering.gui.layout.constraints; + +import java.util.List; + +import speiger.src.coreengine.rendering.gui.components.base.GuiComponent; +import speiger.src.coreengine.rendering.guiOld.helper.box.IGuiBox; + +public class ConstrainedContext { + float[] bounds; + float[] weights; + boolean locked = false; + int current; + + public void update(GuiComponent owner, List children) { + locked = false; + bounds = new float[children.size()*2]; + weights = new float[children.size()*2]; + for(int i = 0,m=children.size();i 0F) { + float scale = 1F / totals[2]; + for(int i = 0,m=children.size();i 0F) { + float scale = 1F / totals[3]; + for(int i = 0,m=children.size();i children = owner.children(); for(int i = 0,m=children.size();i children = owner.children(); + for(int i = 0,m=children.size();i WIDTH; @@ -61,6 +70,7 @@ public interface IConstraint { public float get(GuiComponent comp) { return get(comp.getBox()); } public void set(GuiComponent comp, float value) { set(comp.getBox(), value); } + public float get(ConstrainedContext context) { return (isPosition() ? context.getOffset(isXAxis()) : context.get(isXAxis())); } public float get(IGuiBox box) { return switch(this) {