Common BaseType for Stacks

This commit is contained in:
Frank 2022-07-15 08:13:24 +02:00
parent 00509c03b2
commit 1ceccb2685
3 changed files with 117 additions and 389 deletions

View file

@ -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;
// }
}

View 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;
}
}

View file

@ -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;
// }
}