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 <slusnucky@gmail.com>
This commit is contained in:
Tomas Slusny
2018-03-07 19:02:18 +01:00
parent 381b111b4a
commit 059f92ad6c
3 changed files with 116 additions and 125 deletions

View File

@@ -25,22 +25,20 @@
package net.runelite.client.plugins.account; package net.runelite.client.plugins.account;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
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.JButton;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.events.SessionClose; import net.runelite.api.events.SessionClose;
import net.runelite.api.events.SessionOpen;
import net.runelite.client.account.AccountSession; import net.runelite.client.account.AccountSession;
import net.runelite.client.account.SessionManager; import net.runelite.client.account.SessionManager;
import net.runelite.api.events.SessionOpen;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; 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.ui.TitleToolbar;
import net.runelite.client.util.RunnableExceptionLogger; import net.runelite.client.util.RunnableExceptionLogger;
@@ -55,13 +53,13 @@ public class AccountPlugin extends Plugin
private SessionManager sessionManager; private SessionManager sessionManager;
@Inject @Inject
private ClientUI ui; private TitleToolbar titleToolbar;
@Inject @Inject
private ScheduledExecutorService executor; private ScheduledExecutorService executor;
private JButton loginButton; private NavigationButton loginButton;
private JButton logoutButton; private NavigationButton logoutButton;
private static final BufferedImage LOGIN_IMAGE, LOGOUT_IMAGE; private static final BufferedImage LOGIN_IMAGE, LOGOUT_IMAGE;
@@ -84,47 +82,45 @@ public class AccountPlugin extends Plugin
@Override @Override
protected void startUp() throws Exception protected void startUp() throws Exception
{ {
loginButton = new JButton(); loginButton = NavigationButton.builder()
loginButton.setToolTipText("Login"); .icon(LOGIN_IMAGE)
loginButton.addActionListener(this::loginClick); .tooltip("Login")
.onClick(this::loginClick)
.build();
logoutButton = new JButton(); logoutButton = NavigationButton.builder()
logoutButton.setToolTipText("Logout"); .icon(LOGOUT_IMAGE)
logoutButton.addActionListener(this::logoutClick); .tooltip("Logout")
.onClick(this::logoutClick)
.build();
addAndRemoveButtons(); addAndRemoveButtons();
} }
private void addAndRemoveButtons() private void addAndRemoveButtons()
{ {
TitleToolbar tb = ui.getTitleToolbar(); titleToolbar.removeNavigation(loginButton);
tb.remove(loginButton); titleToolbar.removeNavigation(logoutButton);
tb.remove(logoutButton); titleToolbar.addNavigation(sessionManager.getAccountSession() == null
if (sessionManager.getAccountSession() == null) ? loginButton
{ : logoutButton);
tb.addButton(loginButton, LOGIN_IMAGE, LOGIN_IMAGE);
}
else
{
tb.addButton(logoutButton, LOGOUT_IMAGE, LOGOUT_IMAGE);
}
} }
@Override @Override
protected void shutDown() throws Exception protected void shutDown() throws Exception
{ {
ui.getTitleToolbar().remove(loginButton); titleToolbar.removeNavigation(loginButton);
ui.getTitleToolbar().remove(logoutButton); titleToolbar.removeNavigation(logoutButton);
} }
private void loginClick(ActionEvent ae) private void loginClick()
{ {
executor.execute(RunnableExceptionLogger.wrap(sessionManager::login)); 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", "Are you sure you want to logout?", "Logout Confirmation",
JOptionPane.YES_NO_OPTION)) JOptionPane.YES_NO_OPTION))
{ {

View File

@@ -26,15 +26,16 @@ package net.runelite.client.plugins.info;
import com.google.common.eventbus.EventBus; import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import java.awt.Font;
import com.google.inject.Inject; 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 java.util.concurrent.ScheduledExecutorService;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.GroupLayout; import javax.swing.GroupLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.LayoutStyle; import javax.swing.LayoutStyle;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkEvent;
@@ -46,22 +47,28 @@ import net.runelite.client.RuneLiteProperties;
import net.runelite.client.account.SessionManager; import net.runelite.client.account.SessionManager;
import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.events.ClientUILoaded; 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.FontManager;
import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.PluginPanel;
import net.runelite.client.ui.TitleToolbar;
import net.runelite.client.util.RunnableExceptionLogger; import net.runelite.client.util.RunnableExceptionLogger;
import net.runelite.client.util.SwingUtil;
import org.pushingpixels.substance.internal.SubstanceSynapse;
@Slf4j @Slf4j
public class InfoPanel extends PluginPanel 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 @Inject
@Nullable @Nullable
private Client client; private Client client;
@Inject @Inject
private ClientUI clientUI; private TitleToolbar titleToolbar;
@Inject @Inject
private RuneLiteConfig runeliteConfig; private RuneLiteConfig runeliteConfig;
@@ -79,9 +86,7 @@ public class InfoPanel extends PluginPanel
private ScheduledExecutorService executor; private ScheduledExecutorService executor;
private final GroupLayout layout = new GroupLayout(this); private final GroupLayout layout = new GroupLayout(this);
private final ClientTitleToolbar titleBar = new ClientTitleToolbar();
private final JPanel toolbarPanelPlaceholder = new JPanel();
private final JLabel usernameHeader = new JLabel(); private final JLabel usernameHeader = new JLabel();
private final JRichTextPane username = new JRichTextPane(); private final JRichTextPane username = new JRichTextPane();
@@ -90,8 +95,7 @@ public class InfoPanel extends PluginPanel
setLayout(layout); setLayout(layout);
final Font smallFont = FontManager.getRunescapeSmallFont(); final Font smallFont = FontManager.getRunescapeSmallFont();
titleBar.setVisible(false);
toolbarPanelPlaceholder.setVisible(false);
final JLabel runeliteVersionHeader = new JLabel("RuneLite version"); final JLabel runeliteVersionHeader = new JLabel("RuneLite version");
runeliteVersionHeader.setFont(smallFont); runeliteVersionHeader.setFont(smallFont);
@@ -132,7 +136,7 @@ public class InfoPanel extends PluginPanel
setBorder(BorderFactory.createEmptyBorder(2, 6, 6, 6)); setBorder(BorderFactory.createEmptyBorder(2, 6, 6, 6));
layout.setVerticalGroup(layout.createSequentialGroup() layout.setVerticalGroup(layout.createSequentialGroup()
.addComponent(toolbarPanelPlaceholder) .addComponent(titleBar)
.addGap(3) .addGap(3)
.addGroup(layout.createParallelGroup() .addGroup(layout.createParallelGroup()
.addComponent(runeliteVersionHeader) .addComponent(runeliteVersionHeader)
@@ -152,16 +156,15 @@ public class InfoPanel extends PluginPanel
layout.setHorizontalGroup(layout.createParallelGroup() layout.setHorizontalGroup(layout.createParallelGroup()
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
.addComponent(toolbarPanelPlaceholder) .addComponent(titleBar))
).addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addComponent(runeliteVersionHeader) .addComponent(runeliteVersionHeader)
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
.addComponent(runescapeVersionHeader) .addComponent(runescapeVersionHeader))
).addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addComponent(runeliteVersion) .addComponent(runeliteVersion)
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE)
.addComponent(runescapeVersion) .addComponent(runescapeVersion))
)
.addComponent(usernameHeader) .addComponent(usernameHeader)
.addComponent(username) .addComponent(username)
.addComponent(issueLink) .addComponent(issueLink)
@@ -178,24 +181,12 @@ public class InfoPanel extends PluginPanel
} }
@Subscribe @Subscribe
private void onClientUILoaded(ClientUILoaded e) public void onClientUILoaded(ClientUILoaded e)
{ {
// Add the title toolbar to the infopanel if the custom chrome is disabled // Add the title toolbar to the infopanel if the custom chrome is disabled
if (!runeliteConfig.enableCustomChrome()) if (!runeliteConfig.enableCustomChrome())
{ {
try titleBar.setVisible(true);
{
SwingUtilities.invokeAndWait(() ->
{
JPanel toolbar = clientUI.getTitleToolbar();
layout.replace(toolbarPanelPlaceholder, toolbar);
toolbar.revalidate();
});
}
catch (InterruptedException | InvocationTargetException ex)
{
throw new RuntimeException(ex);
}
} }
} }
@@ -212,8 +203,58 @@ public class InfoPanel extends PluginPanel
} }
@Subscribe @Subscribe
private void onSessionClose(SessionClose e) public void onSessionClose(SessionClose e)
{ {
setNotLoggedIn(); 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();
});
}
} }

View File

@@ -28,15 +28,12 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import com.google.inject.Provides; import com.google.inject.Provides;
import java.awt.Color; import java.awt.Color;
import java.awt.Desktop;
import java.awt.FontMetrics; import java.awt.FontMetrics;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Toolkit; import java.awt.Toolkit;
import java.awt.TrayIcon; import java.awt.TrayIcon;
import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.StringSelection;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@@ -51,10 +48,6 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.inject.Inject; 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 lombok.extern.slf4j.Slf4j;
import net.runelite.api.ChatMessageType; import net.runelite.api.ChatMessageType;
import net.runelite.api.Client; 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.plugins.screenshot.imgur.ImageUploadResponse;
import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.ClientUI;
import net.runelite.client.ui.FontManager; 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.ui.overlay.OverlayRenderer;
import net.runelite.client.util.Text; import net.runelite.client.util.Text;
import net.runelite.http.api.RuneLiteAPI; import net.runelite.http.api.RuneLiteAPI;
@@ -124,13 +119,16 @@ public class ScreenshotPlugin extends Plugin
@Inject @Inject
private ClientUI clientUi; private ClientUI clientUi;
@Inject
private TitleToolbar titleToolbar;
@Inject @Inject
private OverlayRenderer overlayRenderer; private OverlayRenderer overlayRenderer;
@Inject @Inject
private ScheduledExecutorService executor; private ScheduledExecutorService executor;
private JButton titleBarButton; private NavigationButton titleBarButton;
@Provides @Provides
ScreenshotConfig getConfig(ConfigManager configManager) ScreenshotConfig getConfig(ConfigManager configManager)
@@ -140,66 +138,24 @@ public class ScreenshotPlugin extends Plugin
@Override @Override
protected void startUp() throws Exception protected void startUp() throws Exception
{
addButtonToTitleBar();
}
@Override
protected void shutDown() throws Exception
{
removeButtonFromTitlebar();
}
private void addButtonToTitleBar()
{ {
try try
{ {
BufferedImage iconImage; BufferedImage iconImage;
BufferedImage invertedIconImage;
synchronized (ImageIO.class) synchronized (ImageIO.class)
{ {
iconImage = ImageIO.read(ScreenshotPlugin.class.getResourceAsStream("screenshot.png")); iconImage = ImageIO.read(ScreenshotPlugin.class.getResourceAsStream("screenshot.png"));
invertedIconImage = ImageIO.read(ScreenshotPlugin.class.getResourceAsStream("screenshot_inverted.png"));
} }
SwingUtilities.invokeLater(() -> titleBarButton = NavigationButton.builder()
{ .tooltip("Take screenshot")
titleBarButton = new JButton(); .icon(iconImage)
titleBarButton.setToolTipText("Take screenshot"); .onClick(() -> takeScreenshot(
titleBarButton.addMouseListener(new MouseAdapter() TIME_FORMAT.format(new Date()),
{ client.getLocalPlayer() != null))
@Override .build();
public void mouseClicked(MouseEvent e)
{
super.mouseClicked(e);
if (SwingUtilities.isLeftMouseButton(e)) titleToolbar.addNavigation(titleBarButton);
{
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);
});
} }
catch (IOException ex) catch (IOException ex)
{ {
@@ -207,12 +163,10 @@ public class ScreenshotPlugin extends Plugin
} }
} }
private void removeButtonFromTitlebar() @Override
protected void shutDown() throws Exception
{ {
SwingUtilities.invokeLater(() -> titleToolbar.removeNavigation(titleBarButton);
{
clientUi.getTitleToolbar().remove(titleBarButton);
});
} }
@Subscribe @Subscribe