Add support for hiding/showing sidebar button

Draw hide/show sidebar button in top-right corner using Game's draw
hook. This will not work in Vanilla and so it is disabled in it.

Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
This commit is contained in:
Tomas Slusny
2018-11-03 18:52:15 +01:00
parent 7eb09d45af
commit 28170af13c
2 changed files with 60 additions and 1 deletions

View File

@@ -296,6 +296,9 @@ public class Hooks implements Callbacks
notifier.processFlash(graphics2d); notifier.processFlash(graphics2d);
// Draw clientUI overlays
clientUi.paintOverlays(graphics2d);
// Stretch the game image if the user has that enabled // Stretch the game image if the user has that enabled
if (client.isStretchedEnabled()) if (client.isStretchedEnabled())
{ {

View File

@@ -34,12 +34,14 @@ import java.awt.Container;
import java.awt.Cursor; import java.awt.Cursor;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration; import java.awt.GraphicsConfiguration;
import java.awt.LayoutManager; import java.awt.LayoutManager;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.TrayIcon; import java.awt.TrayIcon;
import java.awt.event.InputEvent; import java.awt.event.InputEvent;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.inject.Inject; import javax.inject.Inject;
@@ -64,6 +66,8 @@ import net.runelite.api.Player;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameStateChanged;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.RuneLite; import net.runelite.client.RuneLite;
import net.runelite.client.RuneLiteProperties; import net.runelite.client.RuneLiteProperties;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
@@ -75,6 +79,9 @@ import net.runelite.client.config.WarningOnExit;
import net.runelite.client.events.NavigationButtonAdded; import net.runelite.client.events.NavigationButtonAdded;
import net.runelite.client.events.NavigationButtonRemoved; import net.runelite.client.events.NavigationButtonRemoved;
import net.runelite.client.input.KeyManager; import net.runelite.client.input.KeyManager;
import net.runelite.client.input.MouseAdapter;
import net.runelite.client.input.MouseListener;
import net.runelite.client.input.MouseManager;
import net.runelite.client.ui.skin.SubstanceRuneLiteLookAndFeel; import net.runelite.client.ui.skin.SubstanceRuneLiteLookAndFeel;
import net.runelite.client.util.HotkeyListener; import net.runelite.client.util.HotkeyListener;
import net.runelite.client.util.ImageUtil; import net.runelite.client.util.ImageUtil;
@@ -114,10 +121,12 @@ public class ClientUI
private final RuneLiteProperties properties; private final RuneLiteProperties properties;
private final RuneLiteConfig config; private final RuneLiteConfig config;
private final KeyManager keyManager; private final KeyManager keyManager;
private final MouseManager mouseManager;
private final Applet client; private final Applet client;
private final ConfigManager configManager; private final ConfigManager configManager;
private final Provider<ClientThread> clientThreadProvider; private final Provider<ClientThread> clientThreadProvider;
private final CardLayout cardLayout = new CardLayout(); private final CardLayout cardLayout = new CardLayout();
private final Rectangle sidebarButtonPosition = new Rectangle();
private ContainableFrame frame; private ContainableFrame frame;
private JPanel navContainer; private JPanel navContainer;
private PluginPanel pluginPanel; private PluginPanel pluginPanel;
@@ -136,6 +145,7 @@ public class ClientUI
RuneLiteProperties properties, RuneLiteProperties properties,
RuneLiteConfig config, RuneLiteConfig config,
KeyManager keyManager, KeyManager keyManager,
MouseManager mouseManager,
@Nullable Applet client, @Nullable Applet client,
ConfigManager configManager, ConfigManager configManager,
Provider<ClientThread> clientThreadProvider) Provider<ClientThread> clientThreadProvider)
@@ -143,6 +153,7 @@ public class ClientUI
this.properties = properties; this.properties = properties;
this.config = config; this.config = config;
this.keyManager = keyManager; this.keyManager = keyManager;
this.mouseManager = mouseManager;
this.client = client; this.client = client;
this.configManager = configManager; this.configManager = configManager;
this.clientThreadProvider = clientThreadProvider; this.clientThreadProvider = clientThreadProvider;
@@ -352,6 +363,24 @@ public class ClientUI
keyManager.registerKeyListener(sidebarListener); keyManager.registerKeyListener(sidebarListener);
// Add mouse listener
final MouseListener mouseListener = new MouseAdapter()
{
@Override
public MouseEvent mousePressed(MouseEvent mouseEvent)
{
if (SwingUtilities.isLeftMouseButton(mouseEvent) && sidebarButtonPosition.contains(mouseEvent.getPoint()))
{
SwingUtilities.invokeLater(ClientUI.this::toggleSidebar);
mouseEvent.consume();
}
return mouseEvent;
}
};
mouseManager.registerMouseListener(mouseListener);
// Decorate window with custom chrome and titlebar if needed // Decorate window with custom chrome and titlebar if needed
final boolean withTitleBar = config.enableCustomChrome(); final boolean withTitleBar = config.enableCustomChrome();
frame.setUndecorated(withTitleBar); frame.setUndecorated(withTitleBar);
@@ -583,12 +612,39 @@ public class ClientUI
return new Point(0, 0); return new Point(0, 0);
} }
/**
* Paint UI related overlays to target graphics
* @param graphics target graphics
*/
public void paintOverlays(final Graphics2D graphics)
{
if (!(client instanceof Client) || config.enableCustomChrome())
{
return;
}
final Client client = (Client)this.client;
final int x = client.getRealDimensions().width - SIDEBAR_OPEN.getWidth() - 5;
// Offset sidebar button if resizable mode logout is visible
final Widget logoutButton = client.getWidget(WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_LOGOUT_BUTTON);
final int y = logoutButton != null && !logoutButton.isHidden() && logoutButton.getParent() != null
? logoutButton.getHeight() + logoutButton.getRelativeY() + 5
: 5;
final BufferedImage image = sidebarOpen ? SIDEBAR_OPEN : SIDEBAR_CLOSE;
graphics.drawImage(image, x, y, null);
// Update button dimensions
sidebarButtonPosition.setBounds(x, y, image.getWidth(), image.getHeight());
}
public GraphicsConfiguration getGraphicsConfiguration() public GraphicsConfiguration getGraphicsConfiguration()
{ {
return frame.getGraphicsConfiguration(); return frame.getGraphicsConfiguration();
} }
void toggleSidebar() private void toggleSidebar()
{ {
// Toggle sidebar open // Toggle sidebar open
boolean isSidebarOpen = sidebarOpen; boolean isSidebarOpen = sidebarOpen;