From 1ceccb2685f3c4024e9ae5c30905c8e3f668c898 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 15 Jul 2022 08:13:24 +0200 Subject: [PATCH] Common BaseType for Stacks --- .../ui/layout/components/HorizontalStack.java | 198 +----------------- .../betterx/ui/layout/components/Stack.java | 111 ++++++++++ .../ui/layout/components/VerticalStack.java | 197 +---------------- 3 files changed, 117 insertions(+), 389 deletions(-) create mode 100644 src/main/java/org/betterx/ui/layout/components/Stack.java diff --git a/src/main/java/org/betterx/ui/layout/components/HorizontalStack.java b/src/main/java/org/betterx/ui/layout/components/HorizontalStack.java index a7057f3b..34febddf 100644 --- a/src/main/java/org/betterx/ui/layout/components/HorizontalStack.java +++ b/src/main/java/org/betterx/ui/layout/components/HorizontalStack.java @@ -4,24 +4,14 @@ import org.betterx.ui.layout.components.input.RelativeContainerEventHandler; import org.betterx.ui.layout.components.render.ComponentRenderer; import org.betterx.ui.layout.values.Alignment; import org.betterx.ui.layout.values.DynamicSize; -import org.betterx.ui.layout.values.Rectangle; - -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.gui.components.events.GuiEventListener; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import java.util.LinkedList; -import java.util.List; -import org.jetbrains.annotations.Nullable; - @Environment(EnvType.CLIENT) -public class HorizontalStack extends Component implements RelativeContainerEventHandler { - protected final List> components = new LinkedList<>(); - +public class HorizontalStack extends Stack> implements RelativeContainerEventHandler { public HorizontalStack(DynamicSize width, DynamicSize height) { - this(width, height, null); + super(width, height); } public HorizontalStack(DynamicSize width, DynamicSize height, R renderer) { @@ -81,42 +71,6 @@ public class HorizontalStack extends Component i return components.stream().map(c -> c.height.calculateFixed()).reduce(0, Integer::max); } - @Override - public int fillWidth(int parentSize, int fillSize) { - double totalFillWeight = components.stream().map(c -> c.width.fillWeight()).reduce(0.0, Double::sum); - return components.stream() - .map(c -> c.width.fill(fillSize, totalFillWeight)) - .reduce(0, Integer::sum); - } - - @Override - public int fillHeight(int parentSize, int fillSize) { - double totalFillHeight = components.stream().map(c -> c.height.fillWeight()).reduce(0.0, Double::sum); - return components.stream() - .map(c -> c.height.fill(fillSize, totalFillHeight)) - .reduce(0, Integer::sum); - } - -// @Override -// public int fillHeight(int parentSize, int fillSize) { -// return parentSize; -// } - - @Override - protected void renderInBounds( - PoseStack poseStack, - int x, - int y, - float a, - Rectangle renderBounds, - Rectangle clipRect - ) { - super.renderInBounds(poseStack, x, y, a, renderBounds, clipRect); - for (Component c : components) { - c.render(poseStack, x, y, a, renderBounds, clipRect); - } - } - public static HorizontalStack centered(Component c) { return new HorizontalStack<>(DynamicSize.relative(1), DynamicSize.relative(1)).addFiller().add(c).addFiller(); } @@ -125,154 +79,8 @@ public class HorizontalStack extends Component i return new HorizontalStack<>(DynamicSize.relative(1), DynamicSize.relative(1)).add(c).addFiller(); } - public HorizontalStack add(Component c) { - this.components.add(c); - return this; - } - - private HorizontalStack addEmpty(DynamicSize size) { + protected HorizontalStack addEmpty(DynamicSize size) { this.components.add(new Empty(size, DynamicSize.fixed(0))); return this; } - - public HorizontalStack addSpacer(int size) { - return addEmpty(DynamicSize.fixed(size)); - } - - public HorizontalStack addSpacer(float percentage) { - return addEmpty(DynamicSize.relative(percentage)); - } - - public HorizontalStack addFiller() { - return addEmpty(DynamicSize.fill()); - } - - @Override - public List children() { - return components; - } - - @Override - public Rectangle getInputBounds() { - return relativeBounds; - } - - boolean dragging; - - @Override - public boolean isDragging() { - return dragging; - } - - @Override - public void setDragging(boolean bl) { - dragging = bl; - } - - GuiEventListener focused; - - @Nullable - @Override - public GuiEventListener getFocused() { - return focused; - } - - @Override - public void setFocused(@Nullable GuiEventListener guiEventListener) { - focused = guiEventListener; - } - -// @Override -// public void mouseMoved(double x, double y) { -// for (Component c : components) { -// c.mouseMoved(x - relativeBounds.left, y - relativeBounds.top); -// } -// } -// -// @Override -// public boolean mouseClicked(double x, double y, int button) { -// for (Component c : components) { -// if (c.mouseClicked(x - relativeBounds.left, y - relativeBounds.top, button)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean mouseReleased(double x, double y, int button) { -// for (Component c : components) { -// if (c.mouseReleased(x - relativeBounds.left, y - relativeBounds.top, button)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean mouseDragged(double x, double y, int button, double x2, double y2) { -// for (Component c : components) { -// if (c.mouseDragged( -// x - relativeBounds.left, -// y - relativeBounds.top, -// button, -// x2 - relativeBounds.left, -// y2 - relativeBounds.top -// )) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean mouseScrolled(double x, double y, double f) { -// for (Component c : components) { -// if (c.mouseScrolled(x - relativeBounds.left, y - relativeBounds.top, f)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean keyPressed(int i, int j, int k) { -// for (Component c : components) { -// if (c.keyPressed(i, j, k)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean keyReleased(int i, int j, int k) { -// for (Component c : components) { -// if (c.keyReleased(i, j, k)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean charTyped(char cc, int i) { -// for (Component c : components) { -// if (c.charTyped(cc, i)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean changeFocus(boolean bl) { -// for (Component c : components) { -// if (c.changeFocus(bl)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean isMouseOver(double x, double y) { -// for (Component c : components) { -// if (c.isMouseOver(x, y)) -// return true; -// } -// return false; -// } } diff --git a/src/main/java/org/betterx/ui/layout/components/Stack.java b/src/main/java/org/betterx/ui/layout/components/Stack.java new file mode 100644 index 00000000..3ebc2a49 --- /dev/null +++ b/src/main/java/org/betterx/ui/layout/components/Stack.java @@ -0,0 +1,111 @@ +package org.betterx.ui.layout.components; + +import org.betterx.ui.layout.components.input.RelativeContainerEventHandler; +import org.betterx.ui.layout.components.render.ComponentRenderer; +import org.betterx.ui.layout.values.DynamicSize; +import org.betterx.ui.layout.values.Rectangle; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.components.events.GuiEventListener; + +import java.util.LinkedList; +import java.util.List; +import org.jetbrains.annotations.Nullable; + +public abstract class Stack> extends Component implements RelativeContainerEventHandler { + protected final List> components = new LinkedList<>(); + + public Stack(DynamicSize width, DynamicSize height) { + this(width, height, null); + } + + public Stack(DynamicSize width, DynamicSize height, R renderer) { + super(width, height, renderer); + } + + @Override + public int fillWidth(int parentSize, int fillSize) { + double totalFillWeight = components.stream().map(c -> c.width.fillWeight()).reduce(0.0, Double::sum); + return components.stream() + .map(c -> c.width.fill(fillSize, totalFillWeight)) + .reduce(0, Integer::sum); + } + + @Override + public int fillHeight(int parentSize, int fillSize) { + double totalFillHeight = components.stream().map(c -> c.height.fillWeight()).reduce(0.0, Double::sum); + return components.stream() + .map(c -> c.height.fill(fillSize, totalFillHeight)) + .reduce(0, Integer::sum); + } + + @Override + protected void renderInBounds( + PoseStack poseStack, + int x, + int y, + float a, + Rectangle renderBounds, + Rectangle clipRect + ) { + super.renderInBounds(poseStack, x, y, a, renderBounds, clipRect); + for (Component c : components) { + c.render(poseStack, x, y, a, renderBounds, clipRect); + } + } + + public T add(Component c) { + this.components.add(c); + return (T) this; + } + + protected abstract T addEmpty(DynamicSize size); + + public T addSpacer(int size) { + return addEmpty(DynamicSize.fixed(size)); + } + + public T addSpacer(float percentage) { + return addEmpty(DynamicSize.relative(percentage)); + } + + public T addFiller() { + return addEmpty(DynamicSize.fill()); + } + + @Override + public List children() { + return components; + } + + @Override + public Rectangle getInputBounds() { + return relativeBounds; + } + + boolean dragging; + + @Override + public boolean isDragging() { + return dragging; + } + + @Override + public void setDragging(boolean bl) { + dragging = bl; + } + + GuiEventListener focused; + + @Nullable + @Override + public GuiEventListener getFocused() { + return focused; + } + + @Override + public void setFocused(@Nullable GuiEventListener guiEventListener) { + focused = guiEventListener; + } +} + diff --git a/src/main/java/org/betterx/ui/layout/components/VerticalStack.java b/src/main/java/org/betterx/ui/layout/components/VerticalStack.java index 463af6f1..21eb3441 100644 --- a/src/main/java/org/betterx/ui/layout/components/VerticalStack.java +++ b/src/main/java/org/betterx/ui/layout/components/VerticalStack.java @@ -5,24 +5,14 @@ import org.betterx.ui.layout.components.input.RelativeContainerEventHandler; import org.betterx.ui.layout.components.render.ComponentRenderer; import org.betterx.ui.layout.values.Alignment; import org.betterx.ui.layout.values.DynamicSize; -import org.betterx.ui.layout.values.Rectangle; - -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.gui.components.events.GuiEventListener; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import java.util.LinkedList; -import java.util.List; -import org.jetbrains.annotations.Nullable; - @Environment(EnvType.CLIENT) -public class VerticalStack extends Component implements RelativeContainerEventHandler { - protected final List> components = new LinkedList<>(); - +public class VerticalStack extends Stack> implements RelativeContainerEventHandler { public VerticalStack(DynamicSize width, DynamicSize height) { - this(width, height, null); + super(width, height); } public VerticalStack(DynamicSize width, DynamicSize height, R renderer) { @@ -81,41 +71,6 @@ public class VerticalStack extends Component imp return (int) (fixedHeight / (1 - percentage)); } - // @Override -// public int fillWidth(int parentSize, int fillSize) { -// return parentSize; -// } - @Override - public int fillWidth(int parentSize, int fillSize) { - double totalFillWeight = components.stream().map(c -> c.width.fillWeight()).reduce(0.0, Double::sum); - return components.stream() - .map(c -> c.width.fill(fillSize, totalFillWeight)) - .reduce(0, Integer::sum); - } - - @Override - public int fillHeight(int parentSize, int fillSize) { - double totalFillHeight = components.stream().map(c -> c.height.fillWeight()).reduce(0.0, Double::sum); - return components.stream() - .map(c -> c.height.fill(fillSize, totalFillHeight)) - .reduce(0, Integer::sum); - } - - @Override - protected void renderInBounds( - PoseStack poseStack, - int x, - int y, - float a, - Rectangle renderBounds, - Rectangle clipRect - ) { - super.renderInBounds(poseStack, x, y, a, renderBounds, clipRect); - for (Component c : components) { - c.render(poseStack, x, y, a, renderBounds, clipRect); - } - } - public static VerticalStack centered(Component c) { return new VerticalStack<>(DynamicSize.relative(1), DynamicSize.relative(1)).addFiller().add(c).addFiller(); } @@ -124,154 +79,8 @@ public class VerticalStack extends Component imp return new VerticalStack<>(DynamicSize.relative(1), DynamicSize.relative(1)).add(c).addFiller(); } - public VerticalStack add(Component c) { - this.components.add(c); - return this; - } - - private VerticalStack addEmpty(DynamicSize size) { + protected VerticalStack addEmpty(DynamicSize size) { this.components.add(new Empty(DynamicSize.fixed(0), size)); return this; } - - public VerticalStack addSpacer(int size) { - return addEmpty(DynamicSize.fixed(size)); - } - - public VerticalStack addSpacer(float percentage) { - return addEmpty(DynamicSize.relative(percentage)); - } - - public VerticalStack addFiller() { - return addEmpty(DynamicSize.fill()); - } - - @Override - public List children() { - return components; - } - - @Override - public Rectangle getInputBounds() { - return relativeBounds; - } - - boolean dragging; - - @Override - public boolean isDragging() { - return dragging; - } - - @Override - public void setDragging(boolean bl) { - dragging = bl; - } - - GuiEventListener focused; - - @Nullable - @Override - public GuiEventListener getFocused() { - return focused; - } - - @Override - public void setFocused(@Nullable GuiEventListener guiEventListener) { - focused = guiEventListener; - } - - // @Override -// public void mouseMoved(double x, double y) { -// for (Component c : components) { -// c.mouseMoved(x - relativeBounds.left, y - relativeBounds.top); -// } -// } -// -// @Override -// public boolean mouseClicked(double x, double y, int button) { -// for (Component c : components) { -// if (c.mouseClicked(x - relativeBounds.left, y - relativeBounds.top, button)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean mouseReleased(double x, double y, int button) { -// for (Component c : components) { -// if (c.mouseReleased(x - relativeBounds.left, y - relativeBounds.top, button)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean mouseDragged(double x, double y, int button, double x2, double y2) { -// for (Component c : components) { -// if (c.mouseDragged( -// x - relativeBounds.left, -// y - relativeBounds.top, -// button, -// x2 - relativeBounds.left, -// y2 - relativeBounds.top -// )) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean mouseScrolled(double x, double y, double f) { -// for (Component c : components) { -// if (c.mouseScrolled(x - relativeBounds.left, y - relativeBounds.top, f)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean keyPressed(int i, int j, int k) { -// for (Component c : components) { -// if (c.keyPressed(i, j, k)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean keyReleased(int i, int j, int k) { -// for (Component c : components) { -// if (c.keyReleased(i, j, k)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean charTyped(char cc, int i) { -// for (Component c : components) { -// if (c.charTyped(cc, i)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean changeFocus(boolean bl) { -// for (Component c : components) { -// if (c.changeFocus(bl)) -// return true; -// } -// return false; -// } -// -// @Override -// public boolean isMouseOver(double x, double y) { -// for (Component c : components) { -// if (c.isMouseOver(x, y)) -// return true; -// } -// return false; -// } }