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 a90f2a73c3..8465bbbef8 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
@@ -28,16 +28,13 @@ import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Inject;
import java.awt.Font;
-import java.awt.image.BufferedImage;
import java.util.concurrent.ScheduledExecutorService;
import javax.annotation.Nullable;
+import javax.inject.Singleton;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
-import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
import javax.swing.LayoutStyle;
import javax.swing.SwingUtilities;
import javax.swing.event.HyperlinkEvent;
@@ -54,12 +51,11 @@ 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
+@Singleton
public class InfoPanel extends PluginPanel
{
private static final int TITLEBAR_SIZE = 23;
@@ -69,9 +65,6 @@ public class InfoPanel extends PluginPanel
@Nullable
private Client client;
- @Inject
- private TitleToolbar titleToolbar;
-
@Inject
private RuneLiteConfig runeliteConfig;
@@ -97,7 +90,7 @@ public class InfoPanel extends PluginPanel
setLayout(layout);
final Font smallFont = FontManager.getRunescapeSmallFont();
- titleBar.setVisible(false);
+ updateTitleBar();
final JLabel runeliteVersionHeader = new JLabel("RuneLite version");
runeliteVersionHeader.setFont(smallFont);
@@ -125,7 +118,8 @@ public class InfoPanel extends PluginPanel
}
}
});
- setNotLoggedIn();
+
+ updateLoggedIn();
final JRichTextPane issueLink = new JRichTextPane("text/html",
"RuneLite is open source!
"
@@ -175,39 +169,48 @@ public class InfoPanel extends PluginPanel
eventBus.register(this);
}
- private void setNotLoggedIn()
+ private void updateLoggedIn()
{
- username.setContentType("text/html");
- username.setText("Login to sync settings to the cloud.");
- usernameHeader.setText("Not logged in");
- }
+ final String name = sessionManager.getAccountSession() != null
+ ? sessionManager.getAccountSession().getUsername()
+ : null;
- @Subscribe
- public void onClientUILoaded(ClientUILoaded e)
- {
- // Add the title toolbar to the infopanel if the custom chrome is disabled
- if (!runeliteConfig.enableCustomChrome())
- {
- titleBar.setVisible(true);
- }
- }
-
- @Subscribe
- public void onSessionOpen(SessionOpen sessionOpen)
- {
- String name = sessionManager.getAccountSession().getUsername();
if (name != null)
{
username.setContentType("text/plain");
username.setText(name);
usernameHeader.setText("Logged in as");
}
+ else
+ {
+ username.setContentType("text/html");
+ username.setText("Login to sync settings to the cloud.");
+ usernameHeader.setText("Not logged in");
+ }
+ }
+
+ private void updateTitleBar()
+ {
+ titleBar.setVisible(!runeliteConfig.enableCustomChrome());
+ }
+
+ @Subscribe
+ public void onClientUILoaded(ClientUILoaded e)
+ {
+ // Add the title toolbar to the infopanel if the custom chrome is disabled
+ updateTitleBar();
+ }
+
+ @Subscribe
+ public void onSessionOpen(SessionOpen sessionOpen)
+ {
+ updateLoggedIn();
}
@Subscribe
public void onSessionClose(SessionClose e)
{
- setNotLoggedIn();
+ updateLoggedIn();
}
@Subscribe
@@ -220,38 +223,8 @@ public class InfoPanel extends PluginPanel
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());
- }
-
- if (event.getButton().getPopup() != null)
- {
- final JPopupMenu popupMenu = new JPopupMenu();
-
- event.getButton().getPopup().forEach((name, callback) ->
- {
- final JMenuItem menuItem = new JMenuItem(name);
- menuItem.addActionListener((e) -> callback.run());
- popupMenu.add(menuItem);
- });
-
- button.setComponentPopupMenu(popupMenu);
- }
-
- event.getButton().setOnSelect(() -> button.setSelected(event.getButton().isSelected()));
-
+ final JButton button = SwingUtil.createSwingButton(event.getButton(), iconSize, null);
titleBar.addComponent(event.getButton(), button);
titleBar.revalidate();
titleBar.repaint();
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java
index bb14b4ea3e..a79bf2bec5 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/info/InfoPlugin.java
@@ -27,10 +27,12 @@ package net.runelite.client.plugins.info;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.inject.Inject;
+import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.ui.NavigationButton;
import net.runelite.client.ui.PluginToolbar;
+import net.runelite.client.ui.TitleToolbar;
@PluginDescriptor(
name = "Info Panel",
@@ -41,6 +43,12 @@ public class InfoPlugin extends Plugin
@Inject
private PluginToolbar pluginToolbar;
+ @Inject
+ private TitleToolbar titleToolbar;
+
+ @Inject
+ private RuneLiteConfig runeLiteConfig;
+
private NavigationButton navButton;
@Override
@@ -62,6 +70,11 @@ public class InfoPlugin extends Plugin
.build();
pluginToolbar.addNavigation(navButton);
+
+ if (!runeLiteConfig.enableCustomChrome())
+ {
+ titleToolbar.refresh();
+ }
}
@Override
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 cbd14b89b2..39d3d40ee8 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
@@ -44,13 +44,10 @@ import javax.imageio.ImageIO;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.swing.BoxLayout;
-import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
-import javax.swing.JMenuItem;
import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
import javax.swing.JRootPane;
import javax.swing.SwingUtilities;
import lombok.Getter;
@@ -70,7 +67,6 @@ import net.runelite.client.util.OSType;
import net.runelite.client.util.OSXUtil;
import net.runelite.client.util.SwingUtil;
import org.pushingpixels.substance.api.skin.SubstanceGraphiteLookAndFeel;
-import org.pushingpixels.substance.internal.SubstanceSynapse;
import org.pushingpixels.substance.internal.utils.SubstanceCoreUtilities;
import org.pushingpixels.substance.internal.utils.SubstanceTitlePaneUtilities;
@@ -202,45 +198,37 @@ public class ClientUI
@Subscribe
public void onPluginToolbarButtonAdded(final PluginToolbarButtonAdded event)
{
- final JButton button = new JButton();
- button.setName(event.getButton().getName());
- button.setToolTipText(event.getButton().getTooltip());
- button.setToolTipText(event.getButton().getTooltip());
- button.setIcon(new ImageIcon(event.getButton().getIcon()));
- button.addActionListener(e ->
+ SwingUtilities.invokeLater(() ->
{
- final PluginPanel panel = event.getButton().getPanel();
+ final JButton button = SwingUtil.createSwingButton(event.getButton(), 0, (jButton) ->
+ {
+ final PluginPanel panel = event.getButton().getPanel();
- if (panel == null)
- {
- return;
- }
+ if (panel == null)
+ {
+ return;
+ }
- if (currentButton != null)
- {
- currentButton.setSelected(false);
- }
+ if (currentButton != null)
+ {
+ currentButton.setSelected(false);
+ }
- if (currentButton == button)
- {
- contract();
- currentButton = null;
- }
- else
- {
- currentButton = button;
- currentButton.setSelected(true);
- expand(panel);
- }
+ if (currentButton == jButton)
+ {
+ contract();
+ currentButton = null;
+ }
+ else
+ {
+ currentButton = jButton;
+ currentButton.setSelected(true);
+ expand(panel);
+ }
+ });
- if (event.getButton().getOnClick() != null)
- {
- event.getButton().getOnClick().run();
- }
+ pluginToolbar.addComponent(event.getIndex(), event.getButton(), button);
});
-
- event.getButton().setOnSelect(() -> button.setSelected(event.getButton().isSelected()));
- SwingUtilities.invokeLater(() -> pluginToolbar.addComponent(event.getIndex(), event.getButton(), button));
}
@Subscribe
@@ -252,44 +240,15 @@ public class ClientUI
@Subscribe
public void onTitleToolbarButtonAdded(final TitleToolbarButtonAdded event)
{
- if (!config.enableCustomChrome())
+ if (!config.enableCustomChrome() && !SwingUtil.isCustomTitlePanePresent(frame))
{
return;
}
SwingUtilities.invokeLater(() ->
{
-
final int iconSize = ClientTitleToolbar.TITLEBAR_SIZE - 6;
- final BufferedImage scaledImage = SwingUtil.resizeImage(event.getButton().getIcon(), iconSize, iconSize);
- final JButton button = new JButton();
- button.setName(event.getButton().getName());
- button.setToolTipText(event.getButton().getTooltip());
- button.setIcon(new ImageIcon(scaledImage));
- button.setRolloverIcon(new ImageIcon(SwingUtil.createInvertedImage(scaledImage)));
- button.putClientProperty(SubstanceSynapse.FLAT_LOOK, Boolean.TRUE);
- button.setFocusable(false);
-
- if (event.getButton().getOnClick() != null)
- {
- button.addActionListener(e -> event.getButton().getOnClick().run());
- }
-
- if (event.getButton().getPopup() != null)
- {
- final JPopupMenu popupMenu = new JPopupMenu();
-
- event.getButton().getPopup().forEach((name, callback) ->
- {
- final JMenuItem menuItem = new JMenuItem(name);
- menuItem.addActionListener((e) -> callback.run());
- popupMenu.add(menuItem);
- });
-
- button.setComponentPopupMenu(popupMenu);
- }
-
- event.getButton().setOnSelect(() -> button.setSelected(event.getButton().isSelected()));
+ final JButton button = SwingUtil.createSwingButton(event.getButton(), iconSize, null);
titleToolbar.addComponent(event.getButton(), button);
});
}
@@ -297,7 +256,7 @@ public class ClientUI
@Subscribe
public void onTitleToolbarButtonRemoved(final TitleToolbarButtonRemoved event)
{
- if (!config.enableCustomChrome())
+ if (!config.enableCustomChrome() && !SwingUtil.isCustomTitlePanePresent(frame))
{
return;
}
diff --git a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java
index e5b9a29444..0eaac05395 100644
--- a/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java
+++ b/runelite-client/src/main/java/net/runelite/client/util/SwingUtil.java
@@ -31,22 +31,24 @@ import java.awt.Frame;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
-import java.awt.RenderingHints;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
+import java.awt.Window;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
-import java.awt.image.LookupOp;
-import java.awt.image.LookupTable;
import java.util.Enumeration;
import java.util.concurrent.Callable;
+import java.util.function.Consumer;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
import javax.swing.JFrame;
+import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.LookAndFeel;
@@ -56,6 +58,9 @@ import javax.swing.UnsupportedLookAndFeelException;
import static javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE;
import javax.swing.plaf.FontUIResource;
import lombok.extern.slf4j.Slf4j;
+import net.runelite.client.ui.NavigationButton;
+import org.pushingpixels.substance.internal.SubstanceSynapse;
+import org.pushingpixels.substance.internal.utils.SubstanceCoreUtilities;
/**
* Various Swing utilities.
@@ -234,44 +239,7 @@ public class SwingUtil
frame.setMinimumSize(frame.getLayout().minimumLayoutSize(frame));
}
- /**
- * Create inverted buffered image
- *
- * @param image buffered image
- * @return inverted buffered image
- */
- public static BufferedImage createInvertedImage(BufferedImage image)
- {
- if (image.getType() != BufferedImage.TYPE_INT_ARGB)
- {
- image = convertToARGB(image);
- }
-
- final LookupTable lookup = new LookupTable(0, 4)
- {
- @Override
- public int[] lookupPixel(int[] src, int[] dest)
- {
- dest[0] = 255 - src[0];
- dest[1] = 255 - src[1];
- dest[2] = 255 - src[2];
- return dest;
- }
- };
-
- final LookupOp op = new LookupOp(lookup, new RenderingHints(null));
- return op.filter(image, null);
- }
-
- /**
- * Resize buffered image.
- *
- * @param image the image
- * @param newWidth the new width
- * @param newHeight the new height
- * @return the buffered image
- */
- public static BufferedImage resizeImage(BufferedImage image, int newWidth, int newHeight)
+ private static BufferedImage resizeImage(BufferedImage image, int newWidth, int newHeight)
{
final Image tmp = image.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH);
final BufferedImage dimg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
@@ -282,15 +250,69 @@ public class SwingUtil
return dimg;
}
- private static BufferedImage convertToARGB(final BufferedImage image)
+ /**
+ * Create swing button from navigation button.
+ *
+ * @param navigationButton the navigation button
+ * @param iconSize the icon size (in case it is 0 default icon size will be used)
+ * @param specialCallback the special callback
+ * @return the swing button
+ */
+ public static JButton createSwingButton(
+ @Nonnull final NavigationButton navigationButton,
+ int iconSize,
+ @Nullable final Consumer specialCallback)
{
- final BufferedImage newImage = new BufferedImage(
- image.getWidth(), image.getHeight(),
- BufferedImage.TYPE_INT_ARGB);
- final Graphics2D g = newImage.createGraphics();
- g.drawImage(image, 0, 0, null);
- g.dispose();
- return newImage;
+ final BufferedImage scaledImage = iconSize > 0
+ ? resizeImage(navigationButton.getIcon(), iconSize, iconSize)
+ : navigationButton.getIcon();
+
+ final JButton button = new JButton();
+ button.setName(navigationButton.getName());
+ button.setToolTipText(navigationButton.getTooltip());
+ button.setIcon(new ImageIcon(scaledImage));
+ button.putClientProperty(SubstanceSynapse.FLAT_LOOK, Boolean.TRUE);
+ button.setFocusable(false);
+ button.addActionListener(e ->
+ {
+ if (specialCallback != null)
+ {
+ specialCallback.accept(button);
+ }
+
+ if (navigationButton.getOnClick() != null)
+ {
+ navigationButton.getOnClick().run();
+ }
+ });
+
+ if (navigationButton.getPopup() != null)
+ {
+ final JPopupMenu popupMenu = new JPopupMenu();
+
+ navigationButton.getPopup().forEach((name, callback) ->
+ {
+ final JMenuItem menuItem = new JMenuItem(name);
+ menuItem.addActionListener((e) -> callback.run());
+ popupMenu.add(menuItem);
+ });
+
+ button.setComponentPopupMenu(popupMenu);
+ }
+
+ navigationButton.setOnSelect(() -> button.setSelected(navigationButton.isSelected()));
+ return button;
+ }
+
+ /**
+ * Checks if custom substance title pane is present.
+ *
+ * @param frame the parent frame
+ * @return true if title pane is present
+ */
+ public static boolean isCustomTitlePanePresent(final Window frame)
+ {
+ return SubstanceCoreUtilities.getTitlePaneComponent(frame) != null;
}
}