Add option parenting, gate changes to sub-options when parent option is off

This commit is contained in:
embeddedt 2023-07-28 21:04:53 -04:00
parent c7b6a9ed9e
commit f036350b0a
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
3 changed files with 43 additions and 17 deletions

View File

@ -128,21 +128,8 @@ public class ModernFixEarlyConfig {
mixinsMissingMods.put(mixinClassName, requiredModId);
else if(isClientOnly && !ModernFixPlatformHooks.INSTANCE.isClient())
mixinsMissingMods.put(mixinClassName, "[not client]");
List<String> mixinOptionNames = dotSplitter.splitToList(mixinClassName);
StringBuilder optionBuilder = new StringBuilder(mixinClassName.length());
optionBuilder.append("mixin");
// mixin.core, mixin.safety can be top-level, everything else must have a subcategory
boolean allowTopLevel;
if(mixinOptionNames.size() > 0)
allowTopLevel = mixinOptionNames.get(0).equals("core") || mixinOptionNames.get(0).equals("safety");
else
allowTopLevel = false;
for(int i = 0; i < mixinOptionNames.size() - 1; i++) {
optionBuilder.append('.');
optionBuilder.append(mixinOptionNames.get(i));
if(i > 0 || allowTopLevel)
mixinOptions.add(optionBuilder.toString());
}
String mixinCategoryName = "mixin." + mixinClassName.substring(0, mixinClassName.lastIndexOf('.'));
mixinOptions.add(mixinCategoryName);
}
} catch(IOException e) {
ModernFix.LOGGER.error("Error scanning file " + mixinPath, e);
@ -202,6 +189,17 @@ public class ModernFixEarlyConfig {
this.options.putIfAbsent(optionName, option);
this.optionsByCategory.put(OptionCategories.getCategoryForOption(optionName), option);
}
for(Map.Entry<String, Option> entry : this.options.entrySet()) {
int idx = entry.getKey().lastIndexOf('.');
if(idx <= 0)
continue;
String potentialParentKey = entry.getKey().substring(0, idx);
Option potentialParent = this.options.get(potentialParentKey);
if(potentialParent != null) {
System.out.println(potentialParentKey + " -> " + entry.getKey());
entry.getValue().setParent(potentialParent);
}
}
// Defines the default rules which can be configured by the user or other mods.
// You must manually add a rule for any new mixins not covered by an existing package rule.
this.addMixinRule("launch.class_search_cache", true);

View File

@ -11,6 +11,7 @@ public class Option {
private Set<String> modDefined = null;
private boolean enabled;
private boolean userDefined;
private Option parent = null;
public Option(String name, boolean enabled, boolean userDefined) {
this.name = name;
@ -37,10 +38,26 @@ public class Option {
this.modDefined.add(modId);
}
public void setParent(Option option) {
this.parent = option;
}
public Option getParent() {
return this.parent;
}
public boolean isEnabled() {
return this.enabled;
}
/**
* Checks if this option will effectively be disabled (regardless of its own status)
* by the parent rule being disabled.
*/
public boolean isEffectivelyDisabledByParent() {
return this.parent != null && (!this.parent.enabled || this.parent.isEffectivelyDisabledByParent());
}
public boolean isOverridden() {
return this.isUserDefined() || this.isModDefined();
}

View File

@ -40,6 +40,13 @@ public class OptionList extends ContainerObjectSelectionList<OptionList.Entry> {
return baseComponent;
}
public void updateOptionEntryStatuses() {
for(Entry e : this.children()) {
if(e instanceof OptionEntry) {
((OptionEntry)e).updateStatus();
}
}
}
public OptionList(ModernFixConfigScreen arg, Minecraft arg2) {
super(arg2,arg.width + 45, arg.height, 43, arg.height - 32, 20);
@ -128,6 +135,7 @@ public class OptionList extends ContainerObjectSelectionList<OptionList.Entry> {
this.option.setEnabled(!this.option.isEnabled(), !this.option.isUserDefined());
ModernFix.LOGGER.error("Unable to save config", e);
}
OptionList.this.updateOptionEntryStatuses();
}, (btn, gfx, x, y) -> {
if(this.option.isModDefined()) {
String disablingMods = String.join(", ", this.option.getDefiningMods());
@ -140,8 +148,7 @@ public class OptionList extends ContainerObjectSelectionList<OptionList.Entry> {
);
}
});
if(this.option.isModDefined())
this.toggleButton.active = false;
updateStatus();
this.helpButton = new Button(75, 0, 20, 20, new TextComponent("?"), (arg) -> {
Minecraft.getInstance().setScreen(new ModernFixOptionInfoScreen(mainScreen, optionName));
});
@ -152,6 +159,10 @@ public class OptionList extends ContainerObjectSelectionList<OptionList.Entry> {
}
}
void updateStatus() {
this.toggleButton.active = !(this.option.isModDefined() || this.option.isEffectivelyDisabledByParent());
}
@Override
public void render(PoseStack matrixStack, int index, int top, int left, int width, int height, int mouseX, int mouseY, boolean isMouseOver, float partialTicks) {
MutableComponent nameComponent = getOptionComponent(this.name);