Files
Meteor-Rejects/src/main/java/anticope/rejects/settings/StringMapSetting.java
morpheus 4a822e773c
Some checks failed
Java CI with Gradle / build (push) Has been cancelled
Update to Meteor-Rejects to 1.21.10
2025-11-01 23:32:30 -03:00

158 lines
5.1 KiB
Java

package anticope.rejects.settings;
import meteordevelopment.meteorclient.gui.GuiTheme;
import meteordevelopment.meteorclient.gui.renderer.GuiRenderer;
import meteordevelopment.meteorclient.gui.widgets.containers.WTable;
import meteordevelopment.meteorclient.gui.widgets.input.WTextBox;
import meteordevelopment.meteorclient.gui.widgets.pressable.WButton;
import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus;
import meteordevelopment.meteorclient.gui.widgets.pressable.WPlus;
import meteordevelopment.meteorclient.settings.IVisible;
import meteordevelopment.meteorclient.settings.Setting;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtString;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
public class StringMapSetting extends Setting<Map<String, String>> {
public final Class<? extends WTextBox.Renderer> renderer;
public StringMapSetting(String name, String description, Map<String, String> defaultValue, Consumer<Map<String, String>> onChanged, Consumer<Setting<Map<String, String>>> onModuleActivated, IVisible visible, Class<? extends WTextBox.Renderer> renderer) {
super(name, description, defaultValue, onChanged, onModuleActivated, visible);
this.renderer = renderer;
}
@Override
protected Map<String, String> parseImpl(String str) {
String[] values = str.split(",");
Map<String, String> map = new LinkedHashMap<>(values.length / 2);
try {
String left = null;
for (int i = 0; i < values.length; i++) {
if (i % 2 == 0) {
left = values[i];
} else {
map.put(left, values[i]);
}
}
} catch (Exception ignored) {
}
return map;
}
@Override
protected boolean isValueValid(Map<String, String> value) {
return true;
}
@Override
protected void resetImpl() {
value = new LinkedHashMap<>(defaultValue);
}
@Override
protected NbtCompound save(NbtCompound tag) {
NbtCompound valueTag = new NbtCompound();
for (String key : get().keySet()) {
valueTag.put(key, NbtString.of(get().get(key)));
}
tag.put("map", valueTag);
return tag;
}
@Override
protected Map<String, String> load(NbtCompound tag) {
get().clear();
NbtCompound valueTag = tag.getCompound("map").orElse(new NbtCompound());
for (String key : valueTag.getKeys()) {
get().put(key, valueTag.getString(key).orElse(""));
}
return get();
}
public static void fillTable(GuiTheme theme, WTable table, StringMapSetting setting) {
table.clear();
Map<String, String> map = setting.get();
for (String key : map.keySet()) {
AtomicReference<String> key2 = new AtomicReference<>(key);
WTextBox textBoxK = table.add(theme.textBox(key2.get())).minWidth(150).expandX().widget();
textBoxK.actionOnUnfocused = () -> {
String text = textBoxK.get();
if (map.containsKey(text)) {
textBoxK.set(key2.get());
return;
}
String value = map.remove(key2.get());
key2.set(text);
map.put(text, value);
};
WTextBox textBoxV = table.add(theme.textBox(map.get(key2.get()), (text1, c) -> true, setting.renderer)).minWidth(150).expandX().widget();
textBoxV.actionOnUnfocused = () -> map.replace(key2.get(), textBoxV.get());
WMinus delete = table.add(theme.minus()).widget();
delete.action = () -> {
map.remove(key2.get());
fillTable(theme, table, setting);
};
table.row();
}
if (!map.isEmpty()) {
table.add(theme.horizontalSeparator()).expandX();
table.row();
}
WButton reset = table.add(theme.button(GuiRenderer.RESET)).widget();
reset.action = () -> {
setting.reset();
fillTable(theme, table, setting);
};
WPlus add = table.add(theme.plus()).widget();
add.action = () -> {
map.put("", "");
fillTable(theme, table, setting);
};
table.row();
}
public static class Builder extends SettingBuilder<Builder, Map<String, String>, StringMapSetting> {
private Class<? extends WTextBox.Renderer> renderer;
public Builder() {
super(new LinkedHashMap<>(0));
}
public Builder defaultValue(Map<String, String> map) {
this.defaultValue = map;
return this;
}
public Builder renderer(Class<? extends WTextBox.Renderer> renderer) {
this.renderer = renderer;
return this;
}
@Override
public StringMapSetting build() {
return new StringMapSetting(name, description, defaultValue, onChanged, onModuleActivated, visible, renderer);
}
}
}