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

100 lines
4.1 KiB
Java

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<WidgetState<?>> 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<String, ConfigCategory> 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<ClickableWidget> consumer) {
consumer.accept(new TinyConfigTabWrapper(this));
}
@Override
public void refreshGrid(ScreenRect tabArea) {
}
@Override
public void tick() {
Tab.super.tick();
}
public EntryListWidget getList() {
return list;
}
}