LibJF/libjf-config-ui-tiny-v1/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/tiny/TinyConfigScreen.java

151 lines
6.6 KiB
Java
Raw Normal View History

package io.gitlab.jfronny.libjf.config.impl.ui.tiny;
2021-05-15 15:34:19 +02:00
2022-04-29 15:48:27 +02:00
import io.gitlab.jfronny.commons.throwable.Try;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigCategory;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v1.ui.tiny.WidgetFactory;
import io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigSafe;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.entry.EntryInfoWidgetBuilder;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.entry.EntryListWidget;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.presets.PresetsScreen;
2021-05-15 15:34:19 +02:00
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.resource.language.I18n;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.screen.ScreenTexts;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
2021-05-15 15:34:19 +02:00
import java.util.*;
2021-05-15 15:34:19 +02:00
@Environment(EnvType.CLIENT)
public class TinyConfigScreen extends Screen {
public TinyConfigScreen(ConfigCategory config, Screen parent) {
super(getTitle(config.getTranslationPrefix()));
2021-05-15 15:34:19 +02:00
this.parent = parent;
this.config = config;
2022-04-29 15:48:27 +02:00
this.widgets = EntryInfoWidgetBuilder.buildWidgets(config);
this.translationPrefix = config.getTranslationPrefix();
2021-05-15 15:34:19 +02:00
}
public static Text getTitle(String categoryPath) {
final String titlePath = categoryPath + "title";
if (JfConfigSafe.TRANSLATION_SUPPLIER.apply(titlePath) != null) {
return Text.translatable(titlePath);
}
final String alternatePath = categoryPath.length() == 0 ? "" : categoryPath.substring(0, categoryPath.length() - 1);
if (JfConfigSafe.TRANSLATION_SUPPLIER.apply(alternatePath) != null) {
return Text.translatable(alternatePath);
}
return Text.translatable(titlePath);
}
2021-05-15 15:34:19 +02:00
private final String translationPrefix;
private final Screen parent;
private final ConfigCategory config;
2022-04-29 15:48:27 +02:00
private final List<WidgetState<?>> widgets;
private EntryListWidget list;
2021-05-15 15:34:19 +02:00
@Override
protected void init() {
super.init();
config.fix();
2022-08-27 17:41:56 +02:00
for (WidgetState<?> widget : widgets) {
widget.updateCache();
}
2022-01-08 20:02:15 +01:00
2022-08-27 17:41:56 +02:00
if (!config.getPresets().isEmpty()) {
2022-12-07 19:54:35 +01:00
this.addDrawableChild(ButtonWidget.builder(Text.translatable("libjf-config-v1.presets"),
button -> Objects.requireNonNull(client).setScreen(new PresetsScreen(this, config)))
.position(4, 6)
.size(80, 20)
.build());
2022-08-27 17:41:56 +02:00
}
2022-01-08 20:02:15 +01:00
2022-12-07 19:54:35 +01:00
this.addDrawableChild(ButtonWidget.builder(ScreenTexts.CANCEL,
button -> Objects.requireNonNull(client).setScreen(parent))
.position(this.width / 2 - 154, this.height - 28)
.size(150, 20)
.build());
2021-05-15 15:34:19 +02:00
2022-12-07 19:54:35 +01:00
ButtonWidget done = this.addDrawableChild(ButtonWidget.builder(ScreenTexts.DONE, (button) -> {
for (WidgetState<?> state : widgets) {
Try.orElse(state::writeToEntry, e -> LibJf.LOGGER.error("Could not write config data to class", e));
}
config.getRoot().write();
Objects.requireNonNull(client).setScreen(parent);
})
.position(this.width / 2 + 4, this.height - 28)
.size(150, 20)
.build());
2021-05-15 15:34:19 +02:00
this.list = new EntryListWidget(this.client, this.width, this.height, 32, this.height - 32, 25);
2021-05-29 10:37:13 +02:00
this.addSelectableChild(this.list);
for (Map.Entry<String, ConfigCategory> entry : config.getCategories().entrySet()) {
2022-03-30 23:08:51 +02:00
this.list.addReference(width / 2,
getTitle(entry.getValue().getTranslationPrefix()),
2022-03-30 23:08:51 +02:00
() -> new TinyConfigScreen(entry.getValue(), this));
}
2022-04-29 15:48:27 +02:00
for (WidgetState<?> info : widgets) {
MutableText name = Text.translatable(translationPrefix + info.entry.getName());
2022-04-29 16:07:12 +02:00
WidgetFactory.Widget control = info.factory.build(width, textRenderer, done);
2022-12-07 19:54:35 +01:00
ButtonWidget resetButton = ButtonWidget.builder(Text.translatable("libjf-config-v1.reset"), (button -> {
info.reset();
control.updateControls().run();
}))
.position(width - 155, 0)
.size(40, 20)
.build();
2022-04-29 16:07:12 +02:00
this.list.addButton(control.control(), resetButton, () -> {
2022-04-29 15:48:27 +02:00
boolean visible = !Objects.equals(info.entry.getDefault(), info.cachedValue);
resetButton.active = visible;
return visible;
}, name);
2021-05-15 15:34:19 +02:00
}
for (ConfigInstance ci : config.getReferencedConfigs()) {
if (ci != null) {
this.list.addReference(width / 2,
Text.translatable("libjf-config-v1.see-also", getTitle(ci.getTranslationPrefix())),
() -> 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);
2023-02-26 12:49:00 +01:00
drawCenteredTextWithShadow(matrices, textRenderer, title, width / 2, 15, 0xFFFFFF);
2021-05-15 15:34:19 +02:00
Optional<Text> hovered = list.getHoveredEntryTitle(mouseY);
if (hovered.isPresent()) {
2022-04-29 15:48:27 +02:00
for (WidgetState<?> info : widgets) {
Text text = hovered.get();
MutableText name = Text.translatable(this.translationPrefix + info.entry.getName());
boolean showTooltip = text.equals(name);
2022-04-29 15:48:27 +02:00
String tooltipKey = translationPrefix + info.entry.getName() + ".tooltip";
if (showTooltip && info.error != null) {
showTooltip = false;
2022-04-29 15:48:27 +02:00
renderTooltip(matrices, info.error.right(), 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"))
list.add(Text.literal(str));
2021-05-15 15:34:19 +02:00
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-08-27 17:41:56 +02:00
Objects.requireNonNull(client).setScreen(parent);
2022-01-08 20:02:15 +01:00
}
2021-05-15 15:34:19 +02:00
}