align style with ponderUI

This commit is contained in:
zelophed 2021-04-16 04:22:38 +02:00
parent 6b80ea1d04
commit f0dfc5a6bc
12 changed files with 122 additions and 150 deletions

View file

@ -1,10 +1,10 @@
package com.simibubi.create.foundation.config.ui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.config.AllConfigs;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.gui.StencilElement;
import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.ponder.ui.PonderButton;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen;
@ -13,9 +13,9 @@ import net.minecraft.util.text.TextFormatting;
public class BaseConfigScreen extends ConfigScreen {
ConfigButton clientConfigWidget;
ConfigButton commonConfigWidget;
ConfigButton serverConfigWidget;
PonderButton clientConfigWidget;
PonderButton commonConfigWidget;
PonderButton serverConfigWidget;
public BaseConfigScreen(Screen parent) {
super(parent);
@ -26,48 +26,31 @@ public class BaseConfigScreen extends ConfigScreen {
widgets.clear();
super.init();
StencilElement text = new TextStencilElement(client.fontRenderer, new StringTextComponent("CLIENT CONFIG").formatted(TextFormatting.BOLD)).centered(true, true);
widgets.add(clientConfigWidget = ConfigButton.createFromStencilElement(
width / 2 - 100,
height / 2 - 15 - 50,
text
)
.withBounds(200, 30)
.withCallback(() -> ScreenOpener.transitionTo(new SubMenuConfigScreen(this, AllConfigs.CLIENT.specification)))
);
TextStencilElement text = new TextStencilElement(client.fontRenderer, new StringTextComponent("CLIENT CONFIG").formatted(TextFormatting.BOLD)).centered(true, true);
text.withElementRenderer((ms, width, height) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, ConfigButton.Palette.button_idle_1, ConfigButton.Palette.button_idle_2));
widgets.add(clientConfigWidget = new PonderButton(width / 2 - 100, height / 2 - 15 - 50, (_$, _$$) -> {
ScreenOpener.transitionTo(new SubMenuConfigScreen(this, AllConfigs.CLIENT.specification));
}, 200, 30).showingUnscaled(text));
clientConfigWidget.fade(1);
StencilElement text2 = new TextStencilElement(client.fontRenderer, new StringTextComponent("COMMON CONFIG").formatted(TextFormatting.BOLD)).centered(true, true);
widgets.add(commonConfigWidget = ConfigButton.createFromStencilElement(
width / 2 - 100,
height / 2 - 15,
text2
)
.withBounds(200, 30)
.withCallback(() -> ScreenOpener.transitionTo(new SubMenuConfigScreen(this, AllConfigs.COMMON.specification)))
);
TextStencilElement text2 = new TextStencilElement(client.fontRenderer, new StringTextComponent("COMMON CONFIG").formatted(TextFormatting.BOLD)).centered(true, true);
text2.withElementRenderer((ms, width, height) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, ConfigButton.Palette.button_idle_1, ConfigButton.Palette.button_idle_2));
widgets.add(commonConfigWidget = new PonderButton(width / 2 - 100, height / 2 - 15, (_$, _$$) -> {
ScreenOpener.transitionTo(new SubMenuConfigScreen(this, AllConfigs.COMMON.specification));
}, 200, 30).showingUnscaled(text2));
commonConfigWidget.fade(1);
StencilElement text3 = new TextStencilElement(client.fontRenderer, new StringTextComponent("SERVER CONFIG").formatted(TextFormatting.BOLD)).centered(true, true);
widgets.add(serverConfigWidget = ConfigButton.createFromStencilElement(
width / 2 - 100,
height / 2 - 15 + 50,
text3
)
.withBounds(200, 30)
);
TextStencilElement text3 = new TextStencilElement(client.fontRenderer, new StringTextComponent("SERVER CONFIG").formatted(TextFormatting.BOLD)).centered(true, true);
text3.withElementRenderer((ms, width, height) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, ConfigButton.Palette.button_idle_1, ConfigButton.Palette.button_idle_2));
widgets.add(serverConfigWidget = new PonderButton(width / 2 - 100, height / 2 - 15 + 50, (_$, _$$) -> {
}, 200, 30).showingUnscaled(text3));
serverConfigWidget.fade(1);
if (Minecraft.getInstance().world != null) {
serverConfigWidget.withCallback(() -> ScreenOpener.transitionTo(new ServerSubMenuConfigScreen(this, AllConfigs.SERVER.specification)));
} else {
serverConfigWidget.active = false;
serverConfigWidget.updateColorsFromState();
text3.withElementRenderer((ms, width, height) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, ConfigButton.Palette.button_disable_1, ConfigButton.Palette.button_disable_2));
}
}
@Override
protected void renderWindow(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
super.renderWindow(ms, mouseX, mouseY, partialTicks);
//<testStencil.at(200, 200, 0).render(ms);
}
}

View file

@ -100,7 +100,7 @@ public class ConfigButton extends StencilWidget {
RenderSystem.enableBlend();
RenderSystem.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE);
fill(ms, x, y, x + width, y + height, 0x30_ffffff);
fill(ms, x, y, x + width, y + height, 0x10_ffffff);
RenderSystem.defaultBlendFunc();
super.renderButton(ms, mouseX, mouseY, partialTicks);
wasHovered = hovered;

View file

@ -25,14 +25,29 @@ import net.minecraft.util.Direction;
public abstract class ConfigScreen extends NavigatableSimiScreen {
/*
* TODO match style with ponderUI
* TODO cache changes before setting values and saving to file
* TODO don't exit on ESC
* TODO reset text field focus for any click inside screen
* TODO adjust transition animation of screens
* TODO allow backspace in text fields
*
* TODO some color themes maybe?
* TODO
* zelo's list for configUI
*
* match style with ponderUI
* cache changes before setting values and saving to file
* don't exit on ESC
* reset text field focus for any click inside screen
* adjust transition animation of screens
* allow backspace in text fields
* move config button's animations to ponder button or a new superclass
* get some proper icons for reset button and enum cycle
* some small shadow effect for top and bottom of the list
* add the 'think back' button back, just with a different caption
* add a title to the current config screen, maybe in the form of breadcrumbs
*
* some color themes maybe?
* at least a helper class to unite colors throughout different uis
*
* FIXME
*
* tooltip are hidden underneath the scrollbar, if the bar is near the middle
* misalignment of the label-streak and textboxes/enum stuff
*
* */
@ -97,7 +112,7 @@ public abstract class ConfigScreen extends NavigatableSimiScreen {
@Override
protected void renderElement(MatrixStack ms) {
fill(ms, -200, -200, 200, 200, 0x40_000000);
fill(ms, -200, -200, 200, 200, 0x60_000000);
}
}.at(width * 0.5f, height * 0.5f, 0).render(ms);

View file

@ -1,7 +1,6 @@
package com.simibubi.create.foundation.config.ui;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.lwjgl.opengl.GL11;
@ -10,7 +9,6 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
@ -20,7 +18,6 @@ import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.client.gui.widget.list.ExtendedList;
import net.minecraft.util.text.IFormattableTextComponent;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.fml.client.gui.GuiUtils;
public class ConfigScreenList extends ExtendedList<ConfigScreenList.Entry> {
@ -39,7 +36,7 @@ public class ConfigScreenList extends ExtendedList<ConfigScreenList.Entry> {
@Override
public void render(MatrixStack ms, int mouseX, int mouseY, float partialTicks) {
//render tmp background
fill(ms, left, top, left+width, top+height, 0x44_000000);
fill(ms, left, top, left + width, top + height, 0x10_000000);
super.render(ms, mouseX, mouseY, partialTicks);
}
@ -48,19 +45,19 @@ public class ConfigScreenList extends ExtendedList<ConfigScreenList.Entry> {
protected void renderList(MatrixStack p_238478_1_, int p_238478_2_, int p_238478_3_, int p_238478_4_, int p_238478_5_, float p_238478_6_) {
MainWindow window = Minecraft.getInstance().getWindow();
double d0 = window.getGuiScaleFactor();
RenderSystem.enableScissor((int) (this.left * d0), (int) (window.getFramebufferHeight() - (this.bottom* d0)), (int)(this.width * d0), (int)(this.height * d0));
RenderSystem.enableScissor((int) (this.left * d0), (int) (window.getFramebufferHeight() - (this.bottom * d0)), (int) (this.width * d0), (int) (this.height * d0));
super.renderList(p_238478_1_, p_238478_2_, p_238478_3_, p_238478_4_, p_238478_5_, p_238478_6_);
RenderSystem.disableScissor();
}
@Override
public int getRowWidth() {
return width-18;
return width - 18;
}
@Override
protected int getScrollbarPositionX() {
return left + this.width-5;
return left + this.width - 5;
}
public void tick() {
@ -117,17 +114,18 @@ public class ConfigScreenList extends ExtendedList<ConfigScreenList.Entry> {
public LabeledEntry(String label) {
this.label = new TextStencilElement(Minecraft.getInstance().fontRenderer, label);
this.label.withElementRenderer((ms, width, height) -> UIRenderHelper.angledGradient(ms, 0, 0, height / 2, height, width, ConfigButton.Palette.button_idle_1, ConfigButton.Palette.button_idle_2));
labelTooltip = new ArrayList<>();
}
@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) {
UIRenderHelper.streak(ms, 0, x, y+height/2, height - 10, getLabelWidth(width), 0x0);
UIRenderHelper.streak(ms, 0, x, y + height / 2, height - 10, getLabelWidth(width) + ((width - getLabelWidth(width)) / 3), 0xdd_000000);
IFormattableTextComponent component = label.getComponent();
if (Minecraft.getInstance().fontRenderer.getWidth(component) > getLabelWidth(width) - 10) {
label.withText(Minecraft.getInstance().fontRenderer.trimToWidth(component, getLabelWidth(width) - 15).getString() + "...");
}
label.at(x + 5, y + height/2 - 4, 0).render(ms);
label.at(x + 5, y + height / 2 - 4, 0).render(ms);
if (mouseX > x && mouseX < x + getLabelWidth(width) && mouseY > y + 5 && mouseY < y + height - 5) {
List<ITextComponent> tooltip = getLabelTooltip();
@ -136,7 +134,10 @@ public class ConfigScreenList extends ExtendedList<ConfigScreenList.Entry> {
GL11.glDisable(GL11.GL_SCISSOR_TEST);
Screen screen = Minecraft.getInstance().currentScreen;
ms.push();
ms.translate(0, 0, 400);
GuiUtils.drawHoveringText(ms, tooltip, mouseX, mouseY, screen.width, screen.height, 300, Minecraft.getInstance().fontRenderer);
ms.pop();
GL11.glEnable(GL11.GL_SCISSOR_TEST);
}
}
@ -149,33 +150,4 @@ public class ConfigScreenList extends ExtendedList<ConfigScreenList.Entry> {
return totalWidth;
}
}
public static class WrappedEntry extends Entry {
AbstractSimiWidget widget;
public WrappedEntry(AbstractSimiWidget widget) {
this.widget = widget;
}
@Override
public void tick() {
if (widget instanceof ConfigButton)
((ConfigButton) widget).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) {
widget.x = x;
widget.y = y;
widget.setWidth(width);
widget.setHeight(height);
widget.render(ms, mouseX, mouseY, partialTicks);
}
@Override
public boolean mouseClicked(double x, double y, int button) {
return widget.mouseClicked(x, y, button);
}
}
}

View file

@ -2,11 +2,8 @@ package com.simibubi.create.foundation.config.ui;
import javax.annotation.Nonnull;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen;
import net.minecraftforge.common.ForgeConfigSpec;
import org.apache.commons.lang3.mutable.MutableInt;
import com.electronwill.nightconfig.core.AbstractConfig;
import com.electronwill.nightconfig.core.UnmodifiableConfig;
import com.mojang.blaze3d.matrix.MatrixStack;
@ -14,9 +11,10 @@ import com.simibubi.create.foundation.config.ui.entries.BooleanEntry;
import com.simibubi.create.foundation.config.ui.entries.EnumEntry;
import com.simibubi.create.foundation.config.ui.entries.NumberEntry;
import com.simibubi.create.foundation.config.ui.entries.SubMenuEntry;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen;
import net.minecraftforge.common.ForgeConfigSpec;
public class SubMenuConfigScreen extends ConfigScreen {
@ -50,7 +48,7 @@ public class SubMenuConfigScreen extends ConfigScreen {
int lWidth = Math.min(width - 66, 500);
list = new ConfigScreenList(client, lWidth, height - 30, 15, height - 15, 50);
list.setLeftPos(this.width /2 - list.getWidth()/2);
list.setLeftPos(this.width / 2 - list.getWidth() / 2);
children.add(list);
@ -63,7 +61,7 @@ public class SubMenuConfigScreen extends ConfigScreen {
SubMenuEntry entry = new SubMenuEntry(this, humanKey, spec, (UnmodifiableConfig) o);
list.children().add(entry);
} else if (o instanceof ForgeConfigSpec.ConfigValue<?>) {
} else if (o instanceof ForgeConfigSpec.ConfigValue<?>) {
ForgeConfigSpec.ConfigValue<?> configValue = (ForgeConfigSpec.ConfigValue<?>) o;
ForgeConfigSpec.ValueSpec valueSpec = spec.getRaw(configValue.getPath());
Object value = configValue.get();

View file

@ -1,10 +1,9 @@
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 com.simibubi.create.foundation.ponder.ui.PonderButton;
import net.minecraft.client.Minecraft;
import net.minecraftforge.common.ForgeConfigSpec;
@ -13,8 +12,7 @@ public class BooleanEntry extends ValueEntry<Boolean> {
TextStencilElement enabled;
TextStencilElement disabled;
CombinedStencilElement buttonStencil;
ConfigButton button;
PonderButton button;
public BooleanEntry(String label, ForgeConfigSpec.ConfigValue<Boolean> value, ForgeConfigSpec.ValueSpec spec) {
super(label, value, spec);
@ -27,16 +25,11 @@ public class BooleanEntry extends ValueEntry<Boolean> {
.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);
onValueChange();
});
buttonStencil = ((CombinedStencilElement) button.getStencilElement())
.withMode(CombinedStencilElement.ElementMode.BOTH)
.withSecond(value.get() ? enabled : disabled);
button = new PonderButton(0, 0, () -> {
value.set(!value.get());
onValueChange();
}).showingUnscaled(enabled);
button.fade(1);
listeners.add(button);
onReset();
@ -46,13 +39,11 @@ public class BooleanEntry extends ValueEntry<Boolean> {
protected void setEditable(boolean b) {
super.setEditable(b);
button.active = b;
button.animateGradientFromState();
}
@Override
public void tick() {
super.tick();
button.tick();
}
@Override
@ -60,14 +51,16 @@ public class BooleanEntry extends ValueEntry<Boolean> {
super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks);
button.x = x + getLabelWidth(width);
button.y = y;
button.withBounds(width - getLabelWidth(width) - resetWidth, height).render(ms, mouseX, mouseY, partialTicks);
button.y = y + 10;
button.setWidth(width - getLabelWidth(width) - resetWidth - 4);
button.setHeight(height - 20);
button.render(ms, mouseX, mouseY, partialTicks);
}
@Override
protected void onValueChange() {
super.onValueChange();
buttonStencil.withSecond(value.get() ? enabled : disabled);
button.showingUnscaled(value.get() ? enabled : disabled);
bumpCog(value.get() ? 15f : -16f);
}

View file

@ -3,6 +3,7 @@ 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.TextStencilElement;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import net.minecraft.client.Minecraft;
import net.minecraftforge.common.ForgeConfigSpec;
@ -19,6 +20,7 @@ public class EnumEntry extends ValueEntry<Enum<?>> {
super(label, value, spec);
valueText = new TextStencilElement(Minecraft.getInstance().fontRenderer, "YEP").centered(true, true);
valueText.withElementRenderer((ms, width, height) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, ConfigButton.Palette.button_hover_1, ConfigButton.Palette.button_hover_2));
TextStencilElement l = new TextStencilElement(Minecraft.getInstance().fontRenderer, "<").centered(true, true);
cycleLeft = ConfigButton.createAndInjectElementRenderer(0, 0, l).withBounds(30, 30).withCallback(() -> cycleValue(-1));

View file

@ -6,8 +6,10 @@ import java.util.function.Function;
import javax.annotation.Nullable;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.simibubi.create.foundation.config.ui.ConfigButton;
import com.simibubi.create.foundation.config.ui.ConfigTextField;
import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
@ -52,11 +54,13 @@ public abstract class NumberEntry<T extends Number> extends ValueEntry<T> {
if (!min.equals(getTypeMin())) {
StringTextComponent t = new StringTextComponent(formatBound(min) + " < ");
minText = new TextStencilElement(font, t).centered(true, false);
minText.withElementRenderer((ms, width, height) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, ConfigButton.Palette.button_hover_1, ConfigButton.Palette.button_hover_2));
minOffset = font.getWidth(t);
}
if (!max.equals(getTypeMax())) {
StringTextComponent t = new StringTextComponent(" < " + formatBound(max));
maxText = new TextStencilElement(font, t).centered(true, false);
maxText.withElementRenderer((ms, width, height) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, ConfigButton.Palette.button_hover_1, ConfigButton.Palette.button_hover_2));
maxOffset = font.getWidth(t);
}
} catch (NoSuchFieldException | IllegalAccessException | ClassCastException | NullPointerException ignored) {

View file

@ -8,6 +8,8 @@ import com.simibubi.create.foundation.config.ui.ServerSubMenuConfigScreen;
import com.simibubi.create.foundation.config.ui.SubMenuConfigScreen;
import com.simibubi.create.foundation.gui.ScreenOpener;
import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.ponder.ui.PonderButton;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen;
@ -15,16 +17,17 @@ import net.minecraftforge.common.ForgeConfigSpec;
public class SubMenuEntry extends ConfigScreenList.LabeledEntry {
protected ConfigButton button;
protected PonderButton button;
public SubMenuEntry(Screen parent, String label, ForgeConfigSpec spec, UnmodifiableConfig config) {
super(label);
TextStencilElement text = new TextStencilElement(Minecraft.getInstance().fontRenderer, "Click to open").centered(true, true);
button = ConfigButton.createFromStencilElement(0, 0, text)
.withCallback(() -> ScreenOpener.transitionTo(isForServer() ?
new ServerSubMenuConfigScreen(parent, spec, config) :
new SubMenuConfigScreen(parent, spec, config)
));
text.withElementRenderer((ms, width, height) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, ConfigButton.Palette.button_idle_1, ConfigButton.Palette.button_idle_2));
button = new PonderButton(0, 0, () -> ScreenOpener.transitionTo(isForServer() ?
new ServerSubMenuConfigScreen(parent, spec, config) :
new SubMenuConfigScreen(parent, spec, config))
).showingUnscaled(text);
button.fade(1);
listeners.add(button);
}
@ -32,7 +35,6 @@ public class SubMenuEntry extends ConfigScreenList.LabeledEntry {
@Override
public void tick() {
super.tick();
button.tick();
}
@Override
@ -40,8 +42,9 @@ public class SubMenuEntry extends ConfigScreenList.LabeledEntry {
super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks);
button.x = x + getLabelWidth(width);
button.y = y;
button.withBounds(width - getLabelWidth(width), height);
button.y = y + 10;
button.setWidth(width - getLabelWidth(width) - 4);
button.setHeight(height - 20);
button.render(ms, mouseX, mouseY, partialTicks);
}
@ -49,9 +52,4 @@ public class SubMenuEntry extends ConfigScreenList.LabeledEntry {
protected int getLabelWidth(int totalWidth) {
return (int) (totalWidth * labelWidthMult);
}
/*@Override
public boolean mouseClicked(double p_231044_1_, double p_231044_3_, int p_231044_5_) {
return button.mouseClicked(p_231044_1_, p_231044_3_, p_231044_5_);
}*/
}

View file

@ -13,7 +13,9 @@ import com.simibubi.create.foundation.config.ui.CConfigureConfigPacket;
import com.simibubi.create.foundation.config.ui.ConfigButton;
import com.simibubi.create.foundation.config.ui.ConfigScreenList;
import com.simibubi.create.foundation.gui.TextStencilElement;
import com.simibubi.create.foundation.gui.UIRenderHelper;
import com.simibubi.create.foundation.networking.AllPackets;
import com.simibubi.create.foundation.ponder.ui.PonderButton;
import net.minecraft.client.Minecraft;
import net.minecraft.util.text.StringTextComponent;
@ -22,12 +24,12 @@ import net.minecraftforge.common.ForgeConfigSpec;
public class ValueEntry<T> extends ConfigScreenList.LabeledEntry {
protected static final int resetWidth = 24;//including 2px offset on either side
protected static final int resetWidth = 28;//including 6px offset on either side
public static final Pattern unitPattern = Pattern.compile("\\[(in .*)]");
protected ForgeConfigSpec.ConfigValue<T> value;
protected ForgeConfigSpec.ValueSpec spec;
protected ConfigButton reset;
protected PonderButton resetButton;
protected boolean editable = true;
protected String unit = null;
@ -37,14 +39,15 @@ public class ValueEntry<T> extends ConfigScreenList.LabeledEntry {
this.spec = spec;
TextStencilElement text = new TextStencilElement(Minecraft.getInstance().fontRenderer, "R").centered(true, true);
reset = ConfigButton.createFromStencilElement(0, 0, text)
.withBounds(resetWidth - 4, 20)
.withCallback(() -> {
value.set((T) spec.getDefault());
this.onReset();
});
text.withElementRenderer((ms, width, height) -> UIRenderHelper.angledGradient(ms, 0 ,0, height/2, height, width, ConfigButton.Palette.button_idle_1, ConfigButton.Palette.button_idle_2));
resetButton = new PonderButton(0, 0, (_$, _$$) -> {
value.set((T) spec.getDefault());
this.onReset();
}, resetWidth - 12, 16).showingUnscaled(text);
resetButton.fade(1);
listeners.add(resetButton);
listeners.add(reset);
List<String> path = value.getPath();
labelTooltip.add(new StringTextComponent(path.get(path.size()-1)).formatted(TextFormatting.GRAY));
String comment = spec.getComment();
@ -79,22 +82,16 @@ public class ValueEntry<T> extends ConfigScreenList.LabeledEntry {
@Override
protected void setEditable(boolean b) {
editable = b;
reset.active = editable && !value.get().equals(spec.getDefault());
reset.animateGradientFromState();
}
@Override
public void tick() {
reset.tick();
resetButton.active = editable && !value.get().equals(spec.getDefault());
}
@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 - resetWidth + 2;
reset.y = y + 15;
reset.render(ms, mouseX, mouseY, partialTicks);
resetButton.x = x + width - resetWidth + 6;
resetButton.y = y + 15;
resetButton.render(ms, mouseX, mouseY, partialTicks);
}
@Override
@ -107,8 +104,7 @@ public class ValueEntry<T> extends ConfigScreenList.LabeledEntry {
}
protected void onValueChange() {
reset.active = editable && !value.get().equals(spec.getDefault());
reset.animateGradientFromState();
resetButton.active = editable && !value.get().equals(spec.getDefault());
if (!isForServer())
return;

View file

@ -43,4 +43,9 @@ public abstract class AbstractSimiWidget extends Widget {
public void runCallback(double mouseX, double mouseY) {
onClick.accept((int) mouseX, (int) mouseY);
}
@Override
public void onClick(double mouseX, double mouseY) {
runCallback(mouseX, mouseY);
}
}

View file

@ -6,6 +6,7 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.foundation.gui.GuiGameElement;
import com.simibubi.create.foundation.gui.IScreenRenderable;
import com.simibubi.create.foundation.gui.StencilElement;
import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget;
import com.simibubi.create.foundation.ponder.PonderUI;
import com.simibubi.create.foundation.utility.ColorHelper;
@ -133,6 +134,11 @@ public class PonderButton extends AbstractSimiWidget {
ms.translate(x + 2, y + 2, 0);
if (this.scaleIcon)
ms.scale((width - 4) / 16f, (height - 4) / 16f, 1);
else {
if (icon instanceof StencilElement){
((StencilElement) icon).withBounds(width - 4, height - 4);
}
}
icon.draw(ms, this, 0, 0);
ms.pop();