config panel: add ability to pin plugins to the top

This commit is contained in:
takuyakanbr
2018-06-25 01:49:25 +08:00
parent 22bc73b9ab
commit be281e3d64
4 changed files with 86 additions and 13 deletions

View File

@@ -38,9 +38,12 @@ import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
@@ -68,6 +71,7 @@ import lombok.extern.slf4j.Slf4j;
import net.runelite.client.config.ChatColorConfig; import net.runelite.client.config.ChatColorConfig;
import net.runelite.client.config.Config; import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigDescriptor; import net.runelite.client.config.ConfigDescriptor;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem; import net.runelite.client.config.ConfigItem;
import net.runelite.client.config.ConfigItemDescriptor; import net.runelite.client.config.ConfigItemDescriptor;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
@@ -89,6 +93,8 @@ public class ConfigPanel extends PluginPanel
private static final int SPINNER_FIELD_WIDTH = 6; private static final int SPINNER_FIELD_WIDTH = 6;
private static final ImageIcon SEARCH; private static final ImageIcon SEARCH;
private static final String RUNELITE_GROUP_NAME = RuneLiteConfig.class.getAnnotation(ConfigGroup.class).keyName();
private static final String PINNED_PLUGINS_CONFIG_KEY = "pinnedPlugins";
private static final String RUNELITE_PLUGIN = "RuneLite"; private static final String RUNELITE_PLUGIN = "RuneLite";
private static final String CHAT_COLOR_PLUGIN = "Chat Color"; private static final String CHAT_COLOR_PLUGIN = "Chat Color";
@@ -162,6 +168,8 @@ public class ConfigPanel extends PluginPanel
private void initializePluginList() private void initializePluginList()
{ {
List<String> pinnedPlugins = getPinnedPluginNames();
// populate pluginList with all non-hidden plugins // populate pluginList with all non-hidden plugins
pluginManager.getPlugins().stream() pluginManager.getPlugins().stream()
.filter(plugin -> !plugin.getClass().getAnnotation(PluginDescriptor.class).hidden()) .filter(plugin -> !plugin.getClass().getAnnotation(PluginDescriptor.class).hidden())
@@ -170,14 +178,23 @@ public class ConfigPanel extends PluginPanel
final Config config = pluginManager.getPluginConfigProxy(plugin); final Config config = pluginManager.getPluginConfigProxy(plugin);
final ConfigDescriptor configDescriptor = config == null ? null : configManager.getConfigDescriptor(config); final ConfigDescriptor configDescriptor = config == null ? null : configManager.getConfigDescriptor(config);
pluginList.add(new PluginListItem(this, plugin, config, configDescriptor)); final PluginListItem listItem = new PluginListItem(this, plugin, config, configDescriptor);
listItem.setPinned(pinnedPlugins.contains(listItem.getName()));
pluginList.add(listItem);
}); });
// add special entries for core client configurations // add special entries for core client configurations
pluginList.add(new PluginListItem(this, runeLiteConfig, configManager.getConfigDescriptor(runeLiteConfig), final PluginListItem runeLite = new PluginListItem(this, runeLiteConfig,
RUNELITE_PLUGIN, "RuneLite client settings", "client")); configManager.getConfigDescriptor(runeLiteConfig),
pluginList.add(new PluginListItem(this, chatColorConfig, configManager.getConfigDescriptor(chatColorConfig), RUNELITE_PLUGIN, "RuneLite client settings", "client");
CHAT_COLOR_PLUGIN, "Recolor chat text", "colour", "messages")); runeLite.setPinned(pinnedPlugins.contains(RUNELITE_PLUGIN));
pluginList.add(runeLite);
final PluginListItem chatColor = new PluginListItem(this, chatColorConfig,
configManager.getConfigDescriptor(chatColorConfig),
CHAT_COLOR_PLUGIN, "Recolor chat text", "colour", "messages");
chatColor.setPinned(pinnedPlugins.contains(CHAT_COLOR_PLUGIN));
pluginList.add(chatColor);
pluginList.sort(Comparator.comparing(PluginListItem::getName)); pluginList.sort(Comparator.comparing(PluginListItem::getName));
} }
@@ -202,7 +219,7 @@ public class ConfigPanel extends PluginPanel
} }
} }
private void openConfigList() void openConfigList()
{ {
currentMode = DisplayMode.PLUGIN_LIST; currentMode = DisplayMode.PLUGIN_LIST;
removeAll(); removeAll();
@@ -226,24 +243,28 @@ public class ConfigPanel extends PluginPanel
pluginList.forEach(this::remove); pluginList.forEach(this::remove);
showMatchingPlugins(pluginList.stream().filter(PluginListItem::isPinned), text);
showMatchingPlugins(pluginList.stream().filter(item -> !item.isPinned()), text);
revalidate();
}
private void showMatchingPlugins(Stream<PluginListItem> listItems, String text)
{
if (text.isEmpty()) if (text.isEmpty())
{ {
pluginList.forEach(this::add); listItems.forEach(this::add);
revalidate();
return; return;
} }
// show plugins with keywords that matches all the given search terms
final String[] searchTerms = text.toLowerCase().split(" "); final String[] searchTerms = text.toLowerCase().split(" ");
pluginList.forEach(listItem -> listItems.forEach(listItem ->
{ {
if (listItem.matchesSearchTerms(searchTerms)) if (listItem.matchesSearchTerms(searchTerms))
{ {
add(listItem); add(listItem);
} }
}); });
revalidate();
} }
void openGroupConfigPanel(Config config, ConfigDescriptor cd) void openGroupConfigPanel(Config config, ConfigDescriptor cd)
@@ -560,6 +581,27 @@ public class ConfigPanel extends PluginPanel
}); });
} }
private List<String> getPinnedPluginNames()
{
final String config = configManager.getConfiguration(RUNELITE_GROUP_NAME, PINNED_PLUGINS_CONFIG_KEY);
if (config == null)
{
return new ArrayList<>();
}
return Arrays.asList(config.split(","));
}
void savePinnedPlugins()
{
String value = pluginList.stream()
.filter(PluginListItem::isPinned)
.map(PluginListItem::getName)
.collect(Collectors.joining(","));
configManager.setConfiguration(RUNELITE_GROUP_NAME, PINNED_PLUGINS_CONFIG_KEY, value);
}
@Override @Override
public void onActivate() public void onActivate()
{ {

View File

@@ -58,20 +58,24 @@ class PluginListItem extends JPanel
private static final ImageIcon CONFIG_ICON_HOVER; private static final ImageIcon CONFIG_ICON_HOVER;
private static final ImageIcon ON_SWITCHER; private static final ImageIcon ON_SWITCHER;
private static final ImageIcon OFF_SWITCHER; private static final ImageIcon OFF_SWITCHER;
private static final ImageIcon ON_STAR;
private static final ImageIcon OFF_STAR;
private final ConfigPanel configPanel; private final ConfigPanel configPanel;
private @Getter @Nullable final Plugin plugin; private @Getter @Nullable final Plugin plugin;
private @Nullable final Config config; private @Nullable final Config config;
private @Nullable final ConfigDescriptor configDescriptor; private @Nullable final ConfigDescriptor configDescriptor;
private final String name; private @Getter final String name;
private final String description; private final String description;
private final List<String> keywords = new ArrayList<>(); private final List<String> keywords = new ArrayList<>();
private final JLabel pinButton = new JLabel(OFF_STAR);
private final JLabel configButton = new JLabel(CONFIG_ICON); private final JLabel configButton = new JLabel(CONFIG_ICON);
private final JLabel toggleButton = new JLabel(OFF_SWITCHER); private final JLabel toggleButton = new JLabel(OFF_SWITCHER);
private boolean isPluginEnabled = false; private boolean isPluginEnabled = false;
private @Getter boolean isPinned = false;
static static
{ {
@@ -84,6 +88,8 @@ class PluginListItem extends JPanel
CONFIG_ICON_HOVER = new ImageIcon(SwingUtil.grayscaleOffset(configIcon, -100)); CONFIG_ICON_HOVER = new ImageIcon(SwingUtil.grayscaleOffset(configIcon, -100));
ON_SWITCHER = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("switchers/on.png"))); ON_SWITCHER = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("switchers/on.png")));
OFF_SWITCHER = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("switchers/off.png"))); OFF_SWITCHER = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("switchers/off.png")));
ON_STAR = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("stars/on.png")));
OFF_STAR = new ImageIcon(ImageIO.read(ConfigPanel.class.getResourceAsStream("stars/off.png")));
} }
} }
catch (IOException e) catch (IOException e)
@@ -148,6 +154,10 @@ class PluginListItem extends JPanel
add(nameLabel, BorderLayout.CENTER); add(nameLabel, BorderLayout.CENTER);
pinButton.setPreferredSize(new Dimension(25, 0));
attachPinButtonListener();
add(pinButton, BorderLayout.LINE_START);
final JPanel buttonPanel = new JPanel(); final JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(1, 2)); buttonPanel.setLayout(new GridLayout(1, 2));
add(buttonPanel, BorderLayout.LINE_END); add(buttonPanel, BorderLayout.LINE_END);
@@ -163,6 +173,20 @@ class PluginListItem extends JPanel
buttonPanel.add(toggleButton); buttonPanel.add(toggleButton);
} }
private void attachPinButtonListener()
{
pinButton.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent mouseEvent)
{
setPinned(!isPinned);
configPanel.savePinnedPlugins();
configPanel.openConfigList();
}
});
}
private void attachConfigButtonListener() private void attachConfigButtonListener()
{ {
// no need for a listener if there are no config item to show // no need for a listener if there are no config item to show
@@ -229,6 +253,13 @@ class PluginListItem extends JPanel
toggleButton.setToolTipText(enabled ? "Disable plugin" : "Enable plugin"); toggleButton.setToolTipText(enabled ? "Disable plugin" : "Enable plugin");
} }
void setPinned(boolean pinned)
{
isPinned = pinned;
pinButton.setIcon(pinned ? ON_STAR : OFF_STAR);
pinButton.setToolTipText(pinned ? "Unpin plugin" : "Pin plugin");
}
/** /**
* Checks if all the search terms in the given list matches at least one keyword. * Checks if all the search terms in the given list matches at least one keyword.
* @return true if all search terms matches at least one keyword, or false if otherwise. * @return true if all search terms matches at least one keyword, or false if otherwise.

Binary file not shown.

After

Width:  |  Height:  |  Size: 654 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 B