mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-11-10 20:11:35 +01:00
boolean toggle
This commit is contained in:
parent
3de3de89db
commit
5b04e82163
8 changed files with 182 additions and 23 deletions
|
@ -8,6 +8,7 @@ import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget;
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.widget.list.ExtendedList;
|
import net.minecraft.client.gui.widget.list.ExtendedList;
|
||||||
|
import net.minecraft.util.text.IFormattableTextComponent;
|
||||||
|
|
||||||
public class ConfigScreenList extends ExtendedList<ConfigScreenList.Entry> {
|
public class ConfigScreenList extends ExtendedList<ConfigScreenList.Entry> {
|
||||||
|
|
||||||
|
@ -28,12 +29,12 @@ public class ConfigScreenList extends ExtendedList<ConfigScreenList.Entry> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getRowWidth() {
|
public int getRowWidth() {
|
||||||
return width-10;
|
return width-18;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected int getScrollbarPositionX() {
|
protected int getScrollbarPositionX() {
|
||||||
return left + this.width;
|
return left + this.width-5;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void tick() {
|
public void tick() {
|
||||||
|
@ -41,13 +42,11 @@ public class ConfigScreenList extends ExtendedList<ConfigScreenList.Entry> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static abstract class Entry extends ExtendedList.AbstractListEntry<Entry> {
|
public static abstract class Entry extends ExtendedList.AbstractListEntry<Entry> {
|
||||||
public void tick() {
|
public void tick() {}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class LabeledEntry extends Entry {
|
public static class LabeledEntry extends Entry {
|
||||||
protected StencilElement label;
|
protected TextStencilElement label;
|
||||||
|
|
||||||
public LabeledEntry(String label) {
|
public LabeledEntry(String label) {
|
||||||
this.label = new TextStencilElement(Minecraft.getInstance().fontRenderer, label);
|
this.label = new TextStencilElement(Minecraft.getInstance().fontRenderer, label);
|
||||||
|
@ -56,6 +55,10 @@ public class ConfigScreenList extends ExtendedList<ConfigScreenList.Entry> {
|
||||||
@Override
|
@Override
|
||||||
public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) {
|
public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) {
|
||||||
UIRenderHelper.streak(ms, 0, x, y+height/2, height, width/2, 0x0);
|
UIRenderHelper.streak(ms, 0, x, y+height/2, height, width/2, 0x0);
|
||||||
|
IFormattableTextComponent component = label.getComponent();
|
||||||
|
if (Minecraft.getInstance().fontRenderer.getWidth(component) > width/2 - 10) {
|
||||||
|
label.withText(Minecraft.getInstance().fontRenderer.trimToWidth(component, width / 2 - 15).getString() + "...");
|
||||||
|
}
|
||||||
label.at(x + 5, y + height/2 - 4, 0).render(ms);
|
label.at(x + 5, y + height/2 - 4, 0).render(ms);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import org.apache.commons.lang3.mutable.MutableInt;
|
||||||
import com.electronwill.nightconfig.core.AbstractConfig;
|
import com.electronwill.nightconfig.core.AbstractConfig;
|
||||||
import com.electronwill.nightconfig.core.UnmodifiableConfig;
|
import com.electronwill.nightconfig.core.UnmodifiableConfig;
|
||||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
|
import com.simibubi.create.foundation.config.ui.entries.BooleanEntry;
|
||||||
import com.simibubi.create.foundation.config.ui.entries.SubMenuEntry;
|
import com.simibubi.create.foundation.config.ui.entries.SubMenuEntry;
|
||||||
import com.simibubi.create.foundation.gui.ScreenOpener;
|
import com.simibubi.create.foundation.gui.ScreenOpener;
|
||||||
import com.simibubi.create.foundation.gui.TextStencilElement;
|
import com.simibubi.create.foundation.gui.TextStencilElement;
|
||||||
|
@ -54,8 +55,10 @@ public class SubMenuConfigScreen extends ConfigScreen {
|
||||||
MutableInt y = new MutableInt(15);
|
MutableInt y = new MutableInt(15);
|
||||||
|
|
||||||
configGroup.valueMap().forEach((s, o) -> {
|
configGroup.valueMap().forEach((s, o) -> {
|
||||||
|
String humanKey = toHumanReadable(s);
|
||||||
|
|
||||||
if (o instanceof AbstractConfig) {
|
if (o instanceof AbstractConfig) {
|
||||||
SubMenuEntry entry = new SubMenuEntry(this, toHumanReadable(s), spec, (UnmodifiableConfig) o);
|
SubMenuEntry entry = new SubMenuEntry(this, humanKey, spec, (UnmodifiableConfig) o);
|
||||||
list.children().add(entry);
|
list.children().add(entry);
|
||||||
|
|
||||||
} else if (o instanceof ForgeConfigSpec.ConfigValue<?>) {
|
} else if (o instanceof ForgeConfigSpec.ConfigValue<?>) {
|
||||||
|
@ -63,11 +66,16 @@ public class SubMenuConfigScreen extends ConfigScreen {
|
||||||
ForgeConfigSpec.ValueSpec valueSpec = spec.getRaw(configValue.getPath());
|
ForgeConfigSpec.ValueSpec valueSpec = spec.getRaw(configValue.getPath());
|
||||||
Object value = configValue.get();
|
Object value = configValue.get();
|
||||||
|
|
||||||
AbstractSimiWidget widget = createWidgetForValue(configValue, valueSpec, value, s, this);
|
if (value instanceof Boolean) {
|
||||||
widget.y = y.getValue();
|
BooleanEntry entry = new BooleanEntry(humanKey, (ForgeConfigSpec.ConfigValue<Boolean>) configValue, valueSpec);
|
||||||
//list.children().add(new ConfigScreenList.WrappedEntry(widget));
|
list.children().add(entry);
|
||||||
list.children().add(new ConfigScreenList.LabeledEntry(toHumanReadable(s) + " : " + value));
|
} else {
|
||||||
//widgets.add(widget);
|
AbstractSimiWidget widget = createWidgetForValue(configValue, valueSpec, value, s, this);
|
||||||
|
widget.y = y.getValue();
|
||||||
|
//list.children().add(new ConfigScreenList.WrappedEntry(widget));
|
||||||
|
list.children().add(new ConfigScreenList.LabeledEntry(humanKey + " : " + value));
|
||||||
|
//widgets.add(widget);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
y.add(50);
|
y.add(50);
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
package com.simibubi.create.foundation.config.ui.entries;
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
|
import com.simibubi.create.foundation.config.ui.ConfigButton;
|
||||||
|
import com.simibubi.create.foundation.gui.CombinedStencilElement;
|
||||||
|
import com.simibubi.create.foundation.gui.TextStencilElement;
|
||||||
|
import com.simibubi.create.foundation.gui.UIRenderHelper;
|
||||||
|
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraftforge.common.ForgeConfigSpec;
|
||||||
|
|
||||||
|
public class BooleanEntry extends ValueEntry<Boolean> {
|
||||||
|
|
||||||
|
TextStencilElement enabled;
|
||||||
|
TextStencilElement disabled;
|
||||||
|
CombinedStencilElement buttonStencil;
|
||||||
|
ConfigButton button;
|
||||||
|
|
||||||
|
public BooleanEntry(String label, ForgeConfigSpec.ConfigValue<Boolean> value, ForgeConfigSpec.ValueSpec spec) {
|
||||||
|
super(label, value, spec);
|
||||||
|
|
||||||
|
enabled = new TextStencilElement(Minecraft.getInstance().fontRenderer, "Enabled")
|
||||||
|
.centered(true, true)
|
||||||
|
.withElementRenderer((ms, width, height) -> UIRenderHelper.angledGradient(ms, 0, 0, height/2, height, width, 0xff_88f788, 0xff_20cc20));
|
||||||
|
|
||||||
|
disabled = new TextStencilElement(Minecraft.getInstance().fontRenderer, "Disabled")
|
||||||
|
.centered(true, true)
|
||||||
|
.withElementRenderer((ms, width, height) -> UIRenderHelper.angledGradient(ms, 0, 0, height/2, height, width, 0xff_f78888, 0xff_cc2020));
|
||||||
|
|
||||||
|
button = ConfigButton.createFromStencilElement(0, 0, enabled)
|
||||||
|
.withCallback(() -> {
|
||||||
|
value.set(!value.get());
|
||||||
|
buttonStencil.withSecond(value.get() ? enabled : disabled);
|
||||||
|
});
|
||||||
|
|
||||||
|
buttonStencil = ((CombinedStencilElement) button.getStencilElement())
|
||||||
|
.withMode(CombinedStencilElement.ElementMode.BOTH)
|
||||||
|
.withSecond(value.get() ? enabled : disabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tick() {
|
||||||
|
super.tick();
|
||||||
|
button.tick();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) {
|
||||||
|
super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks);
|
||||||
|
|
||||||
|
button.x = x + width/2;
|
||||||
|
button.y = y;
|
||||||
|
button.withBounds(width/2 - 34, height).render(ms, mouseX, mouseY, partialTicks);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onReset() {
|
||||||
|
buttonStencil.withSecond(value.get() ? enabled : disabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean mouseClicked(double mX, double mY, int button) {
|
||||||
|
return this.button.mouseClicked(mX, mY, button) || super.mouseClicked(mX, mY, button);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
package com.simibubi.create.foundation.config.ui.entries;
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
|
import com.simibubi.create.foundation.config.ui.ConfigButton;
|
||||||
|
import com.simibubi.create.foundation.config.ui.ConfigScreenList;
|
||||||
|
import com.simibubi.create.foundation.gui.TextStencilElement;
|
||||||
|
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraftforge.common.ForgeConfigSpec;
|
||||||
|
|
||||||
|
public class ValueEntry<T> extends ConfigScreenList.LabeledEntry {
|
||||||
|
|
||||||
|
protected ForgeConfigSpec.ConfigValue<T> value;
|
||||||
|
protected ForgeConfigSpec.ValueSpec spec;
|
||||||
|
protected ConfigButton reset;
|
||||||
|
|
||||||
|
public ValueEntry(String label, ForgeConfigSpec.ConfigValue<T> value, ForgeConfigSpec.ValueSpec spec) {
|
||||||
|
super(label);
|
||||||
|
this.value = value;
|
||||||
|
this.spec = spec;
|
||||||
|
|
||||||
|
TextStencilElement text = new TextStencilElement(Minecraft.getInstance().fontRenderer, "R").centered(true, true);
|
||||||
|
reset = ConfigButton.createFromStencilElement(0, 0, text)
|
||||||
|
.withBounds(30, 30)
|
||||||
|
.withCallback(() -> {
|
||||||
|
value.set((T) spec.getDefault());
|
||||||
|
this.onReset();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tick() {
|
||||||
|
reset.tick();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(MatrixStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) {
|
||||||
|
super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks);
|
||||||
|
|
||||||
|
reset.x = x + width - 32;
|
||||||
|
reset.y = y + 10;
|
||||||
|
reset.render(ms, mouseX, mouseY, partialTicks);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean mouseClicked(double mX, double mY, int button) {
|
||||||
|
return reset.mouseClicked(mX, mY, button);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void onReset() {}
|
||||||
|
}
|
|
@ -23,6 +23,24 @@ public class CombinedStencilElement extends StencilElement {
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public <T extends CombinedStencilElement> T withFirst(StencilElement element) {
|
||||||
|
this.element1 = element;
|
||||||
|
//noinspection unchecked
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends CombinedStencilElement> T withSecond(StencilElement element) {
|
||||||
|
this.element2 = element;
|
||||||
|
//noinspection unchecked
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends CombinedStencilElement> T withMode(ElementMode mode) {
|
||||||
|
this.mode = mode;
|
||||||
|
//noinspection unchecked
|
||||||
|
return (T) this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void renderStencil(MatrixStack ms) {
|
protected void renderStencil(MatrixStack ms) {
|
||||||
ms.push();
|
ms.push();
|
||||||
|
|
|
@ -21,14 +21,16 @@ public class DelegatedStencilElement extends StencilElement {
|
||||||
this.element = element;
|
this.element = element;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DelegatedStencilElement withStencilRenderer(ElementRenderer renderer) {
|
public <T extends DelegatedStencilElement> T withStencilRenderer(ElementRenderer renderer) {
|
||||||
stencil = renderer;
|
stencil = renderer;
|
||||||
return this;
|
//noinspection unchecked
|
||||||
|
return (T) this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DelegatedStencilElement withElementRenderer(ElementRenderer renderer) {
|
public <T extends DelegatedStencilElement> T withElementRenderer(ElementRenderer renderer) {
|
||||||
element = renderer;
|
element = renderer;
|
||||||
return this;
|
//noinspection unchecked
|
||||||
|
return (T) this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -61,10 +61,22 @@ public class TextStencilElement extends DelegatedStencilElement {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void renderElement(MatrixStack ms) {
|
protected void renderElement(MatrixStack ms) {
|
||||||
element.render(ms, font.getWidth(component), height);
|
float x = 0, y = 0;
|
||||||
|
if (centerHorizontally)
|
||||||
|
x = width / 2f - font.getWidth(component) / 2f;
|
||||||
|
|
||||||
|
if (centerVertically)
|
||||||
|
y = height / 2f - font.FONT_HEIGHT / 2f;
|
||||||
|
|
||||||
|
ms.push();
|
||||||
|
ms.translate(x, y, 0);
|
||||||
|
element.render(ms, font.getWidth(component), font.FONT_HEIGHT + 2);
|
||||||
|
ms.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IFormattableTextComponent getComponent() {
|
||||||
|
return component;
|
||||||
|
}
|
||||||
|
|
||||||
public static class Centered extends TextStencilElement {
|
public static class Centered extends TextStencilElement {
|
||||||
|
|
||||||
|
|
|
@ -113,8 +113,8 @@ public class UIRenderHelper {
|
||||||
/**
|
/**
|
||||||
* @see #angledGradient(MatrixStack, float, int, int, int, int, int, int, int)
|
* @see #angledGradient(MatrixStack, float, int, int, int, int, int, int, int)
|
||||||
*/
|
*/
|
||||||
public static void angledGradient(@Nonnull MatrixStack ms, float angle, int x, int y, int width, int length, int color1, int color2) {
|
public static void angledGradient(@Nonnull MatrixStack ms, float angle, int x, int y, int breadth, int length, int color1, int color2) {
|
||||||
angledGradient(ms, angle, x, y, 0, width, length, color1, color2);
|
angledGradient(ms, angle, x, y, 0, breadth, length, color1, color2);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* x and y specify the middle point of the starting edge
|
* x and y specify the middle point of the starting edge
|
||||||
|
@ -122,16 +122,16 @@ public class UIRenderHelper {
|
||||||
* @param angle the angle of the gradient in degrees; 0° means from left to right
|
* @param angle the angle of the gradient in degrees; 0° means from left to right
|
||||||
* @param color1 the color at the starting edge
|
* @param color1 the color at the starting edge
|
||||||
* @param color2 the color at the ending edge
|
* @param color2 the color at the ending edge
|
||||||
* @param width the total width of the gradient
|
* @param breadth the total width of the gradient
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public static void angledGradient(@Nonnull MatrixStack ms, float angle, int x, int y, int z, int width, int length, int color1, int color2) {
|
public static void angledGradient(@Nonnull MatrixStack ms, float angle, int x, int y, int z, int breadth, int length, int color1, int color2) {
|
||||||
ms.push();
|
ms.push();
|
||||||
ms.translate(x, y, z);
|
ms.translate(x, y, z);
|
||||||
ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(angle - 90));
|
ms.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(angle - 90));
|
||||||
|
|
||||||
Matrix4f model = ms.peek().getModel();
|
Matrix4f model = ms.peek().getModel();
|
||||||
int w = width / 2;
|
int w = breadth / 2;
|
||||||
GuiUtils.drawGradientRect(model, 0, -w, 0, w, length, color1, color2);
|
GuiUtils.drawGradientRect(model, 0, -w, 0, w, length, color1, color2);
|
||||||
|
|
||||||
ms.pop();
|
ms.pop();
|
||||||
|
|
Loading…
Reference in a new issue