package io.gitlab.jfronny.libjf.config.impl.client.screen; import io.gitlab.jfronny.libjf.config.api.ConfigInstance; import io.gitlab.jfronny.libjf.config.impl.EntryInfo; import io.gitlab.jfronny.libjf.config.impl.client.screen.presets.PresetsScreen; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; 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.ClickableWidget; 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.*; 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(Screen parent, ConfigInstance config) { super(new TranslatableText(config.getModId() + ".jfconfig." + "title")); this.parent = parent; this.config = config; this.translationPrefix = config.getModId() + ".jfconfig."; } private final String translationPrefix; private final Screen parent; private final ConfigInstance config; private MidnightConfigListWidget list; // Real Time config update // @Override public void tick() { config.syncToClass(); } @Override protected void init() { super.init(); config.syncFromClass(); this.addDrawableChild(new ButtonWidget(4, 6, 80, 20, new TranslatableText("libjf-config-v0.presets"), button -> { MinecraftClient.getInstance().setScreen(new PresetsScreen(this, config)); })); this.addDrawableChild(new ButtonWidget(this.width / 2 - 154, this.height - 28, 150, 20, ScreenTexts.CANCEL, button -> { config.load(); Objects.requireNonNull(client).setScreen(parent); })); ButtonWidget done = this.addDrawableChild(new ButtonWidget(this.width / 2 + 4, this.height - 28, 150, 20, ScreenTexts.DONE, (button) -> { config.syncToClass(); config.write(); Objects.requireNonNull(client).setScreen(parent); })); this.list = new MidnightConfigListWidget(this.client, this.width, this.height, 32, this.height - 32, 25); this.addSelectableChild(this.list); for (EntryInfo info : config.getEntries()) { 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(); Objects.requireNonNull(client).setScreen(this); list.setScrollAmount(scrollAmount); })); if (info.widget instanceof Map.Entry) { Map.Entry> widget = (Map.Entry>) 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 processor = ((BiFunction>) 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); } } } @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 widget = list.getHoveredButton(mouseY); if (widget.isPresent()) { for (EntryInfo info : config.getEntries()) { ClickableWidget buttonWidget = widget.get(); Text text = ConfigScreenEntry.buttonsWithText.get(buttonWidget); 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; List list = new ArrayList<>(); for (String str : I18n.translate(tooltipKey).split("\n")) list.add(new LiteralText(str)); renderTooltip(matrices, list, mouseX, mouseY); } } } super.render(matrices,mouseX,mouseY,delta); } @Override public void close() { MinecraftClient.getInstance().setScreen(parent); } }