Merge pull request #269 from deathbeam/better-swing-ui

Clean up swing UI
This commit is contained in:
Adam
2017-12-23 20:15:00 -05:00
committed by GitHub
15 changed files with 190 additions and 221 deletions

View File

@@ -34,7 +34,6 @@ import java.time.Instant;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.inject.Inject; import javax.inject.Inject;
import javax.swing.ImageIcon;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.client.RuneLite; import net.runelite.client.RuneLite;
import net.runelite.client.account.AccountSession; import net.runelite.client.account.AccountSession;
@@ -73,18 +72,10 @@ public class AccountPlugin extends Plugin
@Override @Override
protected void startUp() throws Exception protected void startUp() throws Exception
{ {
loginButton = new NavigationButton("Login"); loginButton = new NavigationButton("Login", ImageIO.read(getClass().getResourceAsStream("login_icon.png")));
logoutButton = new NavigationButton("Logout"); logoutButton = new NavigationButton("Logout", ImageIO.read(getClass().getResourceAsStream("logout_icon.png")));
loginButton.addActionListener(this::loginClick);
ImageIcon icon = new ImageIcon(ImageIO.read(getClass().getResourceAsStream("login_icon.png"))); logoutButton.addActionListener(this::logoutClick);
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);
ui.getPluginToolbar().addNavigation(loginButton); ui.getPluginToolbar().addNavigation(loginButton);
} }

View File

@@ -24,11 +24,12 @@
*/ */
package net.runelite.client.plugins.config; 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.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Component; import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
import java.awt.event.FocusListener; import java.awt.event.FocusListener;
@@ -37,10 +38,7 @@ import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter; import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JCheckBox; import javax.swing.JCheckBox;
import javax.swing.JColorChooser; import javax.swing.JColorChooser;
@@ -50,17 +48,12 @@ import javax.swing.JFormattedTextField;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JOptionPane; 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.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.SpinnerModel; import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel; import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants; import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.client.config.ConfigDescriptor; import net.runelite.client.config.ConfigDescriptor;
import net.runelite.client.config.ConfigItem; import net.runelite.client.config.ConfigItem;
@@ -71,70 +64,37 @@ import net.runelite.client.ui.PluginPanel;
@Slf4j @Slf4j
public class ConfigPanel extends PluginPanel 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 TEXT_FIELD_WIDTH = 7;
private static final int SPINNER_FIELD_WIDTH = 6; private static final int SPINNER_FIELD_WIDTH = 6;
private final ConfigManager configManager; private final ConfigManager configManager;
private JScrollPane scrollPane;
public ConfigPanel(ConfigManager configManager) public ConfigPanel(ConfigManager configManager)
{ {
super();
this.configManager = configManager; this.configManager = configManager;
setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); populateConfig();
setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT));
setSize(PANEL_WIDTH, PANEL_HEIGHT);
setLayout(new BorderLayout());
setVisible(true);
} }
public void init() private void populateConfig()
{ {
add(createConfigPanel(), BorderLayout.NORTH); removeAll();
} add(new JLabel("Plugin Configuration", SwingConstants.CENTER));
private List<ConfigDescriptor> getConfig() configManager.getConfigProxies().stream()
{ .map(configManager::getConfigDescriptor)
List<ConfigDescriptor> list = new ArrayList<>(); .sorted(Comparator.comparing(left -> left.getGroup().name()))
for (Object config : configManager.getConfigProxies()) .forEach(cd ->
{ {
ConfigDescriptor configDescriptor = configManager.getConfigDescriptor(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);
add(groupPanel);
});
list.add(configDescriptor); revalidate();
}
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<ConfigDescriptor> config = getConfig();
// Sort by name
Comparator<ConfigDescriptor> 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;
} }
private void changeConfiguration(JComponent component, ConfigDescriptor cd, ConfigItemDescriptor cid) 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) private void openGroupConfigPanel(ConfigDescriptor cd, ConfigManager configManager)
{ {
JPanel itemPanel = new JPanel(); removeAll();
itemPanel.setBorder(BORDER_PADDING);
itemPanel.setLayout(new GridLayout(0, 1, 0, 6));
String name = cd.getGroup().name() + " Configuration"; String name = cd.getGroup().name() + " Configuration";
JLabel title = new JLabel(name); JLabel title = new JLabel(name);
title.setToolTipText(cd.getGroup().description()); title.setToolTipText(cd.getGroup().description());
itemPanel.add(title, SwingConstants.CENTER); add(title, SwingConstants.CENTER);
for (ConfigItemDescriptor cid : cd.getItems()) for (ConfigItemDescriptor cid : cd.getItems())
{ {
@@ -309,24 +267,19 @@ public class ConfigPanel extends PluginPanel
item.add(box, BorderLayout.EAST); item.add(box, BorderLayout.EAST);
} }
itemPanel.add(item); add(item);
} }
JButton backButton = new JButton("Back"); JButton backButton = new JButton("Back");
backButton.addActionListener(this::getBackButtonListener); backButton.addActionListener(this::getBackButtonListener);
itemPanel.add(backButton); add(backButton);
revalidate();
removeAll();
updateUI();
add(itemPanel, BorderLayout.NORTH);
} }
public void getBackButtonListener(ActionEvent e) public void getBackButtonListener(ActionEvent e)
{ {
removeAll();
updateUI();
add(scrollPane, BorderLayout.NORTH); populateConfig();
} }
} }

View File

@@ -26,7 +26,6 @@ package net.runelite.client.plugins.config;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.inject.Inject; import javax.inject.Inject;
import javax.swing.ImageIcon;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
@@ -49,19 +48,11 @@ public class ConfigPlugin extends Plugin
@Override @Override
protected void startUp() throws Exception protected void startUp() throws Exception
{ {
navButton = new NavigationButton("Configuration", this::buildPanel); navButton = new NavigationButton(
"Configuration",
ImageIcon icon = new ImageIcon(ImageIO.read(getClass().getResourceAsStream("config_icon.png"))); ImageIO.read(getClass().getResourceAsStream("config_icon.png")),
navButton.getButton().setIcon(icon); () -> new ConfigPanel(configManager));
ui.getPluginToolbar().addNavigation(navButton); ui.getPluginToolbar().addNavigation(navButton);
} }
private ConfigPanel buildPanel()
{
ConfigPanel panel = new ConfigPanel(configManager);
panel.init();
return panel;
}
} }

View File

@@ -25,9 +25,10 @@
*/ */
package net.runelite.client.plugins.devtools; 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.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout; import java.awt.GridLayout;
import java.util.Collection; import java.util.Collection;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -43,16 +44,12 @@ import javax.swing.tree.DefaultTreeModel;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.widgets.Widget; 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.api.widgets.WidgetItem;
import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.PluginPanel;
@Slf4j @Slf4j
public class DevToolsPanel extends PluginPanel public class DevToolsPanel extends PluginPanel
{ {
private final EmptyBorder PADDING_BORDER = new EmptyBorder(3, 3, 3, 3);
private JButton renderPlayersBtn = new JButton(); private JButton renderPlayersBtn = new JButton();
private JButton renderNpcsBtn = new JButton(); private JButton renderNpcsBtn = new JButton();
private JButton renderGroundItemsBtn = new JButton(); private JButton renderGroundItemsBtn = new JButton();
@@ -61,8 +58,6 @@ public class DevToolsPanel extends PluginPanel
private JButton renderWallsBtn = new JButton(); private JButton renderWallsBtn = new JButton();
private JButton renderDecorBtn = new JButton(); private JButton renderDecorBtn = new JButton();
private JButton renderInventoryBtn = new JButton(); private JButton renderInventoryBtn = new JButton();
private JButton settingsSnapshotBtn = new JButton();
private JButton settingsClearBtn = new JButton();
private JLabel textLbl = new JLabel(); private JLabel textLbl = new JLabel();
private JLabel textColorLbl = new JLabel(); private JLabel textColorLbl = new JLabel();
@@ -80,26 +75,22 @@ public class DevToolsPanel extends PluginPanel
@Inject @Inject
public DevToolsPanel(@Nullable Client client, DevToolsPlugin plugin) public DevToolsPanel(@Nullable Client client, DevToolsPlugin plugin)
{ {
super();
this.client = client; this.client = client;
this.plugin = plugin; this.plugin = plugin;
settingsTracker = new SettingsTracker(client); settingsTracker = new SettingsTracker(client);
final JPanel borderedWrap = new JPanel();
setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); borderedWrap.setLayout(new BorderLayout(0, 3));
setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); borderedWrap.add(createOptionsPanel(), BorderLayout.NORTH);
setSize(PANEL_WIDTH, PANEL_HEIGHT); borderedWrap.add(createWidgetTreePanel(), BorderLayout.CENTER);
setLayout(new BorderLayout()); add(borderedWrap);
setVisible(true);
add(createOptionsPanel(), BorderLayout.NORTH);
add(createWidgetTreePanel(), BorderLayout.CENTER);
} }
private JPanel createOptionsPanel() private JPanel createOptionsPanel()
{ {
JPanel container = new JPanel(); JPanel container = new JPanel();
container.setLayout(new GridLayout(5, 2, 3, 3)); container.setLayout(new GridLayout(5, 2, 3, 3));
container.setBorder(PADDING_BORDER);
renderPlayersBtn = new JButton("Players"); renderPlayersBtn = new JButton("Players");
renderPlayersBtn.addActionListener(e -> renderPlayersBtn.addActionListener(e ->
@@ -165,11 +156,11 @@ public class DevToolsPanel extends PluginPanel
}); });
container.add(renderInventoryBtn); container.add(renderInventoryBtn);
settingsSnapshotBtn = new JButton("Get Settings"); JButton settingsSnapshotBtn = new JButton("Get Settings");
settingsSnapshotBtn.addActionListener(settingsTracker::snapshot); settingsSnapshotBtn.addActionListener(settingsTracker::snapshot);
container.add(settingsSnapshotBtn); container.add(settingsSnapshotBtn);
settingsClearBtn = new JButton("Clear Settings"); JButton settingsClearBtn = new JButton("Clear Settings");
settingsClearBtn.addActionListener(settingsTracker::clear); settingsClearBtn.addActionListener(settingsTracker::clear);
container.add(settingsClearBtn); container.add(settingsClearBtn);
@@ -179,7 +170,7 @@ public class DevToolsPanel extends PluginPanel
private JPanel createWidgetTreePanel() private JPanel createWidgetTreePanel()
{ {
JPanel container = new JPanel(); JPanel container = new JPanel();
container.setLayout(new BorderLayout()); container.setLayout(new BorderLayout(0, 3));
JTree tree = new JTree(new DefaultMutableTreeNode()); JTree tree = new JTree(new DefaultMutableTreeNode());
tree.setRootVisible(false); tree.setRootVisible(false);
@@ -205,7 +196,6 @@ public class DevToolsPanel extends PluginPanel
}); });
JScrollPane scrollPane = new JScrollPane(tree); JScrollPane scrollPane = new JScrollPane(tree);
scrollPane.setBorder(PADDING_BORDER);
container.add(scrollPane, BorderLayout.CENTER); container.add(scrollPane, BorderLayout.CENTER);
JButton refreshWidgetsBtn = new JButton("Refresh Widgets"); JButton refreshWidgetsBtn = new JButton("Refresh Widgets");
@@ -217,7 +207,6 @@ public class DevToolsPanel extends PluginPanel
JPanel btnContainer = new JPanel(); JPanel btnContainer = new JPanel();
btnContainer.setLayout(new BorderLayout()); btnContainer.setLayout(new BorderLayout());
btnContainer.setBorder(PADDING_BORDER);
btnContainer.add(refreshWidgetsBtn); btnContainer.add(refreshWidgetsBtn);
container.add(btnContainer, BorderLayout.NORTH); container.add(btnContainer, BorderLayout.NORTH);

View File

@@ -28,7 +28,6 @@ import com.google.inject.Binder;
import java.awt.Font; import java.awt.Font;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.inject.Inject; import javax.inject.Inject;
import javax.swing.ImageIcon;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
@@ -49,9 +48,6 @@ public class DevToolsPlugin extends Plugin
@Inject @Inject
DevToolsOverlay overlay; DevToolsOverlay overlay;
private NavigationButton navButton;
private DevToolsPanel panel;
private boolean togglePlayers; private boolean togglePlayers;
private boolean toggleNpcs; private boolean toggleNpcs;
private boolean toggleGroundItems; private boolean toggleGroundItems;
@@ -76,11 +72,11 @@ public class DevToolsPlugin extends Plugin
@Override @Override
protected void startUp() throws Exception protected void startUp() throws Exception
{ {
panel = injector.getInstance(DevToolsPanel.class); final DevToolsPanel panel = injector.getInstance(DevToolsPanel.class);
navButton = new NavigationButton("Developer Tools", () -> panel); final NavigationButton navButton = new NavigationButton(
"Developer Tools",
ImageIcon icon = new ImageIcon(ImageIO.read(getClass().getResourceAsStream("devtools_icon.png"))); ImageIO.read(getClass().getResourceAsStream("devtools_icon.png")),
navButton.getButton().setIcon(icon); () -> panel);
ui.getPluginToolbar().addNavigation(navButton); ui.getPluginToolbar().addNavigation(navButton);

View File

@@ -24,8 +24,16 @@
*/ */
package net.runelite.client.plugins.hiscore; package net.runelite.client.plugins.hiscore;
import static net.runelite.http.api.hiscore.HiscoreSkill.*;
import com.google.common.base.Strings; 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.awt.event.MouseEvent;
import java.io.IOException; import java.io.IOException;
import java.text.NumberFormat; import java.text.NumberFormat;
@@ -34,15 +42,25 @@ import java.util.List;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.inject.Inject; 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.border.Border;
import javax.swing.event.MouseInputAdapter; import javax.swing.event.MouseInputAdapter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Experience; import net.runelite.api.Experience;
import net.runelite.client.ui.IconTextField;
import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.PluginPanel;
import net.runelite.http.api.hiscore.*; import net.runelite.http.api.hiscore.HiscoreClient;
import static net.runelite.http.api.hiscore.HiscoreSkill.*; 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 @Slf4j
public class HiscorePanel extends PluginPanel public class HiscorePanel extends PluginPanel
@@ -78,19 +96,13 @@ public class HiscorePanel extends PluginPanel
public HiscorePanel() public HiscorePanel()
{ {
super();
// Panel "constants" // Panel "constants"
// This was an EtchedBorder, but the style would change when the window was maximized. // This was an EtchedBorder, but the style would change when the window was maximized.
Border subPanelBorder = BorderFactory.createLineBorder(this.getBackground().brighter(), 2); Border subPanelBorder = BorderFactory.createLineBorder(this.getBackground().brighter(), 2);
Insets subPanelInsets = new Insets(2, 4, 2, 4);
Font labelFont = UIManager.getFont("Label.font"); 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 // Create GBL to arrange sub items
GridBagLayout gridBag = new GridBagLayout(); GridBagLayout gridBag = new GridBagLayout();
setLayout(gridBag); setLayout(gridBag);
@@ -125,7 +137,7 @@ public class HiscorePanel extends PluginPanel
c.gridy = 0; c.gridy = 0;
c.weightx = 1; c.weightx = 1;
c.weighty = 0; c.weighty = 0;
c.insets = subPanelInsets; c.insets = new Insets(0, 0, 3, 0);
gridBag.setConstraints(inputPanel, c); gridBag.setConstraints(inputPanel, c);
add(inputPanel); add(inputPanel);

View File

@@ -28,7 +28,6 @@ import com.google.common.eventbus.Subscribe;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.inject.Inject; import javax.inject.Inject;
import javax.swing.ImageIcon;
import net.runelite.client.events.PlayerMenuOptionClicked; import net.runelite.client.events.PlayerMenuOptionClicked;
import net.runelite.client.menus.MenuManager; import net.runelite.client.menus.MenuManager;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
@@ -58,11 +57,11 @@ public class HiscorePlugin extends Plugin
@Override @Override
protected void startUp() throws Exception protected void startUp() throws Exception
{ {
navButton = new NavigationButton("Hiscore", () -> hiscorePanel);
hiscorePanel = injector.getInstance(HiscorePanel.class); hiscorePanel = injector.getInstance(HiscorePanel.class);
navButton = new NavigationButton(
ImageIcon icon = new ImageIcon(ImageIO.read(getClass().getResourceAsStream("hiscore.gif"))); "Hiscore",
navButton.getButton().setIcon(icon); ImageIO.read(getClass().getResourceAsStream("hiscore.gif")),
() -> hiscorePanel);
ui.getPluginToolbar().addNavigation(navButton); ui.getPluginToolbar().addNavigation(navButton);

View File

@@ -23,7 +23,7 @@
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * 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. * 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.Graphics;
import java.awt.Insets; import java.awt.Insets;

View File

@@ -30,7 +30,6 @@ import net.runelite.client.ui.PluginPanel;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.GridLayout;
import java.io.IOException; import java.io.IOException;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.HashMap; import java.util.HashMap;
@@ -42,7 +41,6 @@ import javax.swing.ImageIcon;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@Slf4j @Slf4j
@@ -50,7 +48,6 @@ public class XpPanel extends PluginPanel
{ {
private Map<Skill, JPanel> labelMap = new HashMap<>(); private Map<Skill, JPanel> labelMap = new HashMap<>();
private final XpTrackerPlugin xpTracker; private final XpTrackerPlugin xpTracker;
private JPanel statsPanel;
@Inject @Inject
@Nullable @Nullable
@@ -62,15 +59,9 @@ public class XpPanel extends PluginPanel
@Inject @Inject
public XpPanel(XpTrackerPlugin xpTracker) public XpPanel(XpTrackerPlugin xpTracker)
{ {
super();
this.xpTracker = xpTracker; 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 try
{ {
for (Skill skill : Skill.values()) for (Skill skill : Skill.values())
@@ -90,14 +81,9 @@ public class XpPanel extends PluginPanel
} }
JButton resetButton = new JButton("Reset All"); JButton resetButton = new JButton("Reset All");
resetButton.setPreferredSize(new Dimension(PANEL_WIDTH, 32));
resetButton.addActionListener((e) -> executor.execute(this::resetAllSkillXpHr)); resetButton.addActionListener((e) -> executor.execute(this::resetAllSkillXpHr));
resetButton.setPreferredSize(new Dimension(0, 32));
statsPanel.add(resetButton); add(resetButton);
JScrollPane scroll = new JScrollPane(statsPanel);
scroll.add(statsPanel);
add(statsPanel);
} }
private JButton makeSkillResetButton(Skill skill) throws IOException private JButton makeSkillResetButton(Skill skill) throws IOException
@@ -114,13 +100,12 @@ public class XpPanel extends PluginPanel
BorderLayout borderLayout = new BorderLayout(); BorderLayout borderLayout = new BorderLayout();
borderLayout.setHgap(12); borderLayout.setHgap(12);
JPanel iconLevel = new JPanel(borderLayout); 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"; String skillIcon = "/skill_icons/" + skill.getName().toLowerCase() + ".png";
log.debug("Loading skill icon from {}", skillIcon); log.debug("Loading skill icon from {}", skillIcon);
JLabel icon = new JLabel(new ImageIcon(ImageIO.read(XpPanel.class.getResourceAsStream(skillIcon)))); JLabel icon = new JLabel(new ImageIcon(ImageIO.read(XpPanel.class.getResourceAsStream(skillIcon))));
iconLevel.add(icon, BorderLayout.LINE_START); iconLevel.add(icon, BorderLayout.LINE_START);
iconLevel.add(levelLabel, BorderLayout.CENTER); iconLevel.add(levelLabel, BorderLayout.CENTER);
iconLevel.add(makeSkillResetButton(skill), BorderLayout.LINE_END); iconLevel.add(makeSkillResetButton(skill), BorderLayout.LINE_END);
@@ -131,9 +116,8 @@ public class XpPanel extends PluginPanel
{ {
int skillIdx = skill.ordinal(); int skillIdx = skill.ordinal();
xpTracker.getXpInfos()[skillIdx].reset(client.getSkillExperience(skill)); xpTracker.getXpInfos()[skillIdx].reset(client.getSkillExperience(skill));
statsPanel.remove(labelMap.get(skill)); remove(labelMap.get(skill));
statsPanel.revalidate(); revalidate();
statsPanel.repaint();
} }
public void resetAllSkillXpHr() public void resetAllSkillXpHr()
@@ -165,11 +149,10 @@ public class XpPanel extends PluginPanel
JLabel xpHr = (JLabel) skillPanel.getComponent(1); JLabel xpHr = (JLabel) skillPanel.getComponent(1);
xpHr.setText(NumberFormat.getInstance().format(skillXPInfo.getXpHr()) + " xp/hr"); xpHr.setText(NumberFormat.getInstance().format(skillXPInfo.getXpHr()) + " xp/hr");
if (skillPanel.getParent() != statsPanel) if (skillPanel.getParent() != this)
{ {
statsPanel.add(skillPanel); add(skillPanel);
statsPanel.revalidate(); revalidate();
statsPanel.repaint();
} }
} }
} }

View File

@@ -25,6 +25,7 @@
package net.runelite.client.plugins.xptracker; package net.runelite.client.plugins.xptracker;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import javax.imageio.ImageIO;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.GameState; import net.runelite.api.GameState;
import net.runelite.api.Skill; import net.runelite.api.Skill;
@@ -60,9 +61,12 @@ public class XpTrackerPlugin extends Plugin
@Override @Override
protected void startUp() throws Exception protected void startUp() throws Exception
{ {
navButton = new NavigationButton("XP Tracker", () -> xpPanel);
xpPanel = injector.getInstance(XpPanel.class); xpPanel = injector.getInstance(XpPanel.class);
navButton.getButton().setText("XP"); navButton = new NavigationButton(
"XP Tracker",
ImageIO.read(getClass().getResourceAsStream("xp.png")),
() -> xpPanel);
ui.getPluginToolbar().addNavigation(navButton); ui.getPluginToolbar().addNavigation(navButton);
} }

View File

@@ -29,10 +29,15 @@ import java.awt.Dimension;
import java.awt.event.WindowAdapter; 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.Enumeration;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.GameState; import net.runelite.api.GameState;
@@ -42,9 +47,9 @@ import org.pushingpixels.substance.internal.ui.SubstanceRootPaneUI;
@Slf4j @Slf4j
public class ClientUI extends JFrame public class ClientUI extends JFrame
{ {
private static final int PANEL_WIDTH = 809; private static final int CLIENT_WIDTH = 809;
private static final int PANEL_HEIGHT = 536; private static final int SCROLLBAR_WIDTH = 17;
private static final int EXPANDED_WIDTH = PANEL_WIDTH + PluginPanel.PANEL_WIDTH; private static final int EXPANDED_WIDTH = CLIENT_WIDTH + PluginPanel.PANEL_WIDTH + SCROLLBAR_WIDTH;
private final RuneLite runelite; private final RuneLite runelite;
private JPanel container; private JPanel container;
@@ -56,6 +61,7 @@ public class ClientUI extends JFrame
public ClientUI(RuneLite runelite) public ClientUI(RuneLite runelite)
{ {
this.runelite = runelite; this.runelite = runelite;
setUIFont(new FontUIResource(FontManager.getRunescapeFont()));
init(); init();
pack(); pack();
TitleBarPane titleBarPane = new TitleBarPane(this.getRootPane(), (SubstanceRootPaneUI)this.getRootPane().getUI()); TitleBarPane titleBarPane = new TitleBarPane(this.getRootPane(), (SubstanceRootPaneUI)this.getRootPane().getUI());
@@ -67,13 +73,28 @@ public class ClientUI extends JFrame
setVisible(true); 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() private void init()
{ {
assert SwingUtilities.isEventDispatchThread(); assert SwingUtilities.isEventDispatchThread();
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); setMinimumSize(new Dimension(CLIENT_WIDTH, 0));
addWindowListener(new WindowAdapter() addWindowListener(new WindowAdapter()
{ {
@Override @Override
@@ -120,23 +141,46 @@ public class ClientUI extends JFrame
} }
pluginPanel = panel; pluginPanel = panel;
navContainer.add(pluginPanel, BorderLayout.WEST); navContainer.add(wrapPanel(pluginPanel), BorderLayout.WEST);
container.validate(); container.validate();
this.setMinimumSize(new Dimension(EXPANDED_WIDTH, PANEL_HEIGHT)); this.setMinimumSize(new Dimension(EXPANDED_WIDTH, 0));
} }
void contract() void contract()
{ {
navContainer.remove(1); navContainer.remove(1);
container.validate(); container.validate();
this.setMinimumSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT)); this.setMinimumSize(new Dimension(CLIENT_WIDTH, 0));
if (this.getWidth() == EXPANDED_WIDTH) if (this.getWidth() == EXPANDED_WIDTH)
{ {
this.setSize(PANEL_WIDTH, PANEL_HEIGHT); this.setSize(CLIENT_WIDTH, getHeight());
} }
pluginPanel = null; 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() private void checkExit()
{ {
Client client = runelite.getClient(); Client client = runelite.getClient();

View File

@@ -24,40 +24,29 @@
*/ */
package net.runelite.client.ui; package net.runelite.client.ui;
import java.awt.Image;
import java.util.function.Supplier; import java.util.function.Supplier;
import javax.swing.ImageIcon;
import javax.swing.JButton; 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<PluginPanel> panelSupplier; private final Supplier<PluginPanel> panelSupplier;
private String name; public NavigationButton(String name, Image icon)
public NavigationButton(String name)
{ {
this.name = name; this(name, icon, null);
this.panelSupplier = null;
} }
public NavigationButton(String name, Supplier<PluginPanel> panelSupplier) public NavigationButton(String name, Image icon, Supplier<PluginPanel> panelSupplier)
{ {
this.name = name; super();
setToolTipText(name);
setIcon(new ImageIcon(icon));
this.panelSupplier = panelSupplier; this.panelSupplier = panelSupplier;
} }
public JButton getButton()
{
return button;
}
public Supplier<PluginPanel> getPanelSupplier()
{
return panelSupplier;
}
public String getName()
{
return name;
}
} }

View File

@@ -24,9 +24,27 @@
*/ */
package net.runelite.client.ui; package net.runelite.client.ui;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JPanel; 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);
}
} }

View File

@@ -52,18 +52,18 @@ public class PluginToolbar extends JToolBar
public void addNavigation(NavigationButton button) public void addNavigation(NavigationButton button)
{ {
button.getButton().addActionListener((ae) -> onClick(button)); button.addActionListener((ae) -> onClick(button));
button.getButton().setToolTipText(button.getName()); button.setToolTipText(button.getName());
buttons.add(button); buttons.add(button);
add(button.getButton()); add(button);
revalidate(); revalidate();
} }
public void removeNavigation(NavigationButton button) public void removeNavigation(NavigationButton button)
{ {
buttons.remove(button); buttons.remove(button);
remove(button.getButton()); remove(button);
revalidate(); revalidate();
} }
@@ -77,7 +77,7 @@ public class PluginToolbar extends JToolBar
if (current != null) if (current != null)
{ {
current.getButton().setSelected(false); current.setSelected(false);
} }
if (current == button) if (current == button)
@@ -92,7 +92,7 @@ public class PluginToolbar extends JToolBar
ui.expand(pluginPanel); ui.expand(pluginPanel);
current = button; current = button;
current.getButton().setSelected(true); current.setSelected(true);
} }
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB