diff --git a/src/main/java/com/replaymod/core/SettingsRegistry.java b/src/main/java/com/replaymod/core/SettingsRegistry.java index 6cb0f234..a6a1bf82 100644 --- a/src/main/java/com/replaymod/core/SettingsRegistry.java +++ b/src/main/java/com/replaymod/core/SettingsRegistry.java @@ -5,10 +5,7 @@ import net.minecraftforge.common.config.Configuration; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class SettingsRegistry { @@ -97,6 +94,10 @@ public class SettingsRegistry { T getDefault(); } + public interface MultipleChoiceSettingKey extends SettingKey { + List getChoices(); + } + public static class SettingKeys implements SettingKey { private final String category; private final String key; @@ -130,4 +131,21 @@ public class SettingsRegistry { return defaultValue; } } + + public static class MultipleChoiceSettingKeys extends SettingKeys implements MultipleChoiceSettingKey { + private List choices = Collections.emptyList(); + + public MultipleChoiceSettingKeys(String category, String key, String displayString, T defaultValue) { + super(category, key, displayString, defaultValue); + } + + public void setChoices(List choices) { + this.choices = Collections.unmodifiableList(choices); + } + + @Override + public List getChoices() { + return choices; + } + } } diff --git a/src/main/java/com/replaymod/core/gui/GuiReplaySettings.java b/src/main/java/com/replaymod/core/gui/GuiReplaySettings.java index 90e3d150..a4621a7c 100644 --- a/src/main/java/com/replaymod/core/gui/GuiReplaySettings.java +++ b/src/main/java/com/replaymod/core/gui/GuiReplaySettings.java @@ -1,17 +1,22 @@ package com.replaymod.core.gui; +import com.replaymod.core.SettingsRegistry; import de.johni0702.minecraft.gui.container.AbstractGuiScreen; import de.johni0702.minecraft.gui.container.GuiPanel; import de.johni0702.minecraft.gui.element.GuiButton; import de.johni0702.minecraft.gui.element.GuiElement; import de.johni0702.minecraft.gui.element.GuiLabel; import de.johni0702.minecraft.gui.element.GuiToggleButton; +import de.johni0702.minecraft.gui.element.advanced.GuiDropdownMenu; import de.johni0702.minecraft.gui.layout.CustomLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.VerticalLayout; -import com.replaymod.core.SettingsRegistry; +import de.johni0702.minecraft.gui.utils.Consumer; +import lombok.RequiredArgsConstructor; import net.minecraft.client.resources.I18n; +import java.util.List; + public class GuiReplaySettings extends AbstractGuiScreen { public GuiReplaySettings(final net.minecraft.client.gui.GuiScreen parent, final SettingsRegistry settingsRegistry) { @@ -45,6 +50,32 @@ public class GuiReplaySettings extends AbstractGuiScreen { settingsRegistry.save(); } }); + } else if (key instanceof SettingsRegistry.MultipleChoiceSettingKey) { + final SettingsRegistry.MultipleChoiceSettingKey multipleChoiceKey = + (SettingsRegistry.MultipleChoiceSettingKey) key; + List values = multipleChoiceKey.getChoices(); + MultipleChoiceDropdownEntry[] entries = new MultipleChoiceDropdownEntry[values.size()]; + int selected = 0; + Object currentValue = settingsRegistry.get(multipleChoiceKey); + for (int j = 0; j < entries.length; j++) { + Object value = values.get(j); + entries[j] = new MultipleChoiceDropdownEntry(value, + multipleChoiceKey.getDisplayString() + ": " + I18n.format(value.toString())); + if (currentValue.equals(value)) { + selected = j; + } + } + final GuiDropdownMenu menu = + new GuiDropdownMenu().setSize(150, 20).setValues(entries); + menu.setSelected(selected).onSelection(new Consumer() { + @Override + public void consume(Integer obj) { + settingsRegistry.set((SettingsRegistry.SettingKey) multipleChoiceKey, + menu.getSelectedValue().value); + settingsRegistry.save(); + } + }); + element = menu; } else { throw new IllegalArgumentException("Type " + key.getDefault().getClass() + " not supported."); } @@ -72,4 +103,15 @@ public class GuiReplaySettings extends AbstractGuiScreen { protected GuiReplaySettings getThis() { return this; } + + @RequiredArgsConstructor + private static class MultipleChoiceDropdownEntry { + private final Object value; + private final String text; + + @Override + public String toString() { + return text; + } + } }