package io.gitlab.jfronny.respackopts.util; import io.gitlab.jfronny.respackopts.Respackopts; import io.gitlab.jfronny.respackopts.model.tree.ConfigBranch; import io.gitlab.jfronny.respackopts.model.tree.ConfigEntry; import io.gitlab.jfronny.respackopts.model.tree.GuiEntryBuilderParam; import io.gitlab.jfronny.respackopts.model.enums.PackReloadType; import io.gitlab.jfronny.respackopts.integration.DashLoaderCompat; import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; import me.shedaniel.clothconfig2.api.ConfigBuilder; import me.shedaniel.clothconfig2.api.ConfigCategory; import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; import net.minecraft.client.gui.screen.FatalErrorScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Language; import java.util.Map; import java.util.Optional; import java.util.function.Consumer; public class GuiFactory { public void buildCategory(ConfigBranch source, String screenId, Consumer> config, Consumer reloadTypeAggregator, ConfigEntryBuilder entryBuilder, String namePrefix) { for (Map.Entry> in : source.getValue().entrySet()) { ConfigEntry entry = in.getValue(); String entryName = ("".equals(namePrefix) ? "" : namePrefix + ".") + in.getKey(); String translationPrefix = (source.getVersion() < 3 ? "respackopts." + entry.getEntryType() + "." : "rpo.") + screenId; config.accept(entry.buildEntry( new GuiEntryBuilderParam(entryBuilder, getText(entryName, translationPrefix), () -> { String k = (source.getVersion() < 3 ? "respackopts.tooltip." : "rpo.tooltip.") + screenId + "." + entryName; if (Language.getInstance().hasTranslation(k)) { Text[] res = new Text[1]; res[0] = new TranslatableText(k); return Optional.of(res); } else return Optional.empty(); }, screenId, entryName, translationPrefix, () -> reloadTypeAggregator.accept(entry.getReloadType()), reloadTypeAggregator))); } } public static Text getText(String name, String translationPrefix) { String translatableNameKey = translationPrefix + "." + name; return Language.getInstance().hasTranslation(translatableNameKey) ? new TranslatableText(translatableNameKey) : new LiteralText(name); } public Screen buildGui(ConfigBranch source, String packId, Screen parent) { try { ConfigBuilder builder; builder = ConfigBuilder.create() .setParentScreen(parent) .setTitle(getText(packId, source.getVersion() < 4 ? "respackopts.title" : "rpo")); ConfigEntryBuilder entryBuilder = builder.entryBuilder(); PackReloadType.Aggregator agg = new PackReloadType.Aggregator(); builder.setSavingRunnable(() -> { MetaCache.save(); if (Respackopts.CONFIG.debugLogs) Respackopts.LOGGER.info("GuiFactory SavingRunnable " + agg.get()); if (agg.get() == PackReloadType.Resource) { Respackopts.forcePackReload = true; DashLoaderCompat.requestForceReload(); Respackopts.reloadData(); } }); ConfigCategory config = builder.getOrCreateCategory(getText(packId, source.getVersion() < 4 ? "respackopts.title" : "rpo")); buildCategory(source, packId, config::addEntry, agg, entryBuilder, ""); return builder.build(); } catch (Throwable t) { t.printStackTrace(); return new FatalErrorScreen(new TranslatableText("respackopts.loadFailed"), new TranslatableText("respackopts.loadError")); } } }