package io.gitlab.jfronny.libjf.config.impl.ui.tiny; 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.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; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.ScreenRect; import net.minecraft.client.gui.tab.Tab; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.text.MutableText; import net.minecraft.text.Text; import java.util.*; import java.util.function.BooleanSupplier; import java.util.function.Consumer; public class TinyConfigTab implements Tab { private final ConfigCategory config; private final EntryListWidget list; public TinyConfigTab(TinyConfigScreen screen, ConfigCategory config, TextRenderer textRenderer, boolean isRoot) { this.config = config; List> widgets = EntryInfoWidgetBuilder.buildWidgets(config, screen.widgets); config.fix(); for (WidgetState widget : widgets) { widget.updateCache(); } this.list = new EntryListWidget(screen.getClient(), textRenderer, screen.width, screen.height, 32, screen.height - 32, 25); if (screen.hasClient() && screen.getClient().world != null) this.list.setRenderBackground(false); if (isRoot) { for (Map.Entry entry : config.getCategories().entrySet()) { this.list.addReference(screen.width / 2, TinyConfigScreen.getTitle(entry.getValue().getTranslationPrefix()), () -> new TinyConfigScreen(entry.getValue(), screen)); } } else { if (!config.getPresets().isEmpty()) { this.list.addReference(screen.width / 2, Text.translatable("libjf-config-v1.presets"), () -> new PresetsScreen(screen, config)); } } for (WidgetState info : widgets) { MutableText name = Text.translatable(config.getTranslationPrefix() + info.entry.getName()); WidgetFactory.Widget control = info.factory == null ? null : info.factory.build(screen, textRenderer); ButtonWidget resetButton = ButtonWidget.builder(Text.translatable("libjf-config-v1.reset"), (button -> { info.reset(); if (control != null) control.updateControls().run(); })) .position(screen.width - 155, 0) .size(40, 20) .build(); BooleanSupplier resetVisible = () -> { boolean visible = !Objects.equals(info.entry.getDefault(), info.cachedValue); resetButton.active = visible; return visible; }; if (control == null) this.list.addUnknown(resetButton, resetVisible, name); else this.list.addButton(control.control(), resetButton, resetVisible, name); } for (ConfigInstance ci : config.getReferencedConfigs()) { if (ci != null) { this.list.addReference(screen.width / 2, Text.translatable("libjf-config-v1.see-also", TinyConfigScreen.getTitle(ci.getTranslationPrefix())), () -> new TinyConfigScreen(ci, screen)); } } } @Override public Text getTitle() { return TinyConfigScreen.getTitle(config.getTranslationPrefix()); } @Override public void forEachChild(Consumer consumer) { consumer.accept(new TinyConfigTabWrapper(this)); } @Override public void refreshGrid(ScreenRect tabArea) { } @Override public void tick() { Tab.super.tick(); } public EntryListWidget getList() { return list; } }