diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java index 0fb461efc1..b704ec0f08 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigItem.java @@ -69,13 +69,6 @@ boolean parse() default false; - /** - * For Config items that have a value of multiple enums, - * - * @return the number of rows that are display in the item without having to scroll. - */ - int displayRows() default 2; - Class clazz() default void.class; String method() default ""; diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java index 076bb9234e..8b65b580c7 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java @@ -534,7 +534,14 @@ static Object stringToObject(String str, Class type) EnumSet enumSet = EnumSet.noneOf(enumClass); for (String s : splitStr) { - enumSet.add(Enum.valueOf(enumClass, s.replace("[", "").replace("]", ""))); + try + { + enumSet.add(Enum.valueOf(enumClass, s.replace("[", "").replace("]", ""))); + } + catch (IllegalArgumentException ignore) + { + return EnumSet.noneOf(enumClass); + } } return enumSet; } @@ -617,6 +624,11 @@ static String objectToString(Object object) } if (object instanceof EnumSet) { + if (((EnumSet) object).size() == 0) + { + return getElementType((EnumSet) object).getCanonicalName() + "{}"; + } + return ((EnumSet) object).toArray()[0].getClass().getCanonicalName() + "{" + object.toString() + "}"; } if (object instanceof Number) @@ -626,6 +638,15 @@ static String objectToString(Object object) return object.toString(); } + public static > Class getElementType(EnumSet enumSet) + { + if (enumSet.isEmpty()) + { + enumSet = EnumSet.complementOf(enumSet); + } + return enumSet.iterator().next().getDeclaringClass(); + } + public void sendConfig() { boolean changed; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java index 15e297652b..2903bdfcdb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPanel.java @@ -26,11 +26,11 @@ import com.google.common.base.Splitter; import com.google.common.base.Strings; -import com.google.common.collect.Lists; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; +import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; @@ -65,7 +65,6 @@ import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JToggleButton; -import javax.swing.ListSelectionModel; import javax.swing.ScrollPaneConstants; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; @@ -361,7 +360,6 @@ else if (parentSection != null) } - private Boolean parse(ConfigItem item, String value) { try @@ -843,9 +841,6 @@ public void focusLost(FocusEvent e) } else if (cid.getType() == EnumSet.class) { - - int displayRows = cid.getItem().displayRows(); - Class enumType = cid.getItem().enumClass(); EnumSet enumSet = configManager.getConfiguration(cd.getGroup().value(), @@ -854,37 +849,25 @@ else if (cid.getType() == EnumSet.class) { enumSet = EnumSet.noneOf(enumType); } - JList jList = new JList(enumType.getEnumConstants()); - jList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - if (!enumSet.isEmpty() && enumSet.size() > 1) - { - int[] selected = new int[enumSet.size()]; - for (int i = 0; i < enumSet.size(); i++) - { - if (enumSet.contains(EnumSet.allOf(enumType).toArray()[i])) - { - selected[i] = Lists.newArrayList(EnumSet.allOf(enumType)).indexOf(enumSet.toArray()[i]); - } - } - jList.setSelectedIndices(selected); - } - if (enumSet.size() == 1) + JPanel enumsetLayout = new JPanel(new GridLayout(0, 2)); + List jcheckboxes = new ArrayList<>(); + + for (Object obj : enumType.getEnumConstants()) { - enumSet.forEach(anObject -> jList.setSelectedValue(anObject, true)); + String option = String.valueOf(obj).toLowerCase().replace("_", " "); + + JCheckBox checkbox = new JCheckBox(option); + checkbox.setBackground(ColorScheme.LIGHT_GRAY_COLOR); + checkbox.setSelected(enumSet.contains(obj)); + jcheckboxes.add(checkbox); + + enumsetLayout.add(checkbox); } - jList.setVisibleRowCount(displayRows); - jList.setPrototypeCellValue("XXXXXXXXXX"); - jList.setCellRenderer(new ComboBoxListRenderer()); - jList.setLayoutOrientation(JList.VERTICAL); - jList.setSelectionBackground(Color.decode("708090")); - jList.addListSelectionListener(e -> changeConfiguration(jList, cd, cid)); - JScrollPane jScrollPane = new JScrollPane(); - jScrollPane.setViewportView(jList); - jScrollPane.setViewportBorder(BorderFactory.createLoweredSoftBevelBorder()); - - item.add(jScrollPane, BorderLayout.SOUTH); + jcheckboxes.forEach(checkbox -> checkbox.addActionListener(ae -> changeConfiguration(jcheckboxes, cd, cid))); + + item.add(enumsetLayout, BorderLayout.SOUTH); } JPanel titleSection = titleSectionWidgets.get(cid.getItem().titleSection()); @@ -938,6 +921,32 @@ else if (section != null) revalidate(); } + private void changeConfiguration(List components, ConfigDescriptor cd, ConfigItemDescriptor cid) + { + Class enumType = cid.getItem().enumClass(); + EnumSet enumSet = configManager.getConfiguration(cd.getGroup().value(), + cid.getItem().keyName(), EnumSet.class); + if (enumSet == null) + { + //noinspection unchecked + enumSet = EnumSet.noneOf(enumType); + } + enumSet.clear(); + + EnumSet finalEnumSet = enumSet; + + //noinspection unchecked + components.forEach(value -> + { + if (value.isSelected()) + { + finalEnumSet.add(Enum.valueOf(cid.getItem().enumClass(), String.valueOf(value.getText()).toUpperCase().replace(" ", "_"))); + } + }); + + configManager.setConfiguration(cd.getGroup().value(), cid.getItem().keyName(), finalEnumSet); + } + private void changeConfiguration(Component component, ConfigDescriptor cd, ConfigItemDescriptor cid) { final ConfigItem configItem = cid.getItem(); @@ -985,27 +994,6 @@ else if (component instanceof JComboBox) JComboBox jComboBox = (JComboBox) component; configManager.setConfiguration(cd.getGroup().value(), cid.getItem().keyName(), ((Enum) jComboBox.getSelectedItem()).name()); } - else if (component instanceof JList) - { - JList jList = (JList) component; - - Class enumType = cid.getItem().enumClass(); - EnumSet enumSet = configManager.getConfiguration(cd.getGroup().value(), - cid.getItem().keyName(), EnumSet.class); - if (enumSet == null) - { - //noinspection unchecked - enumSet = EnumSet.noneOf(enumType); - } - enumSet.clear(); - - EnumSet finalEnumSet = enumSet; - //noinspection unchecked - jList.getSelectedValuesList().forEach(value -> - finalEnumSet.add(Enum.valueOf(cid.getItem().enumClass(), value.toString()))); - - configManager.setConfiguration(cd.getGroup().value(), cid.getItem().keyName(), finalEnumSet); - } else if (component instanceof HotkeyButton) { HotkeyButton hotkeyButton = (HotkeyButton) component; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java index 0db196ad3f..a626932d9a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/playerindicators/PlayerIndicatorsPlugin.java @@ -482,42 +482,60 @@ private void updateConfig() if (this.highlightOwnPlayer) { relationColorHashMap.put(PlayerRelation.SELF, config.getOwnPlayerColor()); - locationHashMap.put(PlayerRelation.SELF, EnumSet.copyOf(config.selfIndicatorModes()).toArray()); + if (config.selfIndicatorModes() != null) + { + locationHashMap.put(PlayerRelation.SELF, EnumSet.copyOf(config.selfIndicatorModes()).toArray()); + } } this.highlightFriends = config.highlightFriends(); if (this.highlightFriends) { relationColorHashMap.put(PlayerRelation.FRIEND, config.getFriendColor()); - locationHashMap.put(PlayerRelation.FRIEND, config.friendIndicatorMode().toArray()); + if (config.friendIndicatorMode() != null) + { + locationHashMap.put(PlayerRelation.FRIEND, config.friendIndicatorMode().toArray()); + } } this.highlightClan = config.highlightClan(); if (this.highlightClan) { relationColorHashMap.put(PlayerRelation.CLAN, config.getClanColor()); - locationHashMap.put(PlayerRelation.CLAN, config.clanIndicatorModes().toArray()); + if (config.clanIndicatorModes() != null) + { + locationHashMap.put(PlayerRelation.CLAN, config.clanIndicatorModes().toArray()); + } } this.highlightTeam = config.highlightTeamMembers(); if (this.highlightTeam) { relationColorHashMap.put(PlayerRelation.TEAM, config.getTeamcolor()); - locationHashMap.put(PlayerRelation.TEAM, config.teamIndicatorModes().toArray()); + if (config.teamIndicatorModes() != null) + { + locationHashMap.put(PlayerRelation.TEAM, config.teamIndicatorModes().toArray()); + } } this.highlightOther = config.highlightOtherPlayers(); if (this.highlightOther) { relationColorHashMap.put(PlayerRelation.OTHER, config.getOtherColor()); - locationHashMap.put(PlayerRelation.OTHER, EnumSet.copyOf(config.otherIndicatorModes()).toArray()); + if (config.otherIndicatorModes() != null) + { + locationHashMap.put(PlayerRelation.OTHER, EnumSet.copyOf(config.otherIndicatorModes()).toArray()); + } } this.highlightTargets = config.highlightTargets(); if (this.highlightTargets) { relationColorHashMap.put(PlayerRelation.TARGET, config.getTargetsColor()); - locationHashMap.put(PlayerRelation.TARGET, config.targetsIndicatorModes().toArray()); + if (config.targetsIndicatorModes() != null) + { + locationHashMap.put(PlayerRelation.TARGET, config.targetsIndicatorModes().toArray()); + } } this.highlightCallers = config.highlightCallers(); @@ -527,7 +545,10 @@ private void updateConfig() this.configCallers = config.callers(); relationColorHashMap.put(PlayerRelation.CALLER, config.callerColor()); - locationHashMap.put(PlayerRelation.CALLER, config.callerHighlightOptions().toArray()); + if (config.callerHighlightOptions() != null) + { + locationHashMap.put(PlayerRelation.CALLER, config.callerHighlightOptions().toArray()); + } getCallerList(); } @@ -535,7 +556,10 @@ private void updateConfig() if (this.highlightCallerTargets) { relationColorHashMap.put(PlayerRelation.CALLER_TARGET, config.callerTargetColor()); - locationHashMap.put(PlayerRelation.CALLER_TARGET, config.callerTargetHighlightOptions().toArray()); + if (config.callerTargetHighlightOptions() != null) + { + locationHashMap.put(PlayerRelation.CALLER_TARGET, config.callerTargetHighlightOptions().toArray()); + } } this.showClanRanks = config.showClanRanks();