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 91d97920bf..a2356c2676 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 @@ -24,7 +24,6 @@ */ package net.runelite.client.plugins.config; -import com.google.common.base.MoreObjects; import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.common.collect.ComparisonChain; @@ -53,11 +52,14 @@ import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.TreeMap; import java.util.function.Consumer; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.swing.BorderFactory; import javax.swing.BoxLayout; @@ -80,7 +82,6 @@ import javax.swing.JSpinner; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ListCellRenderer; -import javax.swing.ListSelectionModel; import javax.swing.ScrollPaneConstants; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; @@ -130,7 +131,6 @@ import net.runelite.client.util.ImageUtil; import net.runelite.client.util.LinkBrowser; import net.runelite.client.util.SwingUtil; import net.runelite.client.util.Text; -import org.apache.commons.lang3.ArrayUtils; @Slf4j class ConfigPanel extends PluginPanel @@ -935,32 +935,31 @@ class ConfigPanel extends PluginPanel return button; } - private JList> createList(ConfigDescriptor cd, ConfigItemDescriptor cid) + private JPanel createList(ConfigDescriptor cd, ConfigItemDescriptor cid) { ParameterizedType parameterizedType = (ParameterizedType) cid.getType(); Class type = (Class) parameterizedType.getActualTypeArguments()[0]; Set set = configManager.getConfiguration(cd.getGroup().value(), null, - cid.getItem().keyName(), parameterizedType); + cid.getItem().keyName(), parameterizedType); - JList> list = new JList>(type.getEnumConstants()); // NOPMD: UseDiamondOperator - list.setCellRenderer(listCellRenderer); - list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - list.setLayoutOrientation(JList.VERTICAL); - list.setSelectedIndices( - MoreObjects.firstNonNull(set, Collections.emptySet()) - .stream() - .mapToInt(e -> ArrayUtils.indexOf(type.getEnumConstants(), e)) - .toArray()); - list.addFocusListener(new FocusAdapter() + JPanel enumsetLayout = new JPanel(new GridLayout(0, 2)); + List jcheckboxes = new ArrayList<>(); + + Set selectedItems = new HashSet(Objects.requireNonNullElse(set, Collections.emptySet())); + + for (Object obj : type.getEnumConstants()) { - @Override - public void focusLost(FocusEvent e) - { - changeConfiguration(list, cd, cid); - } - }); + ToggleButton checkbox = new ToggleButton(obj); + checkbox.setBackground(ColorScheme.DARK_GRAY_COLOR); + checkbox.setSelected(selectedItems.contains(obj)); + jcheckboxes.add(checkbox); - return list; + enumsetLayout.add(checkbox); + } + + jcheckboxes.forEach(checkbox -> checkbox.addActionListener(ae -> changeConfiguration(jcheckboxes, cd, cid))); + + return enumsetLayout; } private JPanel createEnumSetLayout(ConfigDescriptor cd, ConfigItemDescriptor cid) @@ -975,13 +974,13 @@ class ConfigPanel extends PluginPanel } JPanel enumsetLayout = new JPanel(new GridLayout(0, 2)); - List jcheckboxes = new ArrayList<>(); + List jcheckboxes = new ArrayList<>(); for (Object obj : enumType.getEnumConstants()) { String option = Text.titleCase((Enum) obj); - JCheckBox checkbox = new ToggleButton(option); + ToggleButton checkbox = new ToggleButton(option); checkbox.setBackground(ColorScheme.DARK_GRAY_COLOR); checkbox.setSelected(enumSet.toString().contains(String.valueOf(obj))); jcheckboxes.add(checkbox); @@ -1031,22 +1030,32 @@ class ConfigPanel extends PluginPanel } } - private void changeConfiguration(List components, ConfigDescriptor cd, ConfigItemDescriptor cid) + private void changeConfiguration(List components, ConfigDescriptor cd, ConfigItemDescriptor cid) { - EnumSet enumSet = EnumSet.noneOf(cid.getItem().enumClass()); - - //noinspection unchecked - components.forEach(value -> + if (cid.getItem().enumClass() != Enum.class) { - if (value.isSelected()) + EnumSet enumSet = EnumSet.noneOf(cid.getItem().enumClass()); + + //noinspection unchecked + components.forEach(value -> { - enumSet.add(Enum.valueOf(cid.getItem().enumClass(), String.valueOf(value.getText()).toUpperCase().replace(" ", "_"))); - } - }); + if (value.isSelected()) + { + enumSet.add(Enum.valueOf(cid.getItem().enumClass(), String.valueOf(value.getText()).toUpperCase().replace(" ", "_"))); + } + }); - configManager.setConfiguration(cd.getGroup().value(), cid.getItem().keyName(), enumSet); - - rebuild(); + configManager.setConfiguration(cd.getGroup().value(), cid.getItem().keyName(), enumSet); + } + else + { + Set values = components + .stream() + .filter(ToggleButton::isSelected) + .map(ToggleButton::getObject) + .collect(Collectors.toSet()); + configManager.setConfiguration(cd.getGroup().value(), cid.getItem().keyName(), values); + } } private void changeConfiguration(Component component, ConfigDescriptor cd, ConfigItemDescriptor cid) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/components/ToggleButton.java b/runelite-client/src/main/java/net/runelite/client/ui/components/ToggleButton.java index f6a7007d26..d0c028b2ff 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/components/ToggleButton.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/components/ToggleButton.java @@ -31,6 +31,7 @@ import javax.swing.JCheckBox; import net.runelite.client.ui.ColorScheme; import net.runelite.client.util.ImageUtil; import net.runelite.client.util.SwingUtil; +import net.runelite.client.util.Text; public class ToggleButton extends JCheckBox { @@ -38,6 +39,8 @@ public class ToggleButton extends JCheckBox private static final ImageIcon OFF_SWITCHER; private static final ImageIcon DISABLED_SWITCHER; + private final Object object; + static { BufferedImage onSwitcher = ImageUtil.loadImageResource(ToggleButton.class, "switcher_on.png"); @@ -63,6 +66,8 @@ public class ToggleButton extends JCheckBox public ToggleButton() { super(OFF_SWITCHER); + this.object = null; + setSelectedIcon(ON_SWITCHER); setDisabledIcon(DISABLED_SWITCHER); SwingUtil.removeButtonDecorations(this); @@ -71,8 +76,25 @@ public class ToggleButton extends JCheckBox public ToggleButton(String text) { super(text, OFF_SWITCHER, false); + this.object = null; + setSelectedIcon(ON_SWITCHER); setDisabledIcon(DISABLED_SWITCHER); SwingUtil.removeButtonDecorations(this); } + + public ToggleButton(Object object) + { + super(Text.titleCase((Enum) object), OFF_SWITCHER, false); + this.object = object; + + setSelectedIcon(ON_SWITCHER); + setDisabledIcon(DISABLED_SWITCHER); + SwingUtil.removeButtonDecorations(this); + } + + public Object getObject() + { + return this.object; + } }