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 2314285675..05e5a2e103 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 @@ -57,6 +57,14 @@ public @interface ConfigItem String method() default ""; + String unhide() default ""; + + String unhideValue() default ""; + + String hide() default ""; + + String hideValue() default ""; + /** * Use this to indicate the enum class that is going to be used in the multiple select config. * This implementation made debugging problems with multiple selects a lot easier 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 29968d9cf4..0bc3dd2cb1 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,6 +24,7 @@ */ package net.runelite.client.plugins.config; +import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.common.collect.ComparisonChain; import com.google.common.primitives.Ints; @@ -31,6 +32,7 @@ import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; +import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; @@ -440,11 +442,6 @@ class ConfigPanel extends PluginPanel for (ConfigItemDescriptor cid : cd.getItems()) { - if (cid.getItem().hidden()) - { - continue; - } - JPanel item = new JPanel(); item.setLayout(new BorderLayout()); item.setMinimumSize(new Dimension(PANEL_WIDTH, 0)); @@ -454,6 +451,7 @@ class ConfigPanel extends PluginPanel configEntryName.setToolTipText("" + name + ":
" + cid.getItem().description() + ""); PluginListItem.addLabelPopupMenu(configEntryName, createResetMenuItem(pluginConfig, cid)); item.add(configEntryName, BorderLayout.CENTER); + item.setName(cid.getItem().keyName()); if (cid.getType() == Button.class) { @@ -782,7 +780,7 @@ class ConfigPanel extends PluginPanel backButton.addActionListener(e -> pluginList.getMuxer().popState()); mainPanel.add(backButton); - revalidate(); + hideUnhide(); } private Boolean parse(ConfigItem item, String value) @@ -846,6 +844,8 @@ class ConfigPanel extends PluginPanel }); configManager.setConfiguration(cd.getGroup().value(), cid.getItem().keyName(), finalEnumSet); + + hideUnhide(); } private void changeConfiguration(Component component, ConfigDescriptor cd, ConfigItemDescriptor cid) @@ -895,6 +895,8 @@ class ConfigPanel extends PluginPanel HotkeyButton hotkeyButton = (HotkeyButton) component; configManager.setConfiguration(cd.getGroup().value(), cid.getItem().keyName(), hotkeyButton.getValue()); } + + hideUnhide(); } @Override @@ -944,8 +946,110 @@ class ConfigPanel extends PluginPanel return menuItem; } + private void hideUnhide() + { + ConfigDescriptor cd = pluginConfig.getConfigDescriptor(); + + for (ConfigItemDescriptor cid : cd.getItems()) + { + boolean unhide = cid.getItem().hidden(); + boolean hide = !cid.getItem().hide().isEmpty(); + + if (unhide || hide) + { + boolean show = false; + + List itemHide = Splitter + .onPattern("\\|\\|") + .trimResults() + .omitEmptyStrings() + .splitToList(String.format("%s || %s", cid.getItem().unhide(), cid.getItem().hide())); + + for (ConfigItemDescriptor cid2 : cd.getItems()) + { + if (itemHide.contains(cid2.getItem().keyName())) + { + if (cid2.getType() == boolean.class) + { + show = Boolean.parseBoolean(configManager.getConfiguration(cd.getGroup().value(), cid2.getItem().keyName())); + } + else if (cid2.getType().isEnum()) + { + Class type = (Class) cid2.getType(); + try + { + Enum selectedItem = Enum.valueOf(type, configManager.getConfiguration(cd.getGroup().value(), cid2.getItem().keyName())); + if (!cid.getItem().unhideValue().equals("")) + { + List unhideValue = Splitter + .onPattern("\\|\\|") + .trimResults() + .omitEmptyStrings() + .splitToList(cid.getItem().unhideValue()); + + show = unhideValue.contains(selectedItem.toString()); + } + else if (!cid.getItem().hideValue().equals("")) + { + List hideValue = Splitter + .onPattern("\\|\\|") + .trimResults() + .omitEmptyStrings() + .splitToList(cid.getItem().hideValue()); + + show = !hideValue.contains(selectedItem.toString()); + } + } + catch (IllegalArgumentException ignored) + { + } + } + } + } + + Component comp = findComponentByName(mainPanel, cid.getItem().keyName()); + + if (comp != null) + { + comp.setVisible((!unhide || show) && (!hide || !show)); + } + } + } + + revalidate(); + repaint(); + } + private static String htmlLabel(String key, String value) { return "" + key + ": " + value + ""; } + + public static Component findComponentByName(Component component, String componentName) + { + if (component == null) + { + return null; + } + + if (component.getName() != null && component.getName().equalsIgnoreCase(componentName)) + { + return component; + } + + if (component instanceof Container) + { + Component[] children = ((Container) component).getComponents(); + for (Component child : children) + { + Component found = findComponentByName(child, componentName); + if (found != null) + { + return found; + } + } + } + + return null; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/DynamicGridLayout.java b/runelite-client/src/main/java/net/runelite/client/ui/DynamicGridLayout.java index 120decaf13..b78d9019b3 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/DynamicGridLayout.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/DynamicGridLayout.java @@ -137,12 +137,17 @@ public class DynamicGridLayout extends GridLayout { int i = r * ncols + c; - if (i < ncomponents) - { - parent.getComponent(i).setBounds(x, y, w[c], h[r]); - } + Component component = parent.getComponent(i); - y += h[r] + vgap; + if (component.isVisible()) + { + if (i < ncomponents) + { + component.setBounds(x, y, w[c], h[r]); + } + + y += h[r] + vgap; + } } x += w[c] + hgap; @@ -158,7 +163,7 @@ public class DynamicGridLayout extends GridLayout */ private Dimension calculateSize(final Container parent, final Function sizer) { - final int ncomponents = parent.getComponentCount(); + final int ncomponents = getVisibleComponents(parent);; int nrows = getRows(); int ncols = getColumns(); @@ -215,4 +220,19 @@ public class DynamicGridLayout extends GridLayout insets.left + insets.right + nw + (ncols - 1) * getHgap(), insets.top + insets.bottom + nh + (nrows - 1) * getVgap()); } + + private int getVisibleComponents(Container parent) + { + int visible = 0; + + for (Component c : parent.getComponents()) + { + if (c.isVisible()) + { + visible++; + } + } + + return visible; + } } \ No newline at end of file