Enable programmatically referencing Component's components

This commit is contained in:
2022-08-25 18:37:12 +02:00
parent 7d8848c6e5
commit 54b0c9b4b9
21 changed files with 192 additions and 153 deletions

View File

@@ -1,14 +1,17 @@
package com.bartlomiejpluta.base.lib.gui;
import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.api.gui.Component;
import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.gui.SizeMode;
import com.bartlomiejpluta.base.api.screen.Screen;
import java.util.Map;
public class AbsoluteLayout extends BaseContainer {
public AbsoluteLayout(Context context, GUI gui) {
super(context, gui);
public AbsoluteLayout(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
super.setSizeMode(SizeMode.ABSOLUTE, SizeMode.ABSOLUTE);
super.setSize(0f, 0f);
}

View File

@@ -5,17 +5,20 @@ import com.bartlomiejpluta.base.api.gui.Component;
import com.bartlomiejpluta.base.api.gui.GUI;
import java.util.List;
import java.util.Map;
import static java.util.Collections.emptyList;
public abstract class BaseComponent extends BaseWidget implements Component {
protected boolean focused;
protected final Context context;
protected final GUI gui;
protected final Map<String, Component> refs;
protected boolean focused;
protected BaseComponent(Context context, GUI gui) {
protected BaseComponent(Context context, GUI gui, Map<String, Component> refs) {
this.context = context;
this.gui = gui;
this.refs = refs;
}
@Override

View File

@@ -7,6 +7,7 @@ import com.bartlomiejpluta.base.api.gui.GUI;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static java.util.Collections.unmodifiableList;
import static java.util.Objects.requireNonNull;
@@ -15,8 +16,8 @@ public abstract class BaseContainer extends BaseComponent {
protected final List<Component> children = new LinkedList<>();
private final List<Component> readOnlyChildren = unmodifiableList(children);
public BaseContainer(Context context, GUI gui) {
super(context, gui);
public BaseContainer(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override

View File

@@ -11,6 +11,8 @@ import java.util.Locale;
import java.util.function.Consumer;
public abstract class BaseWidget implements Widget {
protected final EventHandler eventHandler = new EventHandler();
protected Widget parent;
protected SizeMode widthMode = SizeMode.AUTO;
@@ -32,7 +34,6 @@ public abstract class BaseWidget implements Widget {
protected float paddingBottom;
protected float paddingLeft;
protected final EventHandler eventHandler = new EventHandler();
protected abstract float getContentWidth();
@@ -45,6 +46,26 @@ public abstract class BaseWidget implements Widget {
: getActualWidth();
}
@Override
public void setWidth(Float width) {
this.width = width;
}
@Attribute("width")
public void setWidth(String width) {
var widthLowerCased = width.toLowerCase(Locale.ROOT);
if (widthLowerCased.equals("auto")) {
this.widthMode = SizeMode.AUTO;
} else if (widthLowerCased.equals("relative")) {
this.widthMode = SizeMode.RELATIVE;
this.width = 1f;
} else {
this.widthMode = SizeMode.ABSOLUTE;
this.width = Float.parseFloat(width);
}
}
@Override
public float getActualWidth() {
return paddingLeft + (widthMode == SizeMode.ABSOLUTE ? width : getContentWidth()) + paddingRight;
@@ -57,16 +78,6 @@ public abstract class BaseWidget implements Widget {
: getActualHeight();
}
@Override
public float getActualHeight() {
return paddingTop + (heightMode == SizeMode.ABSOLUTE ? height : getContentHeight()) + paddingBottom;
}
@Override
public void setWidth(Float width) {
this.width = width;
}
@Override
public void setHeight(Float height) {
this.height = height;
@@ -87,19 +98,9 @@ public abstract class BaseWidget implements Widget {
}
}
@Attribute("width")
public void setWidth(String width) {
var widthLowerCased = width.toLowerCase(Locale.ROOT);
if (widthLowerCased.equals("auto")) {
this.widthMode = SizeMode.AUTO;
} else if (widthLowerCased.equals("relative")) {
this.widthMode = SizeMode.RELATIVE;
this.width = 1f;
} else {
this.widthMode = SizeMode.ABSOLUTE;
this.width = Float.parseFloat(width);
}
@Override
public float getActualHeight() {
return paddingTop + (heightMode == SizeMode.ABSOLUTE ? height : getContentHeight()) + paddingBottom;
}
@Override
@@ -152,13 +153,13 @@ public abstract class BaseWidget implements Widget {
}
@Override
public float getY() {
return y;
public void setX(Float x) {
this.x = x;
}
@Override
public void setX(Float x) {
this.x = x;
public float getY() {
return y;
}
@Override
@@ -204,46 +205,46 @@ public abstract class BaseWidget implements Widget {
this.marginLeft = all;
}
@Override
public void setMarginTop(Float margin) {
this.marginTop = margin;
}
@Override
public void setMarginRight(Float margin) {
this.marginRight = margin;
}
@Override
public void setMarginBottom(Float margin) {
this.marginBottom = margin;
}
@Override
public void setMarginLeft(Float margin) {
this.marginLeft = margin;
}
@Override
public float getMarginTop() {
return marginTop;
}
@Override
public void setMarginTop(Float margin) {
this.marginTop = margin;
}
@Override
public float getMarginRight() {
return marginRight;
}
@Override
public void setMarginRight(Float margin) {
this.marginRight = margin;
}
@Override
public float getMarginBottom() {
return marginBottom;
}
@Override
public void setMarginBottom(Float margin) {
this.marginBottom = margin;
}
@Override
public float getMarginLeft() {
return marginLeft;
}
@Override
public void setMarginLeft(Float margin) {
this.marginLeft = margin;
}
@Override
public void setPadding(Float top, Float right, Float bottom, Float left) {
this.paddingTop = top;
@@ -276,46 +277,46 @@ public abstract class BaseWidget implements Widget {
this.paddingLeft = all;
}
@Override
public void setPaddingTop(Float padding) {
this.paddingTop = padding;
}
@Override
public void setPaddingRight(Float padding) {
this.paddingRight = padding;
}
@Override
public void setPaddingBottom(Float padding) {
this.paddingBottom = padding;
}
@Override
public void setPaddingLeft(Float padding) {
this.paddingLeft = padding;
}
@Override
public float getPaddingTop() {
return paddingTop;
}
@Override
public void setPaddingTop(Float padding) {
this.paddingTop = padding;
}
@Override
public float getPaddingRight() {
return paddingRight;
}
@Override
public void setPaddingRight(Float padding) {
this.paddingRight = padding;
}
@Override
public float getPaddingBottom() {
return paddingBottom;
}
@Override
public void setPaddingBottom(Float padding) {
this.paddingBottom = padding;
}
@Override
public float getPaddingLeft() {
return paddingLeft;
}
@Override
public void setPaddingLeft(Float padding) {
this.paddingLeft = padding;
}
@Override
public <E extends Event> void handleEvent(E event) {
eventHandler.handleEvent(event);

View File

@@ -13,14 +13,12 @@ import static java.lang.String.format;
import static java.util.Objects.requireNonNull;
public abstract class BaseWindow extends BaseWidget implements Window {
@Getter
private final Map<String, Component> refs;
protected Context context;
protected GUI gui;
protected WindowManager manager;
protected Component content;
@Getter
private final Map<String, Component> refs;
protected WindowPosition windowPosition = WindowPosition.CENTER;
protected BaseWindow(Context context, GUI gui, Map<String, Component> refs) {

View File

@@ -6,10 +6,12 @@ import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.gui.SizeMode;
import com.bartlomiejpluta.base.api.screen.Screen;
import java.util.Map;
public class BorderLayout extends BaseContainer {
public BorderLayout(Context context, GUI gui) {
super(context, gui);
public BorderLayout(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
super.setSizeMode(SizeMode.RELATIVE, SizeMode.RELATIVE);
super.setSize(1f, 1f);
}
@@ -69,8 +71,8 @@ public class BorderLayout extends BaseContainer {
}
public static abstract class Slot extends ComponentWrapper {
protected Slot(Context context, GUI gui) {
super(context, gui);
protected Slot(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
protected abstract void setPosition(BorderLayout layout);
@@ -78,8 +80,8 @@ public class BorderLayout extends BaseContainer {
public static class Top extends Slot {
public Top(Context context, GUI gui) {
super(context, gui);
public Top(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override
@@ -90,8 +92,8 @@ public class BorderLayout extends BaseContainer {
public static class TopRight extends Slot {
public TopRight(Context context, GUI gui) {
super(context, gui);
public TopRight(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override
@@ -102,8 +104,8 @@ public class BorderLayout extends BaseContainer {
public static class Right extends Slot {
public Right(Context context, GUI gui) {
super(context, gui);
public Right(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override
@@ -114,8 +116,8 @@ public class BorderLayout extends BaseContainer {
public static class BottomRight extends Slot {
public BottomRight(Context context, GUI gui) {
super(context, gui);
public BottomRight(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override
@@ -126,8 +128,8 @@ public class BorderLayout extends BaseContainer {
public static class Bottom extends Slot {
public Bottom(Context context, GUI gui) {
super(context, gui);
public Bottom(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override
@@ -138,8 +140,8 @@ public class BorderLayout extends BaseContainer {
public static class BottomLeft extends Slot {
public BottomLeft(Context context, GUI gui) {
super(context, gui);
public BottomLeft(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override
@@ -150,8 +152,8 @@ public class BorderLayout extends BaseContainer {
public static class Left extends Slot {
public Left(Context context, GUI gui) {
super(context, gui);
public Left(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override
@@ -162,8 +164,8 @@ public class BorderLayout extends BaseContainer {
public static class TopLeft extends Slot {
public TopLeft(Context context, GUI gui) {
super(context, gui);
public TopLeft(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override
@@ -174,8 +176,8 @@ public class BorderLayout extends BaseContainer {
public static class Center extends Slot {
public Center(Context context, GUI gui) {
super(context, gui);
public Center(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override

View File

@@ -5,13 +5,15 @@ import com.bartlomiejpluta.base.api.gui.Component;
import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.screen.Screen;
import java.util.Map;
import static java.util.Objects.requireNonNull;
public abstract class ComponentWrapper extends BaseComponent {
protected Component component;
protected ComponentWrapper(Context context, GUI gui) {
super(context, gui);
protected ComponentWrapper(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override

View File

@@ -1,18 +1,21 @@
package com.bartlomiejpluta.base.lib.gui;
import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.api.gui.Component;
import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.screen.Screen;
import lombok.NonNull;
import java.util.Map;
public class HGridLayout extends BaseContainer {
protected float offsetX = 0.0f;
protected float offsetY = 0.0f;
protected int rows = 2;
private float[] heights = new float[rows];
public HGridLayout(Context context, GUI gui) {
super(context, gui);
public HGridLayout(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
public void setRows(@NonNull Integer rows) {

View File

@@ -13,6 +13,7 @@ import lombok.Getter;
import lombok.NonNull;
import java.util.EnumSet;
import java.util.Map;
public class HGridOptionChoice extends HGridLayout {
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
@@ -26,8 +27,8 @@ public class HGridOptionChoice extends HGridLayout {
@Getter
private Component selectedComponent = null;
public HGridOptionChoice(Context context, GUI gui) {
super(context, gui);
public HGridOptionChoice(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
addEventListener(KeyEvent.TYPE, this::switchOption);
}

View File

@@ -1,15 +1,18 @@
package com.bartlomiejpluta.base.lib.gui;
import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.api.gui.Component;
import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.screen.Screen;
import java.util.Map;
public class HLayout extends BaseContainer {
protected float offsetX = 0.0f;
protected float offsetY = 0.0f;
public HLayout(Context context, GUI gui) {
super(context, gui);
public HLayout(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override

View File

@@ -13,6 +13,7 @@ import lombok.Getter;
import lombok.NonNull;
import java.util.EnumSet;
import java.util.Map;
public class HOptionChoice extends HLayout {
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
@@ -23,8 +24,8 @@ public class HOptionChoice extends HLayout {
@Getter
private Component selectedComponent = null;
public HOptionChoice(Context context, GUI gui) {
super(context, gui);
public HOptionChoice(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
addEventListener(KeyEvent.TYPE, this::switchOption);
}

View File

@@ -1,6 +1,7 @@
package com.bartlomiejpluta.base.lib.gui;
import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.api.gui.Component;
import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.gui.SizeMode;
import com.bartlomiejpluta.base.api.input.Key;
@@ -8,6 +9,8 @@ import com.bartlomiejpluta.base.api.input.KeyAction;
import com.bartlomiejpluta.base.api.input.KeyEvent;
import com.bartlomiejpluta.base.api.screen.Screen;
import java.util.Map;
import static com.bartlomiejpluta.base.util.math.MathUtil.clamp;
import static java.lang.Math.*;
@@ -16,8 +19,8 @@ public class HScrollableLayout extends HLayout {
private float scrollStep = 0.25f;
private float scrollSpeed = 0.1f;
public HScrollableLayout(Context context, GUI gui) {
super(context, gui);
public HScrollableLayout(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
addEventListener(KeyEvent.TYPE, this::handleKeyEvent);
}

View File

@@ -1,6 +1,7 @@
package com.bartlomiejpluta.base.lib.gui;
import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.api.gui.Component;
import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.gui.IconSet;
import com.bartlomiejpluta.base.api.gui.Paint;
@@ -9,6 +10,8 @@ import com.bartlomiejpluta.base.api.screen.Screen;
import lombok.NonNull;
import lombok.Setter;
import java.util.Map;
public class IconView extends BaseComponent {
private final GUI gui;
private final Paint paint;
@@ -40,8 +43,8 @@ public class IconView extends BaseComponent {
private Integer iconSetColumn = 0;
public IconView(Context context, GUI gui) {
super(context, gui);
public IconView(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
this.gui = gui;
this.paint = gui.createPaint();
}

View File

@@ -1,11 +1,14 @@
package com.bartlomiejpluta.base.lib.gui;
import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.api.gui.Component;
import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.gui.Image;
import com.bartlomiejpluta.base.api.gui.Paint;
import com.bartlomiejpluta.base.api.screen.Screen;
import java.util.Map;
public class ImageView extends BaseComponent {
private final Paint paint;
@@ -15,31 +18,11 @@ public class ImageView extends BaseComponent {
private float scaleX = 1;
private float scaleY = 1;
public ImageView(Context context, GUI gui) {
super(context, gui);
public ImageView(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
this.paint = gui.createPaint();
}
public void setImage(String imageUid) {
this.image = gui.getImage(imageUid);
}
public void setAngle(float angle) {
this.angle = angle;
}
public void setOpacity(float opacity) {
this.opacity = opacity;
}
public void setScaleX(float scaleX) {
this.scaleX = scaleX;
}
public void setScaleY(float scaleY) {
this.scaleY = scaleY;
}
public void setScale(float scaleX, float scaleY) {
this.scaleX = scaleX;
this.scaleY = scaleY;
@@ -54,22 +37,42 @@ public class ImageView extends BaseComponent {
return image;
}
public void setImage(String imageUid) {
this.image = gui.getImage(imageUid);
}
public float getAngle() {
return angle;
}
public void setAngle(float angle) {
this.angle = angle;
}
public float getOpacity() {
return opacity;
}
public void setOpacity(float opacity) {
this.opacity = opacity;
}
public float getScaleX() {
return scaleX;
}
public void setScaleX(float scaleX) {
this.scaleX = scaleX;
}
public float getScaleY() {
return scaleY;
}
public void setScaleY(float scaleY) {
this.scaleY = scaleY;
}
@Override
protected float getContentWidth() {
return image.getWidth() * scaleX;

View File

@@ -3,22 +3,24 @@ package com.bartlomiejpluta.base.lib.gui;
import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.api.gui.Attribute;
import com.bartlomiejpluta.base.api.gui.Color;
import com.bartlomiejpluta.base.api.gui.Component;
import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.screen.Screen;
import java.util.Map;
import static java.util.Objects.requireNonNull;
public class Label extends BaseComponent {
private final float[] bounds = new float[4];
private String text = "";
private String font;
private float fontSize;
private int alignment = GUI.ALIGN_LEFT;
private Color color;
private final Color color;
private final float[] bounds = new float[4];
public Label(Context context, GUI gui) {
super(context, gui);
public Label(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
this.color = gui.createColor();
this.color.setRGBA(0xFFFFFFFF);
}

View File

@@ -1,19 +1,21 @@
package com.bartlomiejpluta.base.lib.gui;
import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.api.gui.Component;
import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.screen.Screen;
import lombok.Getter;
import lombok.NonNull;
import java.util.Map;
public class VGridLayout extends BaseContainer {
protected float offsetX = 0.0f;
protected float offsetY = 0.0f;
protected int columns = 2;
private float[] widths = new float[columns];
public VGridLayout(Context context, GUI gui) {
super(context, gui);
public VGridLayout(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
public void setColumns(@NonNull Integer columns) {

View File

@@ -13,6 +13,7 @@ import lombok.Getter;
import lombok.NonNull;
import java.util.EnumSet;
import java.util.Map;
public class VGridOptionChoice extends VGridLayout {
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
@@ -26,8 +27,8 @@ public class VGridOptionChoice extends VGridLayout {
@Getter
private Component selectedComponent = null;
public VGridOptionChoice(Context context, GUI gui) {
super(context, gui);
public VGridOptionChoice(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
addEventListener(KeyEvent.TYPE, this::switchOption);
}

View File

@@ -1,15 +1,18 @@
package com.bartlomiejpluta.base.lib.gui;
import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.api.gui.Component;
import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.screen.Screen;
import java.util.Map;
public class VLayout extends BaseContainer {
protected float offsetX = 0.0f;
protected float offsetY = 0.0f;
public VLayout(Context context, GUI gui) {
super(context, gui);
public VLayout(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
}
@Override

View File

@@ -13,6 +13,7 @@ import lombok.Getter;
import lombok.NonNull;
import java.util.EnumSet;
import java.util.Map;
public class VOptionChoice extends VLayout {
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
@@ -23,8 +24,8 @@ public class VOptionChoice extends VLayout {
@Getter
private Component selectedComponent = null;
public VOptionChoice(Context context, GUI gui) {
super(context, gui);
public VOptionChoice(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
addEventListener(KeyEvent.TYPE, this::switchOption);
}

View File

@@ -1,6 +1,7 @@
package com.bartlomiejpluta.base.lib.gui;
import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.api.gui.Component;
import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.gui.SizeMode;
import com.bartlomiejpluta.base.api.input.Key;
@@ -8,6 +9,8 @@ import com.bartlomiejpluta.base.api.input.KeyAction;
import com.bartlomiejpluta.base.api.input.KeyEvent;
import com.bartlomiejpluta.base.api.screen.Screen;
import java.util.Map;
import static com.bartlomiejpluta.base.util.math.MathUtil.clamp;
import static java.lang.Math.*;
@@ -16,8 +19,8 @@ public class VScrollableLayout extends VLayout {
private float scrollStep = 0.25f;
private float scrollSpeed = 0.1f;
public VScrollableLayout(Context context, GUI gui) {
super(context, gui);
public VScrollableLayout(Context context, GUI gui, Map<String, Component> refs) {
super(context, gui, refs);
addEventListener(KeyEvent.TYPE, this::scroll);
}

View File

@@ -233,7 +233,7 @@ public class DefaultInflater implements Inflater {
@SneakyThrows
private Component createComponent(Class<? extends Widget> componentClass, NamedNodeMap attributes, Map<String, Component> refs, Context context, GUI gui) {
var component = (Component) componentClass.getConstructor(Context.class, GUI.class).newInstance(context, gui);
var component = (Component) componentClass.getConstructor(Context.class, GUI.class, Map.class).newInstance(context, gui, refs);
// Set attributes via setter methods
for (int i = 0; i < attributes.getLength(); ++i) {