From 059f92ad6cc769dbbd83728d58e358ed0e6d9c80 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Wed, 7 Mar 2018 19:02:18 +0100 Subject: [PATCH] Make plugins work with new title toolbar - Change info panel to support new hooks - Change plugins to use NavigationButton for adding buttons to titleToolbar Signed-off-by: Tomas Slusny --- .../client/plugins/account/AccountPlugin.java | 54 ++++----- .../client/plugins/info/InfoPanel.java | 107 ++++++++++++------ .../plugins/screenshot/ScreenshotPlugin.java | 80 +++---------- 3 files changed, 116 insertions(+), 125 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 d7c367177a..01ceaf4a72 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 @@ -25,22 +25,20 @@ package net.runelite.client.plugins.account; import com.google.common.eventbus.Subscribe; -import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.concurrent.ScheduledExecutorService; import javax.imageio.ImageIO; import javax.inject.Inject; -import javax.swing.JButton; import javax.swing.JOptionPane; import lombok.extern.slf4j.Slf4j; import net.runelite.api.events.SessionClose; +import net.runelite.api.events.SessionOpen; import net.runelite.client.account.AccountSession; import net.runelite.client.account.SessionManager; -import net.runelite.api.events.SessionOpen; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.ui.ClientUI; +import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.TitleToolbar; import net.runelite.client.util.RunnableExceptionLogger; @@ -55,13 +53,13 @@ public class AccountPlugin extends Plugin private SessionManager sessionManager; @Inject - private ClientUI ui; + private TitleToolbar titleToolbar; @Inject private ScheduledExecutorService executor; - private JButton loginButton; - private JButton logoutButton; + private NavigationButton loginButton; + private NavigationButton logoutButton; private static final BufferedImage LOGIN_IMAGE, LOGOUT_IMAGE; @@ -84,47 +82,45 @@ public class AccountPlugin extends Plugin @Override protected void startUp() throws Exception { - loginButton = new JButton(); - loginButton.setToolTipText("Login"); - loginButton.addActionListener(this::loginClick); + loginButton = NavigationButton.builder() + .icon(LOGIN_IMAGE) + .tooltip("Login") + .onClick(this::loginClick) + .build(); - logoutButton = new JButton(); - logoutButton.setToolTipText("Logout"); - logoutButton.addActionListener(this::logoutClick); + logoutButton = NavigationButton.builder() + .icon(LOGOUT_IMAGE) + .tooltip("Logout") + .onClick(this::logoutClick) + .build(); addAndRemoveButtons(); } private void addAndRemoveButtons() { - TitleToolbar tb = ui.getTitleToolbar(); - tb.remove(loginButton); - tb.remove(logoutButton); - if (sessionManager.getAccountSession() == null) - { - tb.addButton(loginButton, LOGIN_IMAGE, LOGIN_IMAGE); - } - else - { - tb.addButton(logoutButton, LOGOUT_IMAGE, LOGOUT_IMAGE); - } + titleToolbar.removeNavigation(loginButton); + titleToolbar.removeNavigation(logoutButton); + titleToolbar.addNavigation(sessionManager.getAccountSession() == null + ? loginButton + : logoutButton); } @Override protected void shutDown() throws Exception { - ui.getTitleToolbar().remove(loginButton); - ui.getTitleToolbar().remove(logoutButton); + titleToolbar.removeNavigation(loginButton); + titleToolbar.removeNavigation(logoutButton); } - private void loginClick(ActionEvent ae) + private void loginClick() { executor.execute(RunnableExceptionLogger.wrap(sessionManager::login)); } - private void logoutClick(ActionEvent ae) + private void logoutClick() { - if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(ui, + if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(null, "Are you sure you want to logout?", "Logout Confirmation", JOptionPane.YES_NO_OPTION)) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java index c3d6030631..76c1a7bdbd 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPanel.java @@ -26,15 +26,16 @@ package net.runelite.client.plugins.info; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; -import java.awt.Font; import com.google.inject.Inject; -import java.lang.reflect.InvocationTargetException; +import java.awt.Font; +import java.awt.image.BufferedImage; import java.util.concurrent.ScheduledExecutorService; import javax.annotation.Nullable; import javax.swing.BorderFactory; import javax.swing.GroupLayout; +import javax.swing.ImageIcon; +import javax.swing.JButton; import javax.swing.JLabel; -import javax.swing.JPanel; import javax.swing.LayoutStyle; import javax.swing.SwingUtilities; import javax.swing.event.HyperlinkEvent; @@ -46,22 +47,28 @@ import net.runelite.client.RuneLiteProperties; import net.runelite.client.account.SessionManager; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.events.ClientUILoaded; -import net.runelite.client.ui.ClientUI; +import net.runelite.client.events.TitleToolbarButtonAdded; +import net.runelite.client.events.TitleToolbarButtonRemoved; +import net.runelite.client.ui.ClientTitleToolbar; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.PluginPanel; +import net.runelite.client.ui.TitleToolbar; import net.runelite.client.util.RunnableExceptionLogger; +import net.runelite.client.util.SwingUtil; +import org.pushingpixels.substance.internal.SubstanceSynapse; @Slf4j public class InfoPanel extends PluginPanel { - private final static String RUNELITE_LOGIN = "https://runelite_login/"; + private static final int TITLEBAR_SIZE = 23; + private static final String RUNELITE_LOGIN = "https://runelite_login/"; @Inject @Nullable private Client client; @Inject - private ClientUI clientUI; + private TitleToolbar titleToolbar; @Inject private RuneLiteConfig runeliteConfig; @@ -79,9 +86,7 @@ public class InfoPanel extends PluginPanel private ScheduledExecutorService executor; private final GroupLayout layout = new GroupLayout(this); - - private final JPanel toolbarPanelPlaceholder = new JPanel(); - + private final ClientTitleToolbar titleBar = new ClientTitleToolbar(); private final JLabel usernameHeader = new JLabel(); private final JRichTextPane username = new JRichTextPane(); @@ -90,8 +95,7 @@ public class InfoPanel extends PluginPanel setLayout(layout); final Font smallFont = FontManager.getRunescapeSmallFont(); - - toolbarPanelPlaceholder.setVisible(false); + titleBar.setVisible(false); final JLabel runeliteVersionHeader = new JLabel("RuneLite version"); runeliteVersionHeader.setFont(smallFont); @@ -132,7 +136,7 @@ public class InfoPanel extends PluginPanel setBorder(BorderFactory.createEmptyBorder(2, 6, 6, 6)); layout.setVerticalGroup(layout.createSequentialGroup() - .addComponent(toolbarPanelPlaceholder) + .addComponent(titleBar) .addGap(3) .addGroup(layout.createParallelGroup() .addComponent(runeliteVersionHeader) @@ -152,16 +156,15 @@ public class InfoPanel extends PluginPanel layout.setHorizontalGroup(layout.createParallelGroup() .addGroup(layout.createSequentialGroup() .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) - .addComponent(toolbarPanelPlaceholder) - ).addGroup(layout.createSequentialGroup() + .addComponent(titleBar)) + .addGroup(layout.createSequentialGroup() .addComponent(runeliteVersionHeader) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) - .addComponent(runescapeVersionHeader) - ).addGroup(layout.createSequentialGroup() + .addComponent(runescapeVersionHeader)) + .addGroup(layout.createSequentialGroup() .addComponent(runeliteVersion) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) - .addComponent(runescapeVersion) - ) + .addComponent(runescapeVersion)) .addComponent(usernameHeader) .addComponent(username) .addComponent(issueLink) @@ -178,24 +181,12 @@ public class InfoPanel extends PluginPanel } @Subscribe - private void onClientUILoaded(ClientUILoaded e) + public void onClientUILoaded(ClientUILoaded e) { // Add the title toolbar to the infopanel if the custom chrome is disabled if (!runeliteConfig.enableCustomChrome()) { - try - { - SwingUtilities.invokeAndWait(() -> - { - JPanel toolbar = clientUI.getTitleToolbar(); - layout.replace(toolbarPanelPlaceholder, toolbar); - toolbar.revalidate(); - }); - } - catch (InterruptedException | InvocationTargetException ex) - { - throw new RuntimeException(ex); - } + titleBar.setVisible(true); } } @@ -212,8 +203,58 @@ public class InfoPanel extends PluginPanel } @Subscribe - private void onSessionClose(SessionClose e) + public void onSessionClose(SessionClose e) { setNotLoggedIn(); } + + @Subscribe + public void onTitleToolbarButtonAdded(TitleToolbarButtonAdded event) + { + if (runeliteConfig.enableCustomChrome()) + { + return; + } + + SwingUtilities.invokeLater(() -> + { + + final int iconSize = TITLEBAR_SIZE - 6; + final BufferedImage scaledImage = SwingUtil.resizeImage(event.getButton().getIcon(), iconSize, iconSize); + + final JButton button = new JButton(); + button.putClientProperty(SubstanceSynapse.FLAT_LOOK, Boolean.TRUE); + button.setName(event.getButton().getName()); + button.setToolTipText(event.getButton().getTooltip()); + button.setIcon(new ImageIcon(scaledImage)); + button.setRolloverIcon(new ImageIcon(SwingUtil.createInvertedImage(scaledImage))); + + if (event.getButton().getOnClick() != null) + { + button.addActionListener(e -> event.getButton().getOnClick().run()); + } + + event.getButton().setOnSelect(() -> button.setSelected(event.getButton().isSelected())); + + titleBar.addComponent(event.getButton(), button); + titleBar.revalidate(); + titleBar.repaint(); + }); + } + + @Subscribe + public void onTitleToolbarButtonRemoved(TitleToolbarButtonRemoved event) + { + if (runeliteConfig.enableCustomChrome()) + { + return; + } + + SwingUtilities.invokeLater(() -> + { + titleBar.removeComponent(event.getButton()); + titleBar.revalidate(); + titleBar.repaint(); + }); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index c047cbdfdb..d8f37c9556 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -28,15 +28,12 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.eventbus.Subscribe; import com.google.inject.Provides; import java.awt.Color; -import java.awt.Desktop; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.TrayIcon; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; @@ -51,10 +48,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.imageio.ImageIO; import javax.inject.Inject; -import javax.swing.JButton; -import javax.swing.JMenuItem; -import javax.swing.JPopupMenu; -import javax.swing.SwingUtilities; import lombok.extern.slf4j.Slf4j; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; @@ -79,6 +72,8 @@ import net.runelite.client.plugins.screenshot.imgur.ImageUploadRequest; import net.runelite.client.plugins.screenshot.imgur.ImageUploadResponse; import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.FontManager; +import net.runelite.client.ui.NavigationButton; +import net.runelite.client.ui.TitleToolbar; import net.runelite.client.ui.overlay.OverlayRenderer; import net.runelite.client.util.Text; import net.runelite.http.api.RuneLiteAPI; @@ -124,13 +119,16 @@ public class ScreenshotPlugin extends Plugin @Inject private ClientUI clientUi; + @Inject + private TitleToolbar titleToolbar; + @Inject private OverlayRenderer overlayRenderer; @Inject private ScheduledExecutorService executor; - private JButton titleBarButton; + private NavigationButton titleBarButton; @Provides ScreenshotConfig getConfig(ConfigManager configManager) @@ -140,66 +138,24 @@ public class ScreenshotPlugin extends Plugin @Override protected void startUp() throws Exception - { - addButtonToTitleBar(); - } - - @Override - protected void shutDown() throws Exception - { - removeButtonFromTitlebar(); - } - - private void addButtonToTitleBar() { try { BufferedImage iconImage; - BufferedImage invertedIconImage; synchronized (ImageIO.class) { iconImage = ImageIO.read(ScreenshotPlugin.class.getResourceAsStream("screenshot.png")); - invertedIconImage = ImageIO.read(ScreenshotPlugin.class.getResourceAsStream("screenshot_inverted.png")); } - SwingUtilities.invokeLater(() -> - { - titleBarButton = new JButton(); - titleBarButton.setToolTipText("Take screenshot"); - titleBarButton.addMouseListener(new MouseAdapter() - { - @Override - public void mouseClicked(MouseEvent e) - { - super.mouseClicked(e); + titleBarButton = NavigationButton.builder() + .tooltip("Take screenshot") + .icon(iconImage) + .onClick(() -> takeScreenshot( + TIME_FORMAT.format(new Date()), + client.getLocalPlayer() != null)) + .build(); - if (SwingUtilities.isLeftMouseButton(e)) - { - takeScreenshot(TIME_FORMAT.format(new Date()), client.getLocalPlayer() != null); - } - } - }); - - JPopupMenu popupMenu = new JPopupMenu(); - - JMenuItem folderItem = new JMenuItem("Open screenshot folder..."); - folderItem.addActionListener(e -> - { - try - { - Desktop.getDesktop().open(RuneLite.SCREENSHOT_DIR); - } - catch (IOException ex) - { - log.warn("Error opening screenshot directory", ex); - } - }); - popupMenu.add(folderItem); - - titleBarButton.setComponentPopupMenu(popupMenu); - - clientUi.getTitleToolbar().addButton(titleBarButton, iconImage, invertedIconImage); - }); + titleToolbar.addNavigation(titleBarButton); } catch (IOException ex) { @@ -207,12 +163,10 @@ public class ScreenshotPlugin extends Plugin } } - private void removeButtonFromTitlebar() + @Override + protected void shutDown() throws Exception { - SwingUtilities.invokeLater(() -> - { - clientUi.getTitleToolbar().remove(titleBarButton); - }); + titleToolbar.removeNavigation(titleBarButton); } @Subscribe