Add multiple choice settings keys

This commit is contained in:
johni0702
2015-11-07 22:04:00 +01:00
parent 3f78b7218f
commit 08be4f0a81
2 changed files with 65 additions and 5 deletions

View File

@@ -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<T> extends SettingKey<T> {
List<T> getChoices();
}
public static class SettingKeys<T> implements SettingKey<T> {
private final String category;
private final String key;
@@ -130,4 +131,21 @@ public class SettingsRegistry {
return defaultValue;
}
}
public static class MultipleChoiceSettingKeys<T> extends SettingKeys<T> implements MultipleChoiceSettingKey<T> {
private List<T> choices = Collections.emptyList();
public MultipleChoiceSettingKeys(String category, String key, String displayString, T defaultValue) {
super(category, key, displayString, defaultValue);
}
public void setChoices(List<T> choices) {
this.choices = Collections.unmodifiableList(choices);
}
@Override
public List<T> getChoices() {
return choices;
}
}
}

View File

@@ -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<GuiReplaySettings> {
public GuiReplaySettings(final net.minecraft.client.gui.GuiScreen parent, final SettingsRegistry settingsRegistry) {
@@ -45,6 +50,32 @@ public class GuiReplaySettings extends AbstractGuiScreen<GuiReplaySettings> {
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<MultipleChoiceDropdownEntry> menu =
new GuiDropdownMenu<MultipleChoiceDropdownEntry>().setSize(150, 20).setValues(entries);
menu.setSelected(selected).onSelection(new Consumer<Integer>() {
@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<GuiReplaySettings> {
protected GuiReplaySettings getThis() {
return this;
}
@RequiredArgsConstructor
private static class MultipleChoiceDropdownEntry {
private final Object value;
private final String text;
@Override
public String toString() {
return text;
}
}
}