Common BaseType for Stacks
This commit is contained in:
parent
00509c03b2
commit
1ceccb2685
3 changed files with 117 additions and 389 deletions
|
@ -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<R extends ComponentRenderer> extends Component<R> implements RelativeContainerEventHandler {
|
||||
protected final List<Component<?>> components = new LinkedList<>();
|
||||
|
||||
public class HorizontalStack<R extends ComponentRenderer> extends Stack<R, HorizontalStack<R>> 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<R extends ComponentRenderer> extends Component<R> 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<R extends ComponentRenderer> extends Component<R> i
|
|||
return new HorizontalStack<>(DynamicSize.relative(1), DynamicSize.relative(1)).add(c).addFiller();
|
||||
}
|
||||
|
||||
public HorizontalStack<R> add(Component<?> c) {
|
||||
this.components.add(c);
|
||||
return this;
|
||||
}
|
||||
|
||||
private HorizontalStack<R> addEmpty(DynamicSize size) {
|
||||
protected HorizontalStack<R> addEmpty(DynamicSize size) {
|
||||
this.components.add(new Empty(size, DynamicSize.fixed(0)));
|
||||
return this;
|
||||
}
|
||||
|
||||
public HorizontalStack<R> addSpacer(int size) {
|
||||
return addEmpty(DynamicSize.fixed(size));
|
||||
}
|
||||
|
||||
public HorizontalStack<R> addSpacer(float percentage) {
|
||||
return addEmpty(DynamicSize.relative(percentage));
|
||||
}
|
||||
|
||||
public HorizontalStack<R> addFiller() {
|
||||
return addEmpty(DynamicSize.fill());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends GuiEventListener> 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;
|
||||
// }
|
||||
}
|
||||
|
|
111
src/main/java/org/betterx/ui/layout/components/Stack.java
Normal file
111
src/main/java/org/betterx/ui/layout/components/Stack.java
Normal file
|
@ -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<R extends ComponentRenderer, T extends Stack<R, T>> extends Component<R> implements RelativeContainerEventHandler {
|
||||
protected final List<Component<?>> 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<? extends GuiEventListener> 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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<R extends ComponentRenderer> extends Component<R> implements RelativeContainerEventHandler {
|
||||
protected final List<Component<?>> components = new LinkedList<>();
|
||||
|
||||
public class VerticalStack<R extends ComponentRenderer> extends Stack<R, VerticalStack<R>> 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<R extends ComponentRenderer> extends Component<R> 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<R extends ComponentRenderer> extends Component<R> imp
|
|||
return new VerticalStack<>(DynamicSize.relative(1), DynamicSize.relative(1)).add(c).addFiller();
|
||||
}
|
||||
|
||||
public VerticalStack<R> add(Component<?> c) {
|
||||
this.components.add(c);
|
||||
return this;
|
||||
}
|
||||
|
||||
private VerticalStack<R> addEmpty(DynamicSize size) {
|
||||
protected VerticalStack<R> addEmpty(DynamicSize size) {
|
||||
this.components.add(new Empty(DynamicSize.fixed(0), size));
|
||||
return this;
|
||||
}
|
||||
|
||||
public VerticalStack<R> addSpacer(int size) {
|
||||
return addEmpty(DynamicSize.fixed(size));
|
||||
}
|
||||
|
||||
public VerticalStack<R> addSpacer(float percentage) {
|
||||
return addEmpty(DynamicSize.relative(percentage));
|
||||
}
|
||||
|
||||
public VerticalStack<R> addFiller() {
|
||||
return addEmpty(DynamicSize.fill());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<? extends GuiEventListener> 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;
|
||||
// }
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue