diff --git a/src/main/java/net/coderbot/iris/gui/element/widget/ProfileElementWidget.java b/src/main/java/net/coderbot/iris/gui/element/widget/ProfileElementWidget.java index 1e1310d6a..d3cc7a651 100644 --- a/src/main/java/net/coderbot/iris/gui/element/widget/ProfileElementWidget.java +++ b/src/main/java/net/coderbot/iris/gui/element/widget/ProfileElementWidget.java @@ -8,6 +8,7 @@ import net.coderbot.iris.shaderpack.option.OptionSet; import net.coderbot.iris.shaderpack.option.Profile; import net.coderbot.iris.shaderpack.option.ProfileSet; import net.coderbot.iris.shaderpack.option.menu.OptionMenuProfileElement; +import net.coderbot.iris.shaderpack.option.menu.ProfileElementTracker; import net.coderbot.iris.shaderpack.option.values.OptionValues; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.I18n; @@ -30,6 +31,7 @@ public class ProfileElementWidget extends BaseOptionElementWidget profileName = result.current.map(p -> p.name); - this.profileLabel = profileName.map(name -> GuiUtil.translateOrDefault(name, "profile." + name)).orElse(PROFILE_CUSTOM); + String translationKey = "profile" + (secondProfileSet ? "2." : ".") + profileName.orElse("custom"); + this.profileLabel = profileName.map(name -> GuiUtil.translateOrDefault(name, translationKey)).orElse(PROFILE_CUSTOM); } @Override @@ -63,7 +66,7 @@ public class ProfileElementWidget extends BaseOptionElementWidget sliderOptions = new ArrayList<>(); @Getter private final Map> profiles = new LinkedHashMap<>(); + @Getter private final Map> profiles2 = new LinkedHashMap<>(); private List mainScreenOptions = null; @Getter private final Map> subScreenOptions = new HashMap<>(); private Integer mainScreenColumnCount = null; @@ -517,6 +518,7 @@ public class ShaderProperties { // the last definition being used, should be tested if behavior matches OptiFine handleWhitespacedListDirective(key, value, "sliders", sliders -> sliderOptions = sliders); handlePrefixedWhitespacedListDirective("profile.", key, value, profiles::put); + handlePrefixedWhitespacedListDirective("profile2.", key, value, profiles2::put); if (handleIntDirective(key, value, "screen.columns", columns -> mainScreenColumnCount = columns)) { return; diff --git a/src/main/java/net/coderbot/iris/shaderpack/option/menu/OptionMenuContainer.java b/src/main/java/net/coderbot/iris/shaderpack/option/menu/OptionMenuContainer.java index fa4712978..7f9b21821 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/option/menu/OptionMenuContainer.java +++ b/src/main/java/net/coderbot/iris/shaderpack/option/menu/OptionMenuContainer.java @@ -1,6 +1,7 @@ package net.coderbot.iris.shaderpack.option.menu; import com.google.common.collect.Lists; +import lombok.Getter; import net.coderbot.iris.Iris; import net.coderbot.iris.shaderpack.ShaderProperties; import net.coderbot.iris.shaderpack.option.ProfileSet; @@ -21,10 +22,12 @@ public class OptionMenuContainer { private final List usedOptions = new ArrayList<>(); private final List unusedOptions = new ArrayList<>(); // To be used when screens contain a "*" element private final Map, Integer> unusedOptionDumpQueue = new HashMap<>(); // Used by screens with "*" element - private final ProfileSet profiles; + @Getter private final ProfileSet profiles; + @Getter private final ProfileSet profiles2; public OptionMenuContainer(ShaderProperties shaderProperties, ShaderPackOptions shaderPackOptions, ProfileSet profiles) { this.profiles = profiles; + this.profiles2 = ProfileSet.fromTree(shaderProperties.getProfiles2(), shaderPackOptions.getOptionSet()); // note: if the Shader Pack does not provide a list of options for the main screen, then dump all options on to // the main screen by default. @@ -68,10 +71,6 @@ public class OptionMenuContainer { } } - public ProfileSet getProfiles() { - return profiles; - } - // Screens will call this when they contain a "*" element, so that the list of // unused options can be added after all other screens have been resolved public void queueForUnusedOptionDump(int index, List elementList) { diff --git a/src/main/java/net/coderbot/iris/shaderpack/option/menu/OptionMenuElement.java b/src/main/java/net/coderbot/iris/shaderpack/option/menu/OptionMenuElement.java index 1e784534f..7b81d0d49 100644 --- a/src/main/java/net/coderbot/iris/shaderpack/option/menu/OptionMenuElement.java +++ b/src/main/java/net/coderbot/iris/shaderpack/option/menu/OptionMenuElement.java @@ -12,6 +12,7 @@ public abstract class OptionMenuElement { private static final String ELEMENT_EMPTY = ""; private static final String ELEMENT_PROFILE = ""; + private static final String ELEMENT_PROFILE2 = ""; public static OptionMenuElement create(String elementString, OptionMenuContainer container, ShaderProperties shaderProperties, ShaderPackOptions shaderPackOptions) throws IllegalArgumentException { // Empty element @@ -24,6 +25,13 @@ public abstract class OptionMenuElement { // null indicates that the element should be forgotten (not treated as empty) return container.getProfiles().size() > 0 ? new OptionMenuProfileElement(container.getProfiles(), shaderPackOptions.getOptionSet(), shaderPackOptions.getOptionValues()) : null; } + // Second profile element + if (ELEMENT_PROFILE2.equals(elementString)) { + // null indicates that the element should be forgotten (not treated as empty) + return container.getProfiles2().size() > 0 + ? ProfileElementTracker.markSecondProfileSet(new OptionMenuProfileElement(container.getProfiles2(), shaderPackOptions.getOptionSet(), shaderPackOptions.getOptionValues())) + : null; + } // Link to sub screen element if (elementString.startsWith("[") && elementString.endsWith("]")) { return new OptionMenuLinkElement(elementString.substring(1, elementString.length() - 1)); diff --git a/src/main/java/net/coderbot/iris/shaderpack/option/menu/ProfileElementTracker.java b/src/main/java/net/coderbot/iris/shaderpack/option/menu/ProfileElementTracker.java new file mode 100644 index 000000000..f5cc37000 --- /dev/null +++ b/src/main/java/net/coderbot/iris/shaderpack/option/menu/ProfileElementTracker.java @@ -0,0 +1,22 @@ +package net.coderbot.iris.shaderpack.option.menu; + +import java.util.Collections; +import java.util.Set; +import java.util.WeakHashMap; + +public final class ProfileElementTracker { + private static final Set SECOND_PROFILE_ELEMENTS = + Collections.newSetFromMap(new WeakHashMap<>()); + + private ProfileElementTracker() { + } + + public static T markSecondProfileSet(T element) { + SECOND_PROFILE_ELEMENTS.add(element); + return element; + } + + public static boolean isSecondProfileSet(Object element) { + return SECOND_PROFILE_ELEMENTS.contains(element); + } +}