Respackopts/src/main/java/io/gitlab/jfronny/respackopts/GuiFactory.java

131 lines
6.3 KiB
Java
Raw Normal View History

2020-11-24 22:04:13 +01:00
package io.gitlab.jfronny.respackopts;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import me.shedaniel.clothconfig2.api.ConfigBuilder;
import me.shedaniel.clothconfig2.api.ConfigCategory;
import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
import me.shedaniel.clothconfig2.gui.entries.DropdownBoxEntry;
import me.shedaniel.clothconfig2.impl.builders.DropdownMenuBuilder;
2020-11-24 22:04:13 +01:00
import net.minecraft.client.gui.screen.FatalErrorScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.*;
import net.minecraft.util.Language;
2020-11-24 22:04:13 +01:00
import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;
2020-11-24 22:04:13 +01:00
public class GuiFactory {
public void buildCategory(JsonObject source, String screenId, ConfigCategory config, ConfigEntryBuilder entryBuilder) {
if (!Respackopts.boolVals.containsKey(screenId))
Respackopts.boolVals.put(screenId, new HashMap<>());
if (!Respackopts.numVals.containsKey(screenId))
Respackopts.numVals.put(screenId, new HashMap<>());
if (!Respackopts.strVals.containsKey(screenId))
Respackopts.strVals.put(screenId, new HashMap<>());
if (!Respackopts.enumKeys.containsKey(screenId))
Respackopts.enumKeys.put(screenId, new HashMap<>());
String b = "respackopts.field." + screenId;
2020-11-24 22:04:13 +01:00
for (Map.Entry<String, JsonElement> entry : source.entrySet()) {
String n = entry.getKey();
if (n.contains(":") || n.contains(".")) {
System.err.println(n + " contains invalid characters");
continue;
}
2020-11-24 22:04:13 +01:00
JsonElement e = entry.getValue();
if (e.isJsonPrimitive()) {
JsonPrimitive p = e.getAsJsonPrimitive();
if (p.isBoolean()) {
boolean defaultValue = p.getAsBoolean();
boolean currentValue = defaultValue;
if (Respackopts.boolVals.get(screenId).containsKey(n))
currentValue = Respackopts.boolVals.get(screenId).get(n);
else
Respackopts.boolVals.get(screenId).put(n, defaultValue);
config.addEntry(entryBuilder.startBooleanToggle(getText(n, b), currentValue)
2020-11-24 22:04:13 +01:00
.setDefaultValue(defaultValue)
.setSaveConsumer(v -> Respackopts.boolVals.get(screenId).put(n, v))
2020-11-24 22:04:13 +01:00
.build());
}
else if (p.isNumber()) {
double defaultValue = p.getAsDouble();
Double currentValue = defaultValue;
2020-11-24 22:04:13 +01:00
if (Respackopts.numVals.get(screenId).containsKey(n))
currentValue = Respackopts.numVals.get(screenId).get(n);
else
Respackopts.numVals.get(screenId).put(n, defaultValue);
config.addEntry(entryBuilder.startDoubleField(getText(n, b), currentValue)
2020-11-24 22:04:13 +01:00
.setDefaultValue(defaultValue)
.setSaveConsumer(v -> Respackopts.numVals.get(screenId).put(n, v))
2020-11-24 22:04:13 +01:00
.build());
}
else if (p.isString()) {
String defaultValue = p.getAsString();
String currentValue = defaultValue;
if (Respackopts.strVals.get(screenId).containsKey(n))
currentValue = Respackopts.strVals.get(screenId).get(n);
else
Respackopts.strVals.get(screenId).put(n, defaultValue);
config.addEntry(entryBuilder.startStrField(getText(n, b), currentValue)
2020-11-24 22:04:13 +01:00
.setDefaultValue(defaultValue)
.setSaveConsumer(v -> Respackopts.strVals.get(screenId).put(n, v))
2020-11-24 22:04:13 +01:00
.build());
}
}
else if (e.isJsonArray()) {
TreeSet<String> ev = Respackopts.enumKeys.get(screenId).get(n);
Double c = Respackopts.numVals.get(screenId).get(n);
String sel = ev.first();
int i = 0;
for (String s1 : ev) {
if (c.intValue() == i) {
sel = s1;
}
i++;
}
config.addEntry(entryBuilder.startDropdownMenu(getText(n, b), (DropdownBoxEntry.SelectionTopCellElement) DropdownMenuBuilder.TopCellElementBuilder.of(sel, (s) -> s, (s) -> getText(s, b + "." + n)), new DropdownBoxEntry.DefaultSelectionCellCreator())
.setSuggestionMode(false)
.setDefaultValue(ev.first())
.setSelections(() -> ev.iterator())
.setSaveConsumer(v -> {
int j = 0;
for (String s1 : ev) {
if (s1.equals(v))
Respackopts.numVals.get(screenId).put(n, (double) j);
j++;
}
}).build());
}
2020-11-24 22:04:13 +01:00
else {
System.err.println("[respackopts] Unsupported non-primitive datatype");
}
}
}
2020-11-25 21:58:21 +01:00
public Screen buildGui(JsonObject source, String resourcepackid, Screen parent) {
2020-11-24 22:04:13 +01:00
try {
ConfigBuilder builder;
builder = ConfigBuilder.create()
.setParentScreen(parent)
.setTitle(getText(resourcepackid, "respackopts.title"));
2020-11-24 22:04:13 +01:00
ConfigEntryBuilder entryBuilder = builder.entryBuilder();
builder.setSavingRunnable(Respackopts::save);
ConfigCategory config = builder.getOrCreateCategory(getText(resourcepackid, "respackopts.title"));
2020-11-24 22:04:13 +01:00
buildCategory(source, resourcepackid, config, entryBuilder);
return builder.build();
}
catch (Throwable t) {
t.printStackTrace();
return new FatalErrorScreen(new TranslatableText("respackopts.loadFailed"), new TranslatableText("respackopts.loadError"));
}
}
private Text getText(String key, String idPrefix) {
String k = idPrefix + "." + key;
if (Language.getInstance().hasTranslation(k)) return new TranslatableText(k);
else return new LiteralText(key);
}
2020-11-24 22:04:13 +01:00
}