chore: Finish duration input and add it to config gui
This commit is contained in:
parent
766a9740d6
commit
a3d7f9463b
@ -148,7 +148,7 @@ public final class AnimatedChunks implements ClientModInitializer, ModMenuApi {
|
|||||||
public ConfigScreenFactory<?> getModConfigScreenFactory() {
|
public ConfigScreenFactory<?> getModConfigScreenFactory() {
|
||||||
return (Screen parent) -> {
|
return (Screen parent) -> {
|
||||||
var _this = getInstance();
|
var _this = getInstance();
|
||||||
return new AnimatedChunksScreen(parent, _this.animation, _this.ease, _this.config);
|
return new AnimatedChunksScreen(parent, _this.animation, _this.ease, _this.config, _this.progress);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import net.minecraft.util.math.ColorHelper.Argb;
|
|||||||
import me.topchetoeu.animatedchunks.ConfigManager;
|
import me.topchetoeu.animatedchunks.ConfigManager;
|
||||||
import me.topchetoeu.animatedchunks.Manager;
|
import me.topchetoeu.animatedchunks.Manager;
|
||||||
import me.topchetoeu.animatedchunks.animation.Animation;
|
import me.topchetoeu.animatedchunks.animation.Animation;
|
||||||
|
import me.topchetoeu.animatedchunks.animation.ProgressManager;
|
||||||
import me.topchetoeu.animatedchunks.easing.Ease;
|
import me.topchetoeu.animatedchunks.easing.Ease;
|
||||||
import me.topchetoeu.animatedchunks.gui.Section.OrderType;
|
import me.topchetoeu.animatedchunks.gui.Section.OrderType;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
@ -20,6 +21,7 @@ public class AnimatedChunksScreen extends Screen {
|
|||||||
private final Manager<Animation> animation;
|
private final Manager<Animation> animation;
|
||||||
private final Manager<Ease> ease;
|
private final Manager<Ease> ease;
|
||||||
private final ConfigManager config;
|
private final ConfigManager config;
|
||||||
|
private final ProgressManager progress;
|
||||||
|
|
||||||
public static void playClick() {
|
public static void playClick() {
|
||||||
MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0f));
|
MinecraftClient.getInstance().getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0f));
|
||||||
@ -46,8 +48,6 @@ public class AnimatedChunksScreen extends Screen {
|
|||||||
mainSection.order = OrderType.Justified;
|
mainSection.order = OrderType.Justified;
|
||||||
mainSection.children.addSelectableChild(selectionsSection());
|
mainSection.children.addSelectableChild(selectionsSection());
|
||||||
mainSection.children.addSelectableChild(previewSection());
|
mainSection.children.addSelectableChild(previewSection());
|
||||||
mainSection.children.addSelectableChild(new Input(0, 0, null));
|
|
||||||
// setZOffset(parent.getZOffset() + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -97,17 +97,36 @@ public class AnimatedChunksScreen extends Screen {
|
|||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
private Section durationSection() {
|
||||||
|
var res = new HorizontalSection();
|
||||||
|
res.setTargetWidth(width / 2);
|
||||||
|
var input = new NumberInput(res, 5, 5, (sender, val) -> {
|
||||||
|
if (val <= 0) sender.invalid = true;
|
||||||
|
else {
|
||||||
|
progress.setDuration(val);
|
||||||
|
sender.invalid = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
input.width = (int)res.getTargetWidth();
|
||||||
|
res.x = res.y = 5;
|
||||||
|
res.title = Text.of("Duration:");
|
||||||
|
res.children.addSelectableChild(input);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
private Section selectionsSection() {
|
private Section selectionsSection() {
|
||||||
var res = new HorizontalSection();
|
var res = new HorizontalSection();
|
||||||
res.x = res.y = 5;
|
res.x = res.y = 5;
|
||||||
res.title = Text.of("Animation config:");
|
res.title = Text.of("Animation config:");
|
||||||
res.children.addSelectableChild(selectionSection(animation, "Animation"));
|
res.children.addSelectableChild(selectionSection(animation, "Animation"));
|
||||||
res.children.addSelectableChild(selectionSection(ease, "Ease"));
|
res.children.addSelectableChild(selectionSection(ease, "Ease"));
|
||||||
|
res.children.addSelectableChild(durationSection());
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
public AnimatedChunksScreen(Screen parent, Manager<Animation> animation, Manager<Ease> ease, ConfigManager config) {
|
|
||||||
|
public AnimatedChunksScreen(Screen parent, Manager<Animation> animation, Manager<Ease> ease, ConfigManager config, ProgressManager progress) {
|
||||||
super(Text.of("Animated Chunks Config"));
|
super(Text.of("Animated Chunks Config"));
|
||||||
config.reload();
|
config.reload();
|
||||||
|
this.progress = progress;
|
||||||
this.animation = animation;
|
this.animation = animation;
|
||||||
this.ease = ease;
|
this.ease = ease;
|
||||||
this.config = config;
|
this.config = config;
|
||||||
|
@ -89,7 +89,7 @@ public class ChunkPreview extends DrawableHelper implements Drawable, Element, S
|
|||||||
return z < 3;
|
return z < 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void myFill(MatrixStack matrices, float x1, float y1, float x2, float y2, float a, float r, float g, float b) {
|
public static void myFill(MatrixStack matrices, float x1, float y1, float x2, float y2, float a, float r, float g, float b) {
|
||||||
if (x1 < x2) {
|
if (x1 < x2) {
|
||||||
float tmp = x1;
|
float tmp = x1;
|
||||||
x1 = x2;
|
x1 = x2;
|
||||||
@ -121,7 +121,6 @@ public class ChunkPreview extends DrawableHelper implements Drawable, Element, S
|
|||||||
RenderSystem.enableBlend();
|
RenderSystem.enableBlend();
|
||||||
RenderSystem.disableCull();
|
RenderSystem.disableCull();
|
||||||
RenderSystem.disableTexture();
|
RenderSystem.disableTexture();
|
||||||
RenderSystem.defaultBlendFunc();
|
|
||||||
RenderSystem.setShader(GameRenderer::getPositionColorShader);
|
RenderSystem.setShader(GameRenderer::getPositionColorShader);
|
||||||
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
|
bufferBuilder.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR);
|
||||||
bufferBuilder.vertex(p1.getX(), p1.getY(), p1.getZ()).color(r, g, b, a).next();
|
bufferBuilder.vertex(p1.getX(), p1.getY(), p1.getZ()).color(r, g, b, a).next();
|
||||||
|
@ -16,7 +16,7 @@ public final class HorizontalSection extends Section {
|
|||||||
|
|
||||||
private float targetWidth;
|
private float targetWidth;
|
||||||
|
|
||||||
public float getTargetWidth(float width) {
|
public float getTargetWidth() {
|
||||||
return this.targetWidth;
|
return this.targetWidth;
|
||||||
}
|
}
|
||||||
public void setTargetWidth(float width) {
|
public void setTargetWidth(float width) {
|
||||||
|
@ -2,42 +2,50 @@ package me.topchetoeu.animatedchunks.gui;
|
|||||||
|
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.platform.GlStateManager.DstFactor;
|
||||||
|
import com.mojang.blaze3d.platform.GlStateManager.SrcFactor;
|
||||||
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
|
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.Drawable;
|
import net.minecraft.client.gui.Drawable;
|
||||||
import net.minecraft.client.gui.DrawableHelper;
|
import net.minecraft.client.gui.DrawableHelper;
|
||||||
import net.minecraft.client.gui.Element;
|
import net.minecraft.client.gui.Element;
|
||||||
|
import net.minecraft.client.gui.ParentElement;
|
||||||
import net.minecraft.client.gui.Selectable;
|
import net.minecraft.client.gui.Selectable;
|
||||||
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
|
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
|
||||||
import net.minecraft.client.gui.screen.narration.NarrationPart;
|
import net.minecraft.client.gui.screen.narration.NarrationPart;
|
||||||
|
import net.minecraft.client.render.GameRenderer;
|
||||||
import net.minecraft.client.util.math.MatrixStack;
|
import net.minecraft.client.util.math.MatrixStack;
|
||||||
import net.minecraft.util.math.ColorHelper.Argb;
|
import net.minecraft.util.math.ColorHelper.Argb;
|
||||||
|
|
||||||
public class Input extends DrawableHelper implements Drawable, Element, Selectable, BoundboxProvider {
|
public class Input extends DrawableHelper implements Drawable, Element, Selectable, BoundboxProvider {
|
||||||
public static interface ClickAction {
|
public interface InputAction {
|
||||||
void onClick();
|
void onInput(Input sender, String val);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClickAction clickAction;
|
|
||||||
public final MinecraftClient client;
|
public final MinecraftClient client;
|
||||||
private boolean clicked = false;
|
private boolean clicked = false;
|
||||||
private boolean focused = false;
|
|
||||||
private boolean hovered = false;
|
private boolean hovered = false;
|
||||||
|
private boolean isFocused() {
|
||||||
public String content = "";
|
return parent.getFocused() == this;
|
||||||
public int paddingX = 5, paddingY = 2;
|
|
||||||
public int x, y, width = 100;
|
|
||||||
public float scale = 1;
|
|
||||||
public float min = 0, max = 10;
|
|
||||||
private float value;
|
|
||||||
|
|
||||||
public float getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
}
|
||||||
public Input setValue(float val) {
|
private int index = 0;
|
||||||
if (val < min) val = min;
|
|
||||||
if (val > max) val = max;
|
|
||||||
|
|
||||||
value = val;
|
private final ParentElement parent;
|
||||||
|
private String content = "";
|
||||||
|
public int paddingX = 5, paddingY = 2;
|
||||||
|
private float time = 0;
|
||||||
|
public int x, y, width = 100;
|
||||||
|
public boolean invalid = false;
|
||||||
|
public InputAction action = null;
|
||||||
|
|
||||||
|
public String getContent() {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
public Input setContent(String val) {
|
||||||
|
if (index > val.length()) index = val.length();
|
||||||
|
content = val;
|
||||||
|
action.onInput(this, val);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,11 +60,7 @@ public class Input extends DrawableHelper implements Drawable, Element, Selectab
|
|||||||
return width;
|
return width;
|
||||||
}
|
}
|
||||||
public float getHeight() {
|
public float getHeight() {
|
||||||
return paddingY * 2 + client.textRenderer.fontHeight;
|
return 1 + paddingY * 2 + client.textRenderer.fontHeight;
|
||||||
}
|
|
||||||
|
|
||||||
public void click() {
|
|
||||||
if (clickAction != null) clickAction.onClick();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -66,14 +70,42 @@ public class Input extends DrawableHelper implements Drawable, Element, Selectab
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SelectionType getType() {
|
public SelectionType getType() {
|
||||||
if (focused) return SelectionType.FOCUSED;
|
if (isFocused()) return SelectionType.FOCUSED;
|
||||||
if (hovered) return SelectionType.HOVERED;
|
if (hovered) return SelectionType.HOVERED;
|
||||||
return SelectionType.NONE;
|
return SelectionType.NONE;
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public boolean changeFocus(boolean lookForwards) {
|
public boolean changeFocus(boolean lookForwards) {
|
||||||
focused = !focused;
|
if (isFocused()) {
|
||||||
return focused;
|
parent.setFocused(null);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
parent.setFocused(this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderCursor(MatrixStack matrices, float delta) {
|
||||||
|
time += delta / 20;
|
||||||
|
|
||||||
|
if ((int)(time * 2) % 2 != 0) return;
|
||||||
|
|
||||||
|
// RenderSystem.enableBlend();
|
||||||
|
RenderSystem.setShader(GameRenderer::getPositionColorShader);
|
||||||
|
RenderSystem.disableCull();
|
||||||
|
RenderSystem.disableTexture();
|
||||||
|
RenderSystem.blendFuncSeparate(SrcFactor.ONE_MINUS_DST_COLOR, DstFactor.ONE_MINUS_SRC_COLOR, SrcFactor.ONE, DstFactor.ZERO);
|
||||||
|
|
||||||
|
float x1 = paddingX + client.textRenderer.getWidth(content.substring(0, index)) + 1;
|
||||||
|
float x2 = x1 + 1;
|
||||||
|
// if (index < content.length()) {
|
||||||
|
// x2 += client.textRenderer.getWidth("" + content.charAt(index)) - 2;
|
||||||
|
// }
|
||||||
|
float y1 = paddingY;
|
||||||
|
float y2 = y1 + client.textRenderer.fontHeight;
|
||||||
|
|
||||||
|
ChunkPreview.myFill(matrices, x1, y1, x2, y2, 1, 1, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -91,6 +123,11 @@ public class Input extends DrawableHelper implements Drawable, Element, Selectab
|
|||||||
fill(matrices, 0, 0, (int)getWidth(), (int)getHeight(), Argb.getArgb(127, 255, 255, 255));
|
fill(matrices, 0, 0, (int)getWidth(), (int)getHeight(), Argb.getArgb(127, 255, 255, 255));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
client.textRenderer.draw(matrices, content, paddingX + 1, paddingY + 1, white);
|
||||||
|
if (isFocused()) renderCursor(matrices, delta);
|
||||||
|
|
||||||
|
if (invalid) white = 0xFFFF0000;
|
||||||
|
|
||||||
drawHorizontalLine(matrices, 0, (int)getWidth() - 1, 0, white);
|
drawHorizontalLine(matrices, 0, (int)getWidth() - 1, 0, white);
|
||||||
drawVerticalLine(matrices, 0, 0, (int)getHeight() - 1, white);
|
drawVerticalLine(matrices, 0, 0, (int)getHeight() - 1, white);
|
||||||
drawVerticalLine(matrices, (int)getWidth() - 1, 0, (int)getHeight() - 1, white);
|
drawVerticalLine(matrices, (int)getWidth() - 1, 0, (int)getHeight() - 1, white);
|
||||||
@ -99,8 +136,6 @@ public class Input extends DrawableHelper implements Drawable, Element, Selectab
|
|||||||
// if (focused) {
|
// if (focused) {
|
||||||
// }
|
// }
|
||||||
|
|
||||||
client.textRenderer.draw(matrices, content, paddingX + 1, paddingY + 1, white);
|
|
||||||
|
|
||||||
matrices.pop();
|
matrices.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,21 +148,32 @@ public class Input extends DrawableHelper implements Drawable, Element, Selectab
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean charTyped(char chr, int modifiers) {
|
public boolean charTyped(char chr, int modifiers) {
|
||||||
content += chr;
|
content = content.substring(0, index) + chr + content.substring(index);
|
||||||
|
action.onInput(this, content);
|
||||||
|
index++;
|
||||||
|
time = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
||||||
if (keyCode == GLFW.GLFW_KEY_BACKSPACE && content.length() > 0) content = content.substring(0, content.length() - 1);
|
if (keyCode == GLFW.GLFW_KEY_BACKSPACE && index > 0) {
|
||||||
return false;
|
content = content.substring(0, index - 1) + content.substring(index);
|
||||||
}
|
action.onInput(this, content);
|
||||||
@Override
|
index--;
|
||||||
public boolean keyReleased(int keyCode, int scanCode, int modifiers) {
|
|
||||||
if (keyCode == GLFW.GLFW_KEY_ENTER) {
|
|
||||||
clicked = false;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
if (keyCode == GLFW.GLFW_KEY_DELETE && index < content.length()) {
|
||||||
|
time = 0;
|
||||||
|
content = content.substring(0, index) + content.substring(index + 1);
|
||||||
|
action.onInput(this, content);
|
||||||
|
}
|
||||||
|
if (keyCode == GLFW.GLFW_KEY_RIGHT && index < content.length()) {
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
if (keyCode == GLFW.GLFW_KEY_LEFT && index > 0) {
|
||||||
|
index--;
|
||||||
|
}
|
||||||
|
time = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
@ -151,8 +197,9 @@ public class Input extends DrawableHelper implements Drawable, Element, Selectab
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Input(int x, int y, ClickAction clickAction) {
|
public Input(ParentElement parent, int x, int y, InputAction input) {
|
||||||
this.clickAction = clickAction;
|
this.parent = parent;
|
||||||
|
this.action = input;
|
||||||
this.client = MinecraftClient.getInstance();
|
this.client = MinecraftClient.getInstance();
|
||||||
this.x = x;
|
this.x = x;
|
||||||
this.y = y;
|
this.y = y;
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
package me.topchetoeu.animatedchunks.gui;
|
||||||
|
|
||||||
|
import net.minecraft.client.gui.ParentElement;
|
||||||
|
|
||||||
|
public class NumberInput extends Input {
|
||||||
|
public interface InputAction {
|
||||||
|
void input(NumberInput sender, float number);
|
||||||
|
}
|
||||||
|
private float value;
|
||||||
|
public InputAction action;
|
||||||
|
|
||||||
|
public float getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
public NumberInput setValue(float val) {
|
||||||
|
value = val;
|
||||||
|
action.input(this, val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NumberInput(ParentElement parent, int x, int y, InputAction action) {
|
||||||
|
super(parent, x, y, null);
|
||||||
|
super.action = (sender, val) -> {
|
||||||
|
try {
|
||||||
|
invalid = false;
|
||||||
|
setValue(Float.parseFloat(val.trim()));
|
||||||
|
}
|
||||||
|
catch (NumberFormatException e) {
|
||||||
|
invalid = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.action = action;
|
||||||
|
setContent("");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user