aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/io/github/cottonmc/cotton/gui/widget/WAnchorLayout.java108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/main/java/io/github/cottonmc/cotton/gui/widget/WAnchorLayout.java b/src/main/java/io/github/cottonmc/cotton/gui/widget/WAnchorLayout.java
new file mode 100644
index 0000000..bd72836
--- /dev/null
+++ b/src/main/java/io/github/cottonmc/cotton/gui/widget/WAnchorLayout.java
@@ -0,0 +1,108 @@
+package io.github.cottonmc.cotton.gui.widget;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public class WAnchorLayout {
+ public class AnchorException extends Exception {
+ private static final long serialVersionUID = -4344321727684528775L;
+
+ public AnchorException(AnchorSide side1, String what1, AnchorSide side2, String what2, String why) {
+ super("Unable to link " + side1.toString() + " of " + what1 + " to " + side2.toString() + " of " + what2 + ": " + why);
+ }
+ }
+
+ public enum AnchorSide {
+ TOP,
+ RIGHT,
+ BOTTOM,
+ LEFT,
+ }
+
+ public class Anchor {
+ protected final String anchorName;
+ protected final AnchorSide anchorSide;
+ protected String anchorTarget = null;
+ protected AnchorSide anchorTargetSide = null;
+ protected AnchoredWidget linkedAnchorTarget = null;
+
+ public Anchor(String _anchorName, AnchorSide _anchorSide) {
+ anchorName = _anchorName;
+ anchorSide = _anchorSide;
+ }
+
+ public void bind(String _anchorTarget, AnchorSide _anchorTargetSide) {
+ anchorTarget = _anchorTarget;
+ anchorTargetSide = _anchorTargetSide;
+ }
+
+ public void link(WAnchorLayout layout) throws AnchorException {
+ if (anchorTarget == null) {
+ return;
+ }
+ AnchoredWidget w = layout.getWidgetByName(anchorTarget);
+ if (w == null) {
+ throw new AnchorException(anchorSide, anchorName, anchorTargetSide, anchorTarget, "No such anchor: " + anchorTarget);
+ }
+ linkedAnchorTarget = w;
+ }
+ }
+
+ public class AnchoredWidget {
+ protected WWidget widget;
+ protected final String name;
+ protected Anchor top, right, bottom, left;
+
+ public AnchoredWidget(String _name, WWidget _widget) {
+ widget = _widget;
+ name = _name;
+ top = new Anchor(name, AnchorSide.TOP);
+ right = new Anchor(name, AnchorSide.RIGHT);
+ bottom = new Anchor(name, AnchorSide.BOTTOM);
+ left = new Anchor(name, AnchorSide.LEFT);
+ }
+
+ public void link(WAnchorLayout layout) throws AnchorException {
+ if (top != null) top.link(layout);
+ if (right != null) right.link(layout);
+ if (bottom != null) bottom.link(layout);
+ if (left != null) left.link(layout);
+ }
+
+ public AnchoredWidget bind(AnchorSide side, AnchorSide toSide, String ofWhat) {
+ Anchor a = null;
+ if (side == null) {
+ return this;
+ } else if (side == AnchorSide.TOP) {
+ a = top;
+ } else if (side == AnchorSide.RIGHT) {
+ a = right;
+ } else if (side == AnchorSide.BOTTOM) {
+ a = bottom;
+ } else if (side == AnchorSide.LEFT) {
+ a = left;
+ }
+ // a.anchorSide
+ return this;
+ }
+ }
+
+ protected ConcurrentHashMap<String, AnchoredWidget> children;
+
+ void add(String name, AnchoredWidget widget) {
+ children.put(name, widget);
+ }
+
+ AnchoredWidget getWidgetByName(String name) {
+ return children.get(name);
+ }
+
+ void link() {
+ children.forEach((k, w) -> {
+ try {
+ w.link(this);
+ } catch (AnchorException e) {
+ e.printStackTrace();
+ }
+ });
+ }
+} \ No newline at end of file