aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/cc/polyfrost/oneconfig/internal
diff options
context:
space:
mode:
authorDeDiamondPro <67508414+DeDiamondPro@users.noreply.github.com>2022-07-04 14:39:58 +0200
committerDeDiamondPro <67508414+DeDiamondPro@users.noreply.github.com>2022-07-04 14:39:58 +0200
commit08d0986b2d6beaff2554f1b821dcefc996cb8c11 (patch)
treeca22a7338c5370d74588403bb1dde64a7dbb4eb5 /src/main/java/cc/polyfrost/oneconfig/internal
parent01b1cc16b41f793f40bb40f9532ef8ce0890f303 (diff)
downloadOneConfig-08d0986b2d6beaff2554f1b821dcefc996cb8c11.tar.gz
OneConfig-08d0986b2d6beaff2554f1b821dcefc996cb8c11.tar.bz2
OneConfig-08d0986b2d6beaff2554f1b821dcefc996cb8c11.zip
fix dropdown
Diffstat (limited to 'src/main/java/cc/polyfrost/oneconfig/internal')
-rw-r--r--src/main/java/cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilanceConfig.java197
-rw-r--r--src/main/java/cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilanceName.java16
-rw-r--r--src/main/java/cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilantAccessor.java11
-rw-r--r--src/main/java/cc/polyfrost/oneconfig/internal/plugin/OneConfigMixinPlugin.java6
4 files changed, 227 insertions, 3 deletions
diff --git a/src/main/java/cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilanceConfig.java b/src/main/java/cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilanceConfig.java
new file mode 100644
index 0000000..689bf25
--- /dev/null
+++ b/src/main/java/cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilanceConfig.java
@@ -0,0 +1,197 @@
+package cc.polyfrost.oneconfig.internal.config.compatibility.vigilance;
+
+import cc.polyfrost.oneconfig.config.core.ConfigUtils;
+import cc.polyfrost.oneconfig.internal.config.core.ConfigCore;
+import cc.polyfrost.oneconfig.config.core.OneColor;
+import cc.polyfrost.oneconfig.config.data.Mod;
+import cc.polyfrost.oneconfig.config.elements.OptionPage;
+import cc.polyfrost.oneconfig.config.elements.BasicOption;
+import cc.polyfrost.oneconfig.config.Config;
+import cc.polyfrost.oneconfig.gui.elements.config.*;
+import cc.polyfrost.oneconfig.platform.Platform;
+import gg.essential.vigilance.Vigilant;
+import gg.essential.vigilance.data.*;
+import kotlin.reflect.KMutableProperty0;
+import kotlin.reflect.jvm.ReflectJvmMapping;
+
+import java.awt.*;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Objects;
+
+/**
+ * This class is used to convert the Vigilance config to the new config system.
+ * It is not meant to be used outside the config system.
+ */
+public class VigilanceConfig extends Config {
+ public final Vigilant vigilant;
+
+ public VigilanceConfig(Mod modData, String configFile, Vigilant vigilant) {
+ super(modData, configFile);
+ this.vigilant = vigilant;
+ initialize();
+ }
+
+ @Override
+ public void initialize() {
+ if (vigilant != null) {
+ mod.config = this;
+ generateOptionsList(mod.defaultPage);
+ ConfigCore.mods.add(mod);
+ }
+ }
+
+ @Override
+ public void save() {
+ vigilant.markDirty();
+ vigilant.writeData();
+ }
+
+ @Override
+ public void load() {
+ //no-op
+ }
+
+ private void generateOptionsList(OptionPage page) {
+ for (PropertyData option : ((VigilantAccessor) vigilant).getPropertyCollector().getProperties()) {
+ PropertyAttributesExt attributes = option.getAttributesExt();
+ if (attributes.getHidden()) continue;
+ ArrayList<BasicOption> options = ConfigUtils.getSubCategory(page, getCategory(attributes), getSubcategory(attributes)).options;
+ switch (attributes.getType()) {
+ case SWITCH:
+ options.add(new ConfigSwitch(getFieldOfProperty(option), option.getInstance(), getName(attributes), getCategory(attributes), getSubcategory(attributes), 2));
+ break;
+ case CHECKBOX:
+ options.add(new ConfigCheckbox(getFieldOfProperty(option), option.getInstance(), getName(attributes),getCategory(attributes), getSubcategory(attributes), 2));
+ break;
+ case PARAGRAPH:
+ case TEXT:
+ options.add(new ConfigTextBox(getFieldOfProperty(option), option.getInstance(), getName(attributes), getCategory(attributes), getSubcategory(attributes), 2, attributes.getPlaceholder(), attributes.getProtected(), attributes.getType() == PropertyType.PARAGRAPH));
+ break;
+ case SELECTOR:
+ options.add(new ConfigDropdown(getFieldOfProperty(option), option.getInstance(), getName(attributes), getCategory(attributes), getSubcategory(attributes), 2, attributes.getOptions().toArray(new String[0])));
+ break;
+ case PERCENT_SLIDER:
+ options.add(new ConfigSlider(getFieldOfProperty(option), option.getInstance(), getName(attributes), getCategory(attributes), getSubcategory(attributes), 0, 1, 0));
+ break;
+ case DECIMAL_SLIDER:
+ options.add(new ConfigSlider(getFieldOfProperty(option), option.getInstance(), getName(attributes), getCategory(attributes), getSubcategory(attributes), attributes.getMinF(), attributes.getMaxF(), 0));
+ break;
+ case NUMBER:
+ options.add(new ConfigSlider(getFieldOfProperty(option), option.getInstance(), getName(attributes), getCategory(attributes), getSubcategory(attributes), attributes.getMin(), attributes.getMax(), 1));
+ break;
+ case SLIDER:
+ options.add(new ConfigSlider(getFieldOfProperty(option), option.getInstance(), getName(attributes), getCategory(attributes), getSubcategory(attributes), attributes.getMin(), attributes.getMax(), 0));
+ break;
+ case COLOR:
+ options.add(new CompatConfigColorElement(getFieldOfProperty(option), option.getInstance(), getCategory(attributes), getSubcategory(attributes), getName(attributes), 2));
+ break;
+ case BUTTON:
+ options.add(new ConfigButton(() -> ((CallablePropertyValue) option.getValue()).invoke(option.getInstance()), option.getInstance(), getName(attributes), getCategory(attributes), getSubcategory(attributes), 2, attributes.getPlaceholder().isEmpty() ? "Activate" : attributes.getPlaceholder()));
+ break;
+ }
+ if (attributes.getType() == PropertyType.SWITCH || attributes.getType() == PropertyType.CHECKBOX) {
+ optionNames.put(PropertyKt.fullPropertyPath(option.getAttributesExt()), options.get(options.size() - 1));
+ }
+ }
+ }
+
+ private Field getFieldOfProperty(PropertyData data) {
+ if (data.getValue() instanceof FieldBackedPropertyValue) {
+ FieldBackedPropertyValue fieldBackedPropertyValue = (FieldBackedPropertyValue) data.getValue();
+ try {
+ Field field = fieldBackedPropertyValue.getClass().getDeclaredField("field");
+ field.setAccessible(true);
+ return (Field) field.get(fieldBackedPropertyValue);
+ } catch (IllegalAccessException | NoSuchFieldException e) {
+ throw new RuntimeException(e);
+ }
+ } else if (data.getValue() instanceof ValueBackedPropertyValue) {
+ ValueBackedPropertyValue valueBackedPropertyValue = (ValueBackedPropertyValue) data.getValue();
+ try {
+ Field field = valueBackedPropertyValue.getClass().getDeclaredField("obj");
+ field.setAccessible(true);
+ return field;
+ } catch (NoSuchFieldException e) {
+ throw new RuntimeException(e);
+ }
+ } else if (data.getValue() instanceof KPropertyBackedPropertyValue) {
+ KPropertyBackedPropertyValue kPropertyBackedPropertyValue = (KPropertyBackedPropertyValue) data.getValue();
+ try {
+ Field field = kPropertyBackedPropertyValue.getClass().getDeclaredField("property");
+ field.setAccessible(true);
+ KMutableProperty0 property = (KMutableProperty0) field.get(kPropertyBackedPropertyValue);
+ return ReflectJvmMapping.getJavaField(property);
+ } catch (IllegalAccessException | NoSuchFieldException e) {
+ throw new RuntimeException(e);
+ }
+ } else throw new RuntimeException("Unknown property value type: " + data.getValue().getClass());
+ }
+
+ private String getName(PropertyAttributesExt ext) {
+ try {
+ PropertyAttributesExt.class.getDeclaredField("i18nName").setAccessible(true);
+ return Platform.getI18nPlatform().format((String) PropertyAttributesExt.class.getDeclaredField("i18nName").get(ext));
+ } catch (IllegalAccessException | NoSuchFieldException e) {
+ return ext.getName();
+ }
+ }
+
+ private String getCategory(PropertyAttributesExt ext) {
+ try {
+ PropertyAttributesExt.class.getDeclaredField("i18nCategory").setAccessible(true);
+ return Platform.getI18nPlatform().format((String) PropertyAttributesExt.class.getDeclaredField("i18nCategory").get(ext));
+ } catch (IllegalAccessException | NoSuchFieldException e) {
+ return ext.getCategory();
+ }
+ }
+
+ private String getSubcategory(PropertyAttributesExt ext) {
+ try {
+ PropertyAttributesExt.class.getDeclaredField("i18nSubcategory").setAccessible(true);
+ return Platform.getI18nPlatform().format((String) PropertyAttributesExt.class.getDeclaredField("i18nSubcategory").get(ext));
+ } catch (IllegalAccessException | NoSuchFieldException e) {
+ return ext.getSubcategory();
+ }
+ }
+
+ @SuppressWarnings("unused")
+ public void addDependency(PropertyData property, PropertyData dependency) {
+ BasicOption option = optionNames.get(PropertyKt.fullPropertyPath(property.getAttributesExt()));
+ if (option != null) {
+ option.addDependency(() -> Objects.equals(dependency.getValue().getValue(vigilant), true));
+ }
+ }
+
+ private static class CompatConfigColorElement extends ConfigColorElement {
+ private final Field color;
+ private Color prevColor = null;
+ private OneColor cachedColor = null;
+
+ public CompatConfigColorElement(Field color, Vigilant parent, String name, String category, String subcategory, int size) {
+ super(null, parent, name, category, subcategory, size, true);
+ this.color = color;
+ }
+
+ @Override
+ public Object get() throws IllegalAccessException {
+ Color currentColor = (Color) color.get(parent);
+ if (cachedColor == null || prevColor != color.get(parent)) {
+ cachedColor = new OneColor(currentColor);
+ }
+ prevColor = currentColor;
+ return cachedColor;
+ }
+
+ @Override
+ protected void setColor(OneColor color) {
+ if (cachedColor != color) {
+ Color newColor = new Color(color.getRGB(), true);
+ try {
+ this.color.set(parent, newColor);
+ } catch (IllegalAccessException ignored) {
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilanceName.java b/src/main/java/cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilanceName.java
new file mode 100644
index 0000000..ff84d3c
--- /dev/null
+++ b/src/main/java/cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilanceName.java
@@ -0,0 +1,16 @@
+package cc.polyfrost.oneconfig.internal.config.compatibility.vigilance;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface VigilanceName {
+ String name();
+
+ String category();
+
+ String subcategory();
+}
diff --git a/src/main/java/cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilantAccessor.java b/src/main/java/cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilantAccessor.java
new file mode 100644
index 0000000..f059dbc
--- /dev/null
+++ b/src/main/java/cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilantAccessor.java
@@ -0,0 +1,11 @@
+package cc.polyfrost.oneconfig.internal.config.compatibility.vigilance;
+
+import gg.essential.vigilance.data.PropertyCollector;
+
+/**
+ * Interface for accessing the {@link PropertyCollector} in a Vigilant config.
+ * <p>Not recommended for non-internal OneConfig usage, as Systemless will get really angry at us</p>
+ */
+public interface VigilantAccessor {
+ PropertyCollector getPropertyCollector();
+}
diff --git a/src/main/java/cc/polyfrost/oneconfig/internal/plugin/OneConfigMixinPlugin.java b/src/main/java/cc/polyfrost/oneconfig/internal/plugin/OneConfigMixinPlugin.java
index 0ef2c58..bc9dc7b 100644
--- a/src/main/java/cc/polyfrost/oneconfig/internal/plugin/OneConfigMixinPlugin.java
+++ b/src/main/java/cc/polyfrost/oneconfig/internal/plugin/OneConfigMixinPlugin.java
@@ -59,11 +59,11 @@ public class OneConfigMixinPlugin implements IMixinConfigPlugin {
* If anything here is changed, edit the corresponding method in OneConfigMixinPlugin!
*/
private void transform(ClassNode node) {
- if (!node.interfaces.contains("cc/polyfrost/oneconfig/config/compatibility/vigilance/VigilantAccessor")) {
+ if (!node.interfaces.contains("cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilantAccessor")) {
node.fields.add(new FieldNode(Opcodes.ACC_PUBLIC, "oneconfig$config", "Lcc/polyfrost/oneconfig/config/compatibility/vigilance/VigilanceConfig;", null, null));
node.fields.add(new FieldNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "oneconfig$file", Type.getDescriptor(File.class), null, null));
- node.interfaces.add("cc/polyfrost/oneconfig/config/compatibility/vigilance/VigilantAccessor");
+ node.interfaces.add("cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilantAccessor");
MethodNode methodNode = new MethodNode(Opcodes.ACC_PUBLIC, "getPropertyCollector", "()Lgg/essential/vigilance/data/PropertyCollector;", null, null);
LabelNode labelNode = new LabelNode();
methodNode.instructions.add(labelNode);
@@ -90,7 +90,7 @@ public class OneConfigMixinPlugin implements IMixinConfigPlugin {
methodNode2.instructions.add(new FieldInsnNode(Opcodes.GETFIELD, "gg/essential/vigilance/Vigilant", "oneconfig$config", "Lcc/polyfrost/oneconfig/config/compatibility/vigilance/VigilanceConfig;"));
methodNode2.instructions.add(new VarInsnNode(Opcodes.ALOAD, 1));
methodNode2.instructions.add(new VarInsnNode(Opcodes.ALOAD, 2));
- methodNode2.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "cc/polyfrost/oneconfig/config/compatibility/vigilance/VigilanceConfig", "addDependency", "(Lgg/essential/vigilance/data/PropertyData;Lgg/essential/vigilance/data/PropertyData;)V", false));
+ methodNode2.instructions.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "cc/polyfrost/oneconfig/internal/config/compatibility/vigilance/VigilanceConfig", "addDependency", "(Lgg/essential/vigilance/data/PropertyData;Lgg/essential/vigilance/data/PropertyData;)V", false));
methodNode2.instructions.add(labelNode4);
methodNode2.instructions.add(new LineNumberNode(15636438, labelNode4));