From 002cf6223fe395fd4ef0a68cdaab692fa22a4c6b Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Fri, 22 Dec 2017 01:06:44 +0100 Subject: [PATCH 1/5] Change UIManager defaults to use OSRS font Change UIManager defaults for fonts to use OSRS font instead. Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/ui/ClientUI.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index 8904f7e4f2..2bc0fe8242 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -29,10 +29,13 @@ import java.awt.Dimension; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; +import java.util.Enumeration; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.plaf.FontUIResource; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.GameState; @@ -56,6 +59,7 @@ public class ClientUI extends JFrame public ClientUI(RuneLite runelite) { this.runelite = runelite; + setUIFont(new FontUIResource(FontManager.getRunescapeFont())); init(); pack(); TitleBarPane titleBarPane = new TitleBarPane(this.getRootPane(), (SubstanceRootPaneUI)this.getRootPane().getUI()); @@ -67,6 +71,22 @@ public class ClientUI extends JFrame setVisible(true); } + private static void setUIFont(FontUIResource f) + { + final Enumeration keys = UIManager.getDefaults().keys(); + + while (keys.hasMoreElements()) + { + final Object key = keys.nextElement(); + final Object value = UIManager.get(key); + + if (value instanceof FontUIResource) + { + UIManager.put(key, f); + } + } + } + private void init() { assert SwingUtilities.isEventDispatchThread(); From bb8f17d75e5688e5c111a8c4aa8485b39b54479e Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Fri, 22 Dec 2017 23:25:44 +0100 Subject: [PATCH 2/5] Change XP tracker button to use image Change xp tracker button to use actual image instead of text because text was not showing on both Windows and Linux. Signed-off-by: Tomas Slusny --- .../plugins/xptracker/XpTrackerPlugin.java | 4 +++- .../net/runelite/client/plugins/xptracker/xp.png | Bin 0 -> 1376 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/xptracker/xp.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java index 1f33beeaa9..364f395710 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java @@ -25,6 +25,8 @@ package net.runelite.client.plugins.xptracker; import com.google.common.eventbus.Subscribe; +import javax.imageio.ImageIO; +import javax.swing.ImageIcon; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.Skill; @@ -62,7 +64,7 @@ public class XpTrackerPlugin extends Plugin { navButton = new NavigationButton("XP Tracker", () -> xpPanel); xpPanel = injector.getInstance(XpPanel.class); - navButton.getButton().setText("XP"); + navButton.getButton().setIcon(new ImageIcon(ImageIO.read(getClass().getResourceAsStream("xp.png")))); ui.getPluginToolbar().addNavigation(navButton); } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/xptracker/xp.png b/runelite-client/src/main/resources/net/runelite/client/plugins/xptracker/xp.png new file mode 100644 index 0000000000000000000000000000000000000000..90914d8f57b0d6d9733f7a2dd6261a542971e6f6 GIT binary patch literal 1376 zcmeAS@N?(olHy`uVBq!ia0vp^fSyM zs%4dBL8dS=LDT@*$|_3r{S8ysPIs^K5mgWciU8$>1qI*=q*SFNr^Uz2O|q|c6;lv{ zDB$7*c@_dBRU|{EL^;4@nVFf{IXO)vB`u|;%_Sw}lq3Ttgc}!I3CRhA)H5=<%F8ct zaM>$L!#=yqHAQ_>+C(a`-Z6&83C8r*#suL|GV;~VIC#7PlXWe7$vc%M(PE1@`O~*?_ zR8B_9kY7NYm5~i-^7J(`TNkwFE-Y%8+Y~-0K5cGx#pH_M=~0Q(QVY5ZT$;T@+aohu zGxvFVuC=x?R*`Y6^>A(W4(bXIZ;!DNmpI_%wI7UDn3?M{mBzX9w`1sX;>2r$5 z(`UfYFDMD}3uagkWHE^C{{R0+B*Q&m?hsxFRPp~5%TYN7<`qEJX_gH@1uSR5%x!G! z-26c1X_hCM8}8oz4q{#22hspyfk`HidH;_q`FME=|9^4-C*qKhMAC&He!u zFeZ7syS!1{xmg;>VK4FYb!C6Z!^p#=)g!*^GEiE|)5S4F;&O6AN>W-vVrug92TvY7 zOJrb-v#VocbW}_f3^Xj{+|aRPib-?NnmIL&3!4@RMYu$|hWf@j2d`cc5$!InvuJsK zLPknXP*7A_RvMq!#tmCGZQHn2d;N+nsQiJ zvuFKfW@>J7c9M*Wx_!&qYWJ?{s>6qrl@>2bmiYBc-Di$T<*6%~my;hq5*C^~Niyxs z9MkG^cPc-N>-c#3ddE+hcydF<$xErH!`H-YtvY+F^tE};oh_0on^IqIduv_x?$+M) z_xt{`^EJ8f$=Vftx$#k0-G8oKv6=Slhj)H*i|fbkEBbottF(Fk-F=fMpDy@*?=L&Q zylvg5FE>An>&Ndscbc8y$L9j=87@nJg%X2miEBhjN@7W>RdP`(kYX@0Ff`XSG}1M+ z2r)FZGBmU@vCuX!v@$S=-h46~MMG|WN@iLmT!VpO2vD_wk(G%NM1!64Q&5q~;OXk; Jvd$@?2>_qJtLy*( literal 0 HcmV?d00001 From 670ffe135f9def0aa51c098e2eee09e0a2583e39 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Fri, 22 Dec 2017 01:16:08 +0100 Subject: [PATCH 3/5] Simplify navigation button code Simplify code of the navigation button to also handle images and to extend the swing JButton instead of wrapping it in getButton method. Signed-off-by: Tomas Slusny --- .../client/plugins/account/AccountPlugin.java | 17 ++------- .../client/plugins/config/ConfigPlugin.java | 17 ++------- .../plugins/devtools/DevToolsPlugin.java | 14 +++---- .../client/plugins/hiscore/HiscorePlugin.java | 9 ++--- .../plugins/xptracker/XpTrackerPlugin.java | 8 ++-- .../runelite/client/ui/NavigationButton.java | 37 +++++++------------ .../net/runelite/client/ui/PluginToolbar.java | 12 +++--- 7 files changed, 41 insertions(+), 73 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java index 54e8367541..f55d0faaf3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/account/AccountPlugin.java @@ -34,7 +34,6 @@ import java.time.Instant; import java.util.concurrent.ScheduledExecutorService; import javax.imageio.ImageIO; import javax.inject.Inject; -import javax.swing.ImageIcon; import lombok.extern.slf4j.Slf4j; import net.runelite.client.RuneLite; import net.runelite.client.account.AccountSession; @@ -73,18 +72,10 @@ public class AccountPlugin extends Plugin @Override protected void startUp() throws Exception { - loginButton = new NavigationButton("Login"); - logoutButton = new NavigationButton("Logout"); - - ImageIcon icon = new ImageIcon(ImageIO.read(getClass().getResourceAsStream("login_icon.png"))); - loginButton.getButton().setIcon(icon); - - icon = new ImageIcon(ImageIO.read(getClass().getResourceAsStream("logout_icon.png"))); - logoutButton.getButton().setIcon(icon); - - loginButton.getButton().addActionListener(this::loginClick); - logoutButton.getButton().addActionListener(this::logoutClick); - + loginButton = new NavigationButton("Login", ImageIO.read(getClass().getResourceAsStream("login_icon.png"))); + logoutButton = new NavigationButton("Logout", ImageIO.read(getClass().getResourceAsStream("logout_icon.png"))); + loginButton.addActionListener(this::loginClick); + logoutButton.addActionListener(this::logoutClick); ui.getPluginToolbar().addNavigation(loginButton); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java index 26be2786a6..3639323173 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java @@ -26,7 +26,6 @@ package net.runelite.client.plugins.config; import javax.imageio.ImageIO; import javax.inject.Inject; -import javax.swing.ImageIcon; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -49,19 +48,11 @@ public class ConfigPlugin extends Plugin @Override protected void startUp() throws Exception { - navButton = new NavigationButton("Configuration", this::buildPanel); - - ImageIcon icon = new ImageIcon(ImageIO.read(getClass().getResourceAsStream("config_icon.png"))); - navButton.getButton().setIcon(icon); + navButton = new NavigationButton( + "Configuration", + ImageIO.read(getClass().getResourceAsStream("config_icon.png")), + () -> new ConfigPanel(configManager)); ui.getPluginToolbar().addNavigation(navButton); } - - private ConfigPanel buildPanel() - { - ConfigPanel panel = new ConfigPanel(configManager); - panel.init(); - return panel; - } - } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java index 6aa3f5d3ef..b0eec3328e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPlugin.java @@ -28,7 +28,6 @@ import com.google.inject.Binder; import java.awt.Font; import javax.imageio.ImageIO; import javax.inject.Inject; -import javax.swing.ImageIcon; import net.runelite.api.widgets.Widget; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -49,9 +48,6 @@ public class DevToolsPlugin extends Plugin @Inject DevToolsOverlay overlay; - private NavigationButton navButton; - private DevToolsPanel panel; - private boolean togglePlayers; private boolean toggleNpcs; private boolean toggleGroundItems; @@ -76,11 +72,11 @@ public class DevToolsPlugin extends Plugin @Override protected void startUp() throws Exception { - panel = injector.getInstance(DevToolsPanel.class); - navButton = new NavigationButton("Developer Tools", () -> panel); - - ImageIcon icon = new ImageIcon(ImageIO.read(getClass().getResourceAsStream("devtools_icon.png"))); - navButton.getButton().setIcon(icon); + final DevToolsPanel panel = injector.getInstance(DevToolsPanel.class); + final NavigationButton navButton = new NavigationButton( + "Developer Tools", + ImageIO.read(getClass().getResourceAsStream("devtools_icon.png")), + () -> panel); ui.getPluginToolbar().addNavigation(navButton); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java index 225dceaf4f..9b459fd6a5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePlugin.java @@ -28,7 +28,6 @@ import com.google.common.eventbus.Subscribe; import java.util.concurrent.ScheduledExecutorService; import javax.imageio.ImageIO; import javax.inject.Inject; -import javax.swing.ImageIcon; import net.runelite.client.events.PlayerMenuOptionClicked; import net.runelite.client.menus.MenuManager; import net.runelite.client.plugins.Plugin; @@ -58,11 +57,11 @@ public class HiscorePlugin extends Plugin @Override protected void startUp() throws Exception { - navButton = new NavigationButton("Hiscore", () -> hiscorePanel); hiscorePanel = injector.getInstance(HiscorePanel.class); - - ImageIcon icon = new ImageIcon(ImageIO.read(getClass().getResourceAsStream("hiscore.gif"))); - navButton.getButton().setIcon(icon); + navButton = new NavigationButton( + "Hiscore", + ImageIO.read(getClass().getResourceAsStream("hiscore.gif")), + () -> hiscorePanel); ui.getPluginToolbar().addNavigation(navButton); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java index 364f395710..398e3cc4a8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpTrackerPlugin.java @@ -26,7 +26,6 @@ package net.runelite.client.plugins.xptracker; import com.google.common.eventbus.Subscribe; import javax.imageio.ImageIO; -import javax.swing.ImageIcon; import net.runelite.api.Client; import net.runelite.api.GameState; import net.runelite.api.Skill; @@ -62,9 +61,12 @@ public class XpTrackerPlugin extends Plugin @Override protected void startUp() throws Exception { - navButton = new NavigationButton("XP Tracker", () -> xpPanel); xpPanel = injector.getInstance(XpPanel.class); - navButton.getButton().setIcon(new ImageIcon(ImageIO.read(getClass().getResourceAsStream("xp.png")))); + navButton = new NavigationButton( + "XP Tracker", + ImageIO.read(getClass().getResourceAsStream("xp.png")), + () -> xpPanel); + ui.getPluginToolbar().addNavigation(navButton); } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/NavigationButton.java b/runelite-client/src/main/java/net/runelite/client/ui/NavigationButton.java index 2e7d3a64e2..cf2529580c 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/NavigationButton.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/NavigationButton.java @@ -24,40 +24,29 @@ */ package net.runelite.client.ui; +import java.awt.Image; import java.util.function.Supplier; +import javax.swing.ImageIcon; import javax.swing.JButton; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; -public class NavigationButton +@Slf4j +public class NavigationButton extends JButton { - private final JButton button = new JButton(); + @Getter private final Supplier panelSupplier; - private String name; - - public NavigationButton(String name) + public NavigationButton(String name, Image icon) { - this.name = name; - this.panelSupplier = null; + this(name, icon, null); } - public NavigationButton(String name, Supplier panelSupplier) + public NavigationButton(String name, Image icon, Supplier panelSupplier) { - this.name = name; + super(); + setToolTipText(name); + setIcon(new ImageIcon(icon)); this.panelSupplier = panelSupplier; } - - public JButton getButton() - { - return button; - } - - public Supplier getPanelSupplier() - { - return panelSupplier; - } - - public String getName() - { - return name; - } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/PluginToolbar.java b/runelite-client/src/main/java/net/runelite/client/ui/PluginToolbar.java index b7388a42f6..56f45a6360 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/PluginToolbar.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/PluginToolbar.java @@ -52,18 +52,18 @@ public class PluginToolbar extends JToolBar public void addNavigation(NavigationButton button) { - button.getButton().addActionListener((ae) -> onClick(button)); - button.getButton().setToolTipText(button.getName()); + button.addActionListener((ae) -> onClick(button)); + button.setToolTipText(button.getName()); buttons.add(button); - add(button.getButton()); + add(button); revalidate(); } public void removeNavigation(NavigationButton button) { buttons.remove(button); - remove(button.getButton()); + remove(button); revalidate(); } @@ -77,7 +77,7 @@ public class PluginToolbar extends JToolBar if (current != null) { - current.getButton().setSelected(false); + current.setSelected(false); } if (current == button) @@ -92,7 +92,7 @@ public class PluginToolbar extends JToolBar ui.expand(pluginPanel); current = button; - current.getButton().setSelected(true); + current.setSelected(true); } } } From 4568f4302f3fd6ec10724fb4a4c6dbc4c2625011 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Fri, 22 Dec 2017 01:19:31 +0100 Subject: [PATCH 4/5] Move IconTextField to Hiscore plugin As it is the only place where it is used, it should be placed there. Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/plugins/hiscore/HiscorePanel.java | 1 - .../runelite/client/{ui => plugins/hiscore}/IconTextField.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) rename runelite-client/src/main/java/net/runelite/client/{ui => plugins/hiscore}/IconTextField.java (98%) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java index cb3683507f..44df3a8b57 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java @@ -39,7 +39,6 @@ import javax.swing.border.Border; import javax.swing.event.MouseInputAdapter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Experience; -import net.runelite.client.ui.IconTextField; import net.runelite.client.ui.PluginPanel; import net.runelite.http.api.hiscore.*; import static net.runelite.http.api.hiscore.HiscoreSkill.*; diff --git a/runelite-client/src/main/java/net/runelite/client/ui/IconTextField.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/IconTextField.java similarity index 98% rename from runelite-client/src/main/java/net/runelite/client/ui/IconTextField.java rename to runelite-client/src/main/java/net/runelite/client/plugins/hiscore/IconTextField.java index 53e4ccfae3..055640de17 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/IconTextField.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/IconTextField.java @@ -23,7 +23,7 @@ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.ui; +package net.runelite.client.plugins.hiscore; import java.awt.Graphics; import java.awt.Insets; From 19416ba5ca85e51949c2f7b8e3c1c8e536d0e7a4 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Fri, 22 Dec 2017 01:29:22 +0100 Subject: [PATCH 5/5] Normalize plugin panel display - Add same padding to each panel - Wrap each panel in JScrollPane - Clean up plugin panel API and set normalized width, height and layout to each panel instead of having to manually specify it for each panel - Make PluginPanel class abstract Signed-off-by: Tomas Slusny --- .../client/plugins/config/ConfigPanel.java | 103 +++++------------- .../plugins/devtools/DevToolsPanel.java | 33 ++---- .../client/plugins/hiscore/HiscorePanel.java | 39 ++++--- .../client/plugins/xptracker/XpPanel.java | 35 ++---- .../java/net/runelite/client/ui/ClientUI.java | 42 +++++-- .../net/runelite/client/ui/PluginPanel.java | 22 +++- 6 files changed, 127 insertions(+), 147 deletions(-) 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 cf775c14e6..a85cd777b1 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,11 +24,12 @@ */ package net.runelite.client.plugins.config; +import static javax.swing.JOptionPane.WARNING_MESSAGE; +import static javax.swing.JOptionPane.YES_NO_OPTION; +import static javax.swing.JOptionPane.YES_OPTION; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; -import java.awt.Dimension; -import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; @@ -37,10 +38,7 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; -import java.util.ArrayList; import java.util.Comparator; -import java.util.List; -import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JColorChooser; @@ -50,17 +48,12 @@ import javax.swing.JFormattedTextField; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; -import static javax.swing.JOptionPane.WARNING_MESSAGE; -import static javax.swing.JOptionPane.YES_NO_OPTION; -import static javax.swing.JOptionPane.YES_OPTION; import javax.swing.JPanel; -import javax.swing.JScrollPane; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; import javax.swing.SwingConstants; -import javax.swing.border.EmptyBorder; import lombok.extern.slf4j.Slf4j; import net.runelite.client.config.ConfigDescriptor; import net.runelite.client.config.ConfigItem; @@ -71,70 +64,37 @@ import net.runelite.client.ui.PluginPanel; @Slf4j public class ConfigPanel extends PluginPanel { - private static final EmptyBorder BORDER_PADDING = new EmptyBorder(6, 6, 6, 6); private static final int TEXT_FIELD_WIDTH = 7; private static final int SPINNER_FIELD_WIDTH = 6; private final ConfigManager configManager; - private JScrollPane scrollPane; - public ConfigPanel(ConfigManager configManager) { + super(); this.configManager = configManager; - setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); - setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); - setSize(PANEL_WIDTH, PANEL_HEIGHT); - setLayout(new BorderLayout()); - setVisible(true); + populateConfig(); } - public void init() + private void populateConfig() { - add(createConfigPanel(), BorderLayout.NORTH); - } + removeAll(); + add(new JLabel("Plugin Configuration", SwingConstants.CENTER)); - private List getConfig() - { - List list = new ArrayList<>(); - for (Object config : configManager.getConfigProxies()) - { - ConfigDescriptor configDescriptor = configManager.getConfigDescriptor(config); + configManager.getConfigProxies().stream() + .map(configManager::getConfigDescriptor) + .sorted(Comparator.comparing(left -> left.getGroup().name())) + .forEach(cd -> + { + JPanel groupPanel = new JPanel(); + groupPanel.setLayout(new BorderLayout()); + JButton viewGroupItemsButton = new JButton(cd.getGroup().name()); + viewGroupItemsButton.addActionListener(ae -> openGroupConfigPanel(cd, configManager)); + groupPanel.add(viewGroupItemsButton); + add(groupPanel); + }); - list.add(configDescriptor); - } - return list; - } - - private JComponent createConfigPanel() - { - JPanel panel = new JPanel(); - panel.setBorder(BORDER_PADDING); - panel.setLayout(new GridLayout(0, 1, 0, 3)); - panel.add(new JLabel("Plugin Configuration", SwingConstants.CENTER)); - - List config = getConfig(); - - // Sort by name - Comparator comparator = (ConfigDescriptor left, ConfigDescriptor right) -> left.getGroup().name().compareTo(right.getGroup().name()); - config.sort(comparator); - - for (ConfigDescriptor cd : config) - { - JPanel groupPanel = new JPanel(); - groupPanel.setLayout(new BorderLayout()); - JButton viewGroupItemsButton = new JButton(cd.getGroup().name()); - viewGroupItemsButton.addActionListener(ae -> openGroupConfigPanel(cd, configManager)); - groupPanel.add(viewGroupItemsButton); - panel.add(groupPanel); - } - - //Make the panel scrollable - scrollPane = new JScrollPane(panel); - scrollPane.setBorder(BorderFactory.createEmptyBorder()); - scrollPane.setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); - scrollPane.getVerticalScrollBar().setUnitIncrement(16); //Otherwise scrollspeed is really slow - return scrollPane; + revalidate(); } private void changeConfiguration(JComponent component, ConfigDescriptor cd, ConfigItemDescriptor cid) @@ -186,13 +146,11 @@ public class ConfigPanel extends PluginPanel private void openGroupConfigPanel(ConfigDescriptor cd, ConfigManager configManager) { - JPanel itemPanel = new JPanel(); - itemPanel.setBorder(BORDER_PADDING); - itemPanel.setLayout(new GridLayout(0, 1, 0, 6)); + removeAll(); String name = cd.getGroup().name() + " Configuration"; JLabel title = new JLabel(name); title.setToolTipText(cd.getGroup().description()); - itemPanel.add(title, SwingConstants.CENTER); + add(title, SwingConstants.CENTER); for (ConfigItemDescriptor cid : cd.getItems()) { @@ -309,24 +267,19 @@ public class ConfigPanel extends PluginPanel item.add(box, BorderLayout.EAST); } - itemPanel.add(item); + add(item); } JButton backButton = new JButton("Back"); backButton.addActionListener(this::getBackButtonListener); - itemPanel.add(backButton); - - removeAll(); - updateUI(); - add(itemPanel, BorderLayout.NORTH); + add(backButton); + revalidate(); } public void getBackButtonListener(ActionEvent e) { - removeAll(); - updateUI(); - add(scrollPane, BorderLayout.NORTH); + populateConfig(); } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java index 773ec0dabd..7993a9aecf 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/DevToolsPanel.java @@ -25,9 +25,10 @@ */ package net.runelite.client.plugins.devtools; +import static net.runelite.api.widgets.WidgetInfo.TO_CHILD; +import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Dimension; import java.awt.GridLayout; import java.util.Collection; import javax.annotation.Nullable; @@ -43,16 +44,12 @@ import javax.swing.tree.DefaultTreeModel; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.widgets.Widget; -import static net.runelite.api.widgets.WidgetInfo.TO_CHILD; -import static net.runelite.api.widgets.WidgetInfo.TO_GROUP; import net.runelite.api.widgets.WidgetItem; import net.runelite.client.ui.PluginPanel; @Slf4j public class DevToolsPanel extends PluginPanel { - private final EmptyBorder PADDING_BORDER = new EmptyBorder(3, 3, 3, 3); - private JButton renderPlayersBtn = new JButton(); private JButton renderNpcsBtn = new JButton(); private JButton renderGroundItemsBtn = new JButton(); @@ -61,8 +58,6 @@ public class DevToolsPanel extends PluginPanel private JButton renderWallsBtn = new JButton(); private JButton renderDecorBtn = new JButton(); private JButton renderInventoryBtn = new JButton(); - private JButton settingsSnapshotBtn = new JButton(); - private JButton settingsClearBtn = new JButton(); private JLabel textLbl = new JLabel(); private JLabel textColorLbl = new JLabel(); @@ -80,26 +75,22 @@ public class DevToolsPanel extends PluginPanel @Inject public DevToolsPanel(@Nullable Client client, DevToolsPlugin plugin) { + super(); this.client = client; this.plugin = plugin; settingsTracker = new SettingsTracker(client); - - setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); - setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); - setSize(PANEL_WIDTH, PANEL_HEIGHT); - setLayout(new BorderLayout()); - setVisible(true); - - add(createOptionsPanel(), BorderLayout.NORTH); - add(createWidgetTreePanel(), BorderLayout.CENTER); + final JPanel borderedWrap = new JPanel(); + borderedWrap.setLayout(new BorderLayout(0, 3)); + borderedWrap.add(createOptionsPanel(), BorderLayout.NORTH); + borderedWrap.add(createWidgetTreePanel(), BorderLayout.CENTER); + add(borderedWrap); } private JPanel createOptionsPanel() { JPanel container = new JPanel(); container.setLayout(new GridLayout(5, 2, 3, 3)); - container.setBorder(PADDING_BORDER); renderPlayersBtn = new JButton("Players"); renderPlayersBtn.addActionListener(e -> @@ -165,11 +156,11 @@ public class DevToolsPanel extends PluginPanel }); container.add(renderInventoryBtn); - settingsSnapshotBtn = new JButton("Get Settings"); + JButton settingsSnapshotBtn = new JButton("Get Settings"); settingsSnapshotBtn.addActionListener(settingsTracker::snapshot); container.add(settingsSnapshotBtn); - settingsClearBtn = new JButton("Clear Settings"); + JButton settingsClearBtn = new JButton("Clear Settings"); settingsClearBtn.addActionListener(settingsTracker::clear); container.add(settingsClearBtn); @@ -179,7 +170,7 @@ public class DevToolsPanel extends PluginPanel private JPanel createWidgetTreePanel() { JPanel container = new JPanel(); - container.setLayout(new BorderLayout()); + container.setLayout(new BorderLayout(0, 3)); JTree tree = new JTree(new DefaultMutableTreeNode()); tree.setRootVisible(false); @@ -205,7 +196,6 @@ public class DevToolsPanel extends PluginPanel }); JScrollPane scrollPane = new JScrollPane(tree); - scrollPane.setBorder(PADDING_BORDER); container.add(scrollPane, BorderLayout.CENTER); JButton refreshWidgetsBtn = new JButton("Refresh Widgets"); @@ -217,7 +207,6 @@ public class DevToolsPanel extends PluginPanel JPanel btnContainer = new JPanel(); btnContainer.setLayout(new BorderLayout()); - btnContainer.setBorder(PADDING_BORDER); btnContainer.add(refreshWidgetsBtn); container.add(btnContainer, BorderLayout.NORTH); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java index 44df3a8b57..8ea7e75deb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hiscore/HiscorePanel.java @@ -24,8 +24,16 @@ */ package net.runelite.client.plugins.hiscore; +import static net.runelite.http.api.hiscore.HiscoreSkill.*; import com.google.common.base.Strings; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; import java.awt.event.MouseEvent; import java.io.IOException; import java.text.NumberFormat; @@ -34,14 +42,25 @@ import java.util.List; import java.util.concurrent.ScheduledExecutorService; import javax.imageio.ImageIO; import javax.inject.Inject; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.ButtonGroup; +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.JToggleButton; +import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.event.MouseInputAdapter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Experience; import net.runelite.client.ui.PluginPanel; -import net.runelite.http.api.hiscore.*; -import static net.runelite.http.api.hiscore.HiscoreSkill.*; +import net.runelite.http.api.hiscore.HiscoreClient; +import net.runelite.http.api.hiscore.HiscoreEndpoint; +import net.runelite.http.api.hiscore.HiscoreResult; +import net.runelite.http.api.hiscore.HiscoreSkill; +import net.runelite.http.api.hiscore.Skill; @Slf4j public class HiscorePanel extends PluginPanel @@ -77,19 +96,13 @@ public class HiscorePanel extends PluginPanel public HiscorePanel() { + super(); + // Panel "constants" // This was an EtchedBorder, but the style would change when the window was maximized. Border subPanelBorder = BorderFactory.createLineBorder(this.getBackground().brighter(), 2); - Insets subPanelInsets = new Insets(2, 4, 2, 4); Font labelFont = UIManager.getFont("Label.font"); - // Setting base panel size - Dimension panelSize = new Dimension(PANEL_WIDTH, PANEL_HEIGHT); - setMinimumSize(panelSize); - setPreferredSize(panelSize); - setSize(panelSize); - setVisible(true); - // Create GBL to arrange sub items GridBagLayout gridBag = new GridBagLayout(); setLayout(gridBag); @@ -124,7 +137,7 @@ public class HiscorePanel extends PluginPanel c.gridy = 0; c.weightx = 1; c.weighty = 0; - c.insets = subPanelInsets; + c.insets = new Insets(0, 0, 3, 0); gridBag.setConstraints(inputPanel, c); add(inputPanel); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java index 0cf95f7140..da8cff7e50 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xptracker/XpPanel.java @@ -30,7 +30,6 @@ import net.runelite.client.ui.PluginPanel; import javax.imageio.ImageIO; import java.awt.BorderLayout; import java.awt.Dimension; -import java.awt.GridLayout; import java.io.IOException; import java.text.NumberFormat; import java.util.HashMap; @@ -42,7 +41,6 @@ import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; -import javax.swing.JScrollPane; import lombok.extern.slf4j.Slf4j; @Slf4j @@ -50,7 +48,6 @@ public class XpPanel extends PluginPanel { private Map labelMap = new HashMap<>(); private final XpTrackerPlugin xpTracker; - private JPanel statsPanel; @Inject @Nullable @@ -62,15 +59,9 @@ public class XpPanel extends PluginPanel @Inject public XpPanel(XpTrackerPlugin xpTracker) { + super(); this.xpTracker = xpTracker; - setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); - setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); - setSize(PANEL_WIDTH, PANEL_HEIGHT); - setVisible(true); - statsPanel = new JPanel(); - statsPanel.setLayout(new GridLayout(24, 1)); - try { for (Skill skill : Skill.values()) @@ -90,14 +81,9 @@ public class XpPanel extends PluginPanel } JButton resetButton = new JButton("Reset All"); - resetButton.setPreferredSize(new Dimension(PANEL_WIDTH, 32)); resetButton.addActionListener((e) -> executor.execute(this::resetAllSkillXpHr)); - - statsPanel.add(resetButton); - JScrollPane scroll = new JScrollPane(statsPanel); - scroll.add(statsPanel); - - add(statsPanel); + resetButton.setPreferredSize(new Dimension(0, 32)); + add(resetButton); } private JButton makeSkillResetButton(Skill skill) throws IOException @@ -114,13 +100,12 @@ public class XpPanel extends PluginPanel BorderLayout borderLayout = new BorderLayout(); borderLayout.setHgap(12); JPanel iconLevel = new JPanel(borderLayout); - iconLevel.setPreferredSize(new Dimension(PANEL_WIDTH, 32)); + iconLevel.setPreferredSize(new Dimension(0, 32)); String skillIcon = "/skill_icons/" + skill.getName().toLowerCase() + ".png"; log.debug("Loading skill icon from {}", skillIcon); JLabel icon = new JLabel(new ImageIcon(ImageIO.read(XpPanel.class.getResourceAsStream(skillIcon)))); iconLevel.add(icon, BorderLayout.LINE_START); - iconLevel.add(levelLabel, BorderLayout.CENTER); iconLevel.add(makeSkillResetButton(skill), BorderLayout.LINE_END); @@ -131,9 +116,8 @@ public class XpPanel extends PluginPanel { int skillIdx = skill.ordinal(); xpTracker.getXpInfos()[skillIdx].reset(client.getSkillExperience(skill)); - statsPanel.remove(labelMap.get(skill)); - statsPanel.revalidate(); - statsPanel.repaint(); + remove(labelMap.get(skill)); + revalidate(); } public void resetAllSkillXpHr() @@ -165,11 +149,10 @@ public class XpPanel extends PluginPanel JLabel xpHr = (JLabel) skillPanel.getComponent(1); xpHr.setText(NumberFormat.getInstance().format(skillXPInfo.getXpHr()) + " xp/hr"); - if (skillPanel.getParent() != statsPanel) + if (skillPanel.getParent() != this) { - statsPanel.add(skillPanel); - statsPanel.revalidate(); - statsPanel.repaint(); + add(skillPanel); + revalidate(); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index 2bc0fe8242..2a7a278b93 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -33,6 +33,8 @@ import java.util.Enumeration; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.ScrollPaneConstants; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.plaf.FontUIResource; @@ -45,9 +47,9 @@ import org.pushingpixels.substance.internal.ui.SubstanceRootPaneUI; @Slf4j public class ClientUI extends JFrame { - private static final int PANEL_WIDTH = 809; - private static final int PANEL_HEIGHT = 536; - private static final int EXPANDED_WIDTH = PANEL_WIDTH + PluginPanel.PANEL_WIDTH; + private static final int CLIENT_WIDTH = 809; + private static final int SCROLLBAR_WIDTH = 17; + private static final int EXPANDED_WIDTH = CLIENT_WIDTH + PluginPanel.PANEL_WIDTH + SCROLLBAR_WIDTH; private final RuneLite runelite; private JPanel container; @@ -92,8 +94,7 @@ public class ClientUI extends JFrame assert SwingUtilities.isEventDispatchThread(); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); - + setMinimumSize(new Dimension(CLIENT_WIDTH, 0)); addWindowListener(new WindowAdapter() { @Override @@ -140,23 +141,46 @@ public class ClientUI extends JFrame } pluginPanel = panel; - navContainer.add(pluginPanel, BorderLayout.WEST); + navContainer.add(wrapPanel(pluginPanel), BorderLayout.WEST); container.validate(); - this.setMinimumSize(new Dimension(EXPANDED_WIDTH, PANEL_HEIGHT)); + this.setMinimumSize(new Dimension(EXPANDED_WIDTH, 0)); } void contract() { navContainer.remove(1); container.validate(); - this.setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); + this.setMinimumSize(new Dimension(CLIENT_WIDTH, 0)); if (this.getWidth() == EXPANDED_WIDTH) { - this.setSize(PANEL_WIDTH, PANEL_HEIGHT); + this.setSize(CLIENT_WIDTH, getHeight()); } pluginPanel = null; } + private JPanel wrapPanel(PluginPanel panel) + { + final JPanel northPanel = new JPanel(); + northPanel.setLayout(new BorderLayout()); + northPanel.add(panel, BorderLayout.NORTH); + + final JScrollPane scrollPane = new JScrollPane(northPanel); + scrollPane.getVerticalScrollBar().setUnitIncrement(16); //Otherwise scrollspeed is really slow + scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + + final JPanel panelWrap = new JPanel(); + + // Adjust the preferred size to expand to width of scrollbar to + // to preven scrollbar overlapping over contents + panelWrap.setPreferredSize(new Dimension( + PluginPanel.PANEL_WIDTH + SCROLLBAR_WIDTH, + 0)); + + panelWrap.setLayout(new BorderLayout()); + panelWrap.add(scrollPane, BorderLayout.CENTER); + return panelWrap; + } + private void checkExit() { Client client = runelite.getClient(); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/PluginPanel.java b/runelite-client/src/main/java/net/runelite/client/ui/PluginPanel.java index a85fcc64ae..3d4399dbd9 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/PluginPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/PluginPanel.java @@ -24,9 +24,27 @@ */ package net.runelite.client.ui; +import java.awt.Dimension; +import java.awt.GridLayout; import javax.swing.JPanel; +import javax.swing.border.EmptyBorder; -public class PluginPanel extends JPanel +public abstract class PluginPanel extends JPanel { - public static final int PANEL_WIDTH = 225, PANEL_HEIGHT = 503; + public static final int PANEL_WIDTH = 225; + private static final int OFFSET = 6; + private static final EmptyBorder BORDER_PADDING = new EmptyBorder(OFFSET, OFFSET, OFFSET, OFFSET); + + public PluginPanel() + { + super(); + setBorder(BORDER_PADDING); + setLayout(new GridLayout(0, 1, 0, 3)); + } + + @Override + public Dimension getPreferredSize() + { + return new Dimension(PANEL_WIDTH, super.getPreferredSize().height); + } }