100 lines
4.1 KiB
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;
|
||
|
}
|
||
|
}
|