LibJF/libjf-config-v0/src/main/java/io/gitlab/jfronny/libjf/config/impl/client/screen/TinyConfigScreen.java

139 lines
6.3 KiB
Java
Raw Normal View History

package io.gitlab.jfronny.libjf.config.impl.client.screen;
2021-05-15 15:34:19 +02:00
import io.gitlab.jfronny.libjf.config.api.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.ConfigInstance;
2021-10-06 19:01:48 +02:00
import io.gitlab.jfronny.libjf.config.impl.EntryInfo;
import io.gitlab.jfronny.libjf.config.impl.client.screen.presets.PresetsScreen;
2021-05-15 15:34:19 +02:00
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
2022-01-08 20:02:15 +01:00
import net.minecraft.client.MinecraftClient;
2021-05-15 15:34:19 +02:00
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ScreenTexts;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.TextFieldWidget;
import net.minecraft.client.resource.language.I18n;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
import java.util.*;
2021-05-15 15:34:19 +02:00
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
@Environment(EnvType.CLIENT)
public class TinyConfigScreen extends Screen {
public TinyConfigScreen(ConfigInstance config, Screen parent) {
super(new TranslatableText(config.getModId() + ".jfconfig." + "title"));
2021-05-15 15:34:19 +02:00
this.parent = parent;
this.config = config;
this.translationPrefix = config.getModId() + ".jfconfig.";
2021-05-15 15:34:19 +02:00
}
private final String translationPrefix;
private final Screen parent;
private final ConfigInstance config;
2021-05-15 15:34:19 +02:00
private MidnightConfigListWidget list;
// Real Time config update //
@Override
public void tick() {
2022-01-08 20:02:15 +01:00
config.syncToClass();
2021-05-15 15:34:19 +02:00
}
@Override
protected void init() {
super.init();
2022-01-08 20:02:15 +01:00
config.syncFromClass();
this.addDrawableChild(new ButtonWidget(4, 6, 80, 20, new TranslatableText("libjf-config-v0.presets"), button -> {
MinecraftClient.getInstance().setScreen(new PresetsScreen(this, config));
}));
2021-05-29 10:37:13 +02:00
this.addDrawableChild(new ButtonWidget(this.width / 2 - 154, this.height - 28, 150, 20, ScreenTexts.CANCEL, button -> {
config.load();
2021-08-21 19:35:20 +02:00
Objects.requireNonNull(client).setScreen(parent);
2021-05-15 15:34:19 +02:00
}));
2021-05-29 10:37:13 +02:00
ButtonWidget done = this.addDrawableChild(new ButtonWidget(this.width / 2 + 4, this.height - 28, 150, 20, ScreenTexts.DONE, (button) -> {
2022-01-08 20:02:15 +01:00
config.syncToClass();
2021-05-15 15:34:19 +02:00
config.write();
2021-08-21 19:35:20 +02:00
Objects.requireNonNull(client).setScreen(parent);
2021-05-15 15:34:19 +02:00
}));
this.list = new MidnightConfigListWidget(this.client, this.width, this.height, 32, this.height - 32, 25);
2021-05-29 10:37:13 +02:00
this.addSelectableChild(this.list);
for (EntryInfo info : config.getEntries()) {
2021-05-15 15:34:19 +02:00
TranslatableText name = new TranslatableText(translationPrefix + info.field.getName());
ButtonWidget resetButton = new ButtonWidget(width - 155, 0, 40, 20, new LiteralText("Reset").formatted(Formatting.RED), (button -> {
info.value = info.defaultValue;
info.tempValue = info.value.toString();
double scrollAmount = list.getScrollAmount();
2021-08-21 19:35:20 +02:00
Objects.requireNonNull(client).setScreen(this);
2021-05-15 15:34:19 +02:00
list.setScrollAmount(scrollAmount);
}));
if (info.widget instanceof Map.Entry) {
Map.Entry<ButtonWidget.PressAction, Function<Object, Text>> widget = (Map.Entry<ButtonWidget.PressAction, Function<Object, Text>>) info.widget;
if (info.field.getType().isEnum()) widget.setValue(value -> new TranslatableText(translationPrefix + "enum." + info.field.getType().getSimpleName() + "." + info.value.toString()));
this.list.addButton(new ButtonWidget(width - 110, 0, info.width, 20, widget.getValue().apply(info.value), widget.getKey()),resetButton,name);
} else if (info.widget != null) {
TextFieldWidget widget = new TextFieldWidget(textRenderer, width - 110, 0, info.width, 20, null);
widget.setText(info.tempValue);
Predicate<String> processor = ((BiFunction<TextFieldWidget, ButtonWidget, Predicate<String>>) info.widget).apply(widget, done);
widget.setTextPredicate(processor);
this.list.addButton(widget, resetButton, name);
} else {
ButtonWidget dummy = new ButtonWidget(-10, 0, 0, 0, Text.of(""), null);
this.list.addButton(dummy,dummy,name);
}
}
for (String referencedConfig : config.getReferencedConfigs()) {
ConfigInstance ci = ConfigHolder.getInstance().get(referencedConfig);
if (ci != null) {
this.list.addReference(width / 2,
new TranslatableText("libjf-config-v0.see-also", new TranslatableText(ci.getModId() + ".jfconfig.title")),
() -> new TinyConfigScreen(ci, this));
}
}
2021-05-15 15:34:19 +02:00
}
2022-01-08 20:02:15 +01:00
2021-05-15 15:34:19 +02:00
@Override
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
this.renderBackground(matrices);
this.list.render(matrices, mouseX, mouseY, delta);
drawCenteredText(matrices, textRenderer, title, width / 2, 15, 0xFFFFFF);
Optional<Text> hovered = list.getHoveredEntryTitle(mouseY);
if (hovered.isPresent()) {
for (EntryInfo info : config.getEntries()) {
Text text = hovered.get();
2021-05-15 15:34:19 +02:00
TranslatableText name = new TranslatableText(this.translationPrefix + info.field.getName());
boolean showTooltip = text.equals(name);
String tooltipKey = translationPrefix + info.field.getName() + ".tooltip";
if (showTooltip && info.error != null) {
showTooltip = false;
renderTooltip(matrices, info.error.getValue(), mouseX, mouseY);
}
if (showTooltip && I18n.hasTranslation(tooltipKey)) {
showTooltip = false;
2021-05-15 15:34:19 +02:00
List<Text> list = new ArrayList<>();
for (String str : I18n.translate(tooltipKey).split("\n"))
2021-05-15 15:34:19 +02:00
list.add(new LiteralText(str));
renderTooltip(matrices, list, mouseX, mouseY);
}
}
}
2021-05-29 10:37:13 +02:00
super.render(matrices,mouseX,mouseY,delta);
2021-05-15 15:34:19 +02:00
}
2022-01-08 20:02:15 +01:00
@Override
2022-02-12 09:52:43 +01:00
public void close() {
2022-01-08 20:02:15 +01:00
MinecraftClient.getInstance().setScreen(parent);
}
2021-05-15 15:34:19 +02:00
}