From 497d4217376f71eb70677b63f7c1db3825feaa80 Mon Sep 17 00:00:00 2001 From: Ruben Amendoeira Date: Tue, 24 Apr 2018 05:05:25 +0100 Subject: [PATCH] Info panel redesign Restyled the whole exp trackers plugin panel to follow my proposed design style on issue #1342 - Added two new entries to the runelite properties file (github and patreon link). And addes respective getter methods in the RuneLiteProperties.java file. --- .../runelite/client/RuneLiteProperties.java | 14 +- .../client/plugins/info/InfoPanel.java | 190 ++++++++++++------ .../client/plugins/info/arrow_right.png | Bin 0 -> 122 bytes .../client/plugins/info/discord_icon.png | Bin 0 -> 16013 bytes .../client/plugins/info/github_icon.png | Bin 0 -> 16063 bytes .../client/plugins/info/patreon_icon.png | Bin 0 -> 15911 bytes .../net/runelite/client/runelite.properties | 4 +- 7 files changed, 147 insertions(+), 61 deletions(-) create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/info/arrow_right.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/info/discord_icon.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/info/github_icon.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/info/patreon_icon.png diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java b/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java index 6d840f754b..c8168b878c 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLiteProperties.java @@ -41,6 +41,8 @@ public class RuneLiteProperties private static final String RUNESCAPE_VERSION = "runescape.version"; private static final String DISCORD_APP_ID = "runelite.discord.appid"; private static final String DISCORD_INVITE = "runelite.discord.invite"; + private static final String GITHUB_LINK = "runelite.github.link"; + private static final String PATREON_LINK = "runelite.patreon.link"; private final Properties properties = new Properties(); @@ -82,4 +84,14 @@ public class RuneLiteProperties { return properties.getProperty(DISCORD_INVITE); } -} + + public String getGithubLink() + { + return properties.getProperty(GITHUB_LINK); + } + + public String getPatreonLink() + { + return properties.getProperty(PATREON_LINK); + } +} \ No newline at end of file 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 42de837fa5..778c3e262b 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 @@ -1,5 +1,6 @@ /* * Copyright (c) 2018 Abex + * Copyright (c) 2018, Psikoi * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -27,14 +28,22 @@ package net.runelite.client.plugins.info; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import com.google.inject.Inject; +import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Font; +import java.awt.GridLayout; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.IOException; import java.util.concurrent.ScheduledExecutorService; import javax.annotation.Nullable; +import javax.imageio.ImageIO; import javax.inject.Singleton; -import javax.swing.BorderFactory; -import javax.swing.GroupLayout; +import javax.swing.Box; +import javax.swing.ImageIcon; import javax.swing.JLabel; -import javax.swing.LayoutStyle; +import javax.swing.JPanel; +import javax.swing.border.EmptyBorder; import javax.swing.event.HyperlinkEvent; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; @@ -42,8 +51,10 @@ import net.runelite.api.events.SessionClose; import net.runelite.api.events.SessionOpen; import net.runelite.client.RuneLiteProperties; import net.runelite.client.account.SessionManager; +import net.runelite.client.ui.ColorScheme; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.PluginPanel; +import net.runelite.client.util.LinkBrowser; import net.runelite.client.util.RunnableExceptionLogger; @Slf4j @@ -52,6 +63,14 @@ public class InfoPanel extends PluginPanel { private static final String RUNELITE_LOGIN = "https://runelite_login/"; + private static final ImageIcon ARROW_RIGHT_ICON; + private static final ImageIcon GITHUB_ICON; + private static final ImageIcon DISCORD_ICON; + private static final ImageIcon PATREON_ICON; + + private final JLabel loggedLabel = new JLabel(); + private final JRichTextPane emailLabel = new JRichTextPane(); + @Inject @Nullable private Client client; @@ -68,33 +87,58 @@ public class InfoPanel extends PluginPanel @Inject private ScheduledExecutorService executor; - private final GroupLayout layout = new GroupLayout(this); - private final JLabel usernameHeader = new JLabel(); - private final JRichTextPane username = new JRichTextPane(); + static + { + try + { + synchronized (ImageIO.class) + { + ARROW_RIGHT_ICON = new ImageIcon(ImageIO.read(InfoPanel.class.getResourceAsStream("arrow_right.png"))); + GITHUB_ICON = new ImageIcon(ImageIO.read(InfoPanel.class.getResourceAsStream("github_icon.png"))); + DISCORD_ICON = new ImageIcon(ImageIO.read(InfoPanel.class.getResourceAsStream("discord_icon.png"))); + PATREON_ICON = new ImageIcon(ImageIO.read(InfoPanel.class.getResourceAsStream("patreon_icon.png"))); + } + } + catch (IOException e) + { + throw new RuntimeException(e); + } + } void init() { - setLayout(layout); + setLayout(new BorderLayout()); + setBackground(ColorScheme.DARK_GRAY_COLOR); + setBorder(new EmptyBorder(10, 10, 10, 10)); + + JPanel versionPanel = new JPanel(); + versionPanel.setBackground(ColorScheme.DARKER_GRAY_COLOR); + versionPanel.setBorder(new EmptyBorder(10, 10, 10, 10)); + versionPanel.setLayout(new GridLayout(0, 1)); final Font smallFont = FontManager.getRunescapeSmallFont(); - final JLabel runeliteVersionHeader = new JLabel("RuneLite version"); - runeliteVersionHeader.setFont(smallFont); - final JLabel runeliteVersion = new JLabel(runeLiteProperties.getVersion()); + JLabel version = new JLabel(htmlLabel("RuneLite version: ", runeLiteProperties.getVersion())); + version.setFont(smallFont); - final JLabel runescapeVersionHeader = new JLabel("OldSchool Engine"); - runescapeVersionHeader.setFont(smallFont); + JLabel revision = new JLabel(); + revision.setFont(smallFont); String engineVer = "Unknown"; if (client != null) { engineVer = String.format("Rev %s", runeLiteProperties.getRunescapeVersion()); } - final JLabel runescapeVersion = new JLabel(engineVer); - usernameHeader.setFont(smallFont); - username.enableAutoLinkHandler(false); - username.addHyperlinkListener(e -> + revision.setText(htmlLabel("Oldschool revision: ", engineVer)); + + loggedLabel.setForeground(ColorScheme.LIGHT_GRAY_COLOR); + loggedLabel.setFont(smallFont); + + emailLabel.setForeground(Color.WHITE); + emailLabel.setFont(smallFont); + emailLabel.enableAutoLinkHandler(false); + emailLabel.addHyperlinkListener(e -> { if (HyperlinkEvent.EventType.ACTIVATED.equals(e.getEventType()) && e.getURL() != null) { @@ -105,51 +149,74 @@ public class InfoPanel extends PluginPanel } }); + versionPanel.add(version); + versionPanel.add(revision); + versionPanel.add(Box.createGlue()); + versionPanel.add(loggedLabel); + versionPanel.add(emailLabel); + updateLoggedIn(); - final JRichTextPane issueLink = new JRichTextPane("text/html", - "RuneLite is open source!
" - + "Found an issue? Want a feature?
" - + "" - + "Open an issue on GitHub!" - + "" - ); + JPanel actionsContainer = new JPanel(); + actionsContainer.setBorder(new EmptyBorder(10, 0, 0, 0)); + actionsContainer.setOpaque(false); + actionsContainer.setLayout(new GridLayout(3, 1, 0, 10)); - setBorder(BorderFactory.createEmptyBorder(2, 6, 6, 6)); + actionsContainer.add(buildLinkPanel(GITHUB_ICON, "Report an issue or", "make a suggestion", runeLiteProperties.getGithubLink())); + actionsContainer.add(buildLinkPanel(DISCORD_ICON, "Talk to us on our", "discord server", runeLiteProperties.getDiscordInvite())); + actionsContainer.add(buildLinkPanel(PATREON_ICON, "Become a patron to", "help support RuneLite", runeLiteProperties.getPatreonLink())); - layout.setVerticalGroup(layout.createSequentialGroup() - .addGroup(layout.createParallelGroup() - .addComponent(runeliteVersionHeader) - .addComponent(runescapeVersionHeader) - ).addGroup(layout.createParallelGroup() - .addComponent(runeliteVersion) - .addComponent(runescapeVersion) - ).addGap(6) - .addComponent(usernameHeader) - .addGroup(layout.createParallelGroup() - .addComponent(username) - ) - .addGap(12) - .addComponent(issueLink) - ); - - layout.setHorizontalGroup(layout.createParallelGroup() - .addGroup(layout.createSequentialGroup() - .addComponent(runeliteVersionHeader) - .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) - .addComponent(runescapeVersionHeader)) - .addGroup(layout.createSequentialGroup() - .addComponent(runeliteVersion) - .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED, GroupLayout.PREFERRED_SIZE, Short.MAX_VALUE) - .addComponent(runescapeVersion)) - .addComponent(usernameHeader) - .addComponent(username) - .addComponent(issueLink) - ); + add(versionPanel, BorderLayout.NORTH); + add(actionsContainer, BorderLayout.CENTER); eventBus.register(this); } + /** + * Builds a link panel with a given icon, text and url to redirect to. + */ + private static JPanel buildLinkPanel(ImageIcon icon, String topText, String bottomText, String url) + { + JPanel container = new JPanel(); + container.setBackground(ColorScheme.DARKER_GRAY_COLOR); + container.setLayout(new BorderLayout()); + container.setBorder(new EmptyBorder(10, 10, 10, 10)); + container.addMouseListener(new MouseAdapter() + { + @Override + public void mousePressed(MouseEvent mouseEvent) + { + LinkBrowser.browse(url); + } + }); + + JLabel iconLabel = new JLabel(icon); + container.add(iconLabel, BorderLayout.WEST); + + JPanel textContainer = new JPanel(); + textContainer.setOpaque(false); + textContainer.setLayout(new GridLayout(2, 1)); + textContainer.setBorder(new EmptyBorder(5, 10, 5, 10)); + + JLabel topLine = new JLabel(topText); + topLine.setForeground(Color.WHITE); + topLine.setFont(FontManager.getRunescapeSmallFont()); + + JLabel bottomLine = new JLabel(bottomText); + bottomLine.setForeground(Color.WHITE); + bottomLine.setFont(FontManager.getRunescapeSmallFont()); + + textContainer.add(topLine); + textContainer.add(bottomLine); + + container.add(textContainer, BorderLayout.CENTER); + + JLabel arrowLabel = new JLabel(ARROW_RIGHT_ICON); + container.add(arrowLabel, BorderLayout.EAST); + + return container; + } + private void updateLoggedIn() { final String name = sessionManager.getAccountSession() != null @@ -158,18 +225,23 @@ public class InfoPanel extends PluginPanel if (name != null) { - username.setContentType("text/plain"); - username.setText(name); - usernameHeader.setText("Logged in as"); + emailLabel.setContentType("text/plain"); + emailLabel.setText(name); + loggedLabel.setText("Logged in as"); } else { - username.setContentType("text/html"); - username.setText("Login to sync settings to the cloud."); - usernameHeader.setText("Not logged in"); + emailLabel.setContentType("text/html"); + emailLabel.setText("Login to sync settings to the cloud."); + loggedLabel.setText("Not logged in"); } } + private static String htmlLabel(String key, String value) + { + return "" + key + "" + value + ""; + } + @Subscribe public void onSessionOpen(SessionOpen sessionOpen) { diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/info/arrow_right.png b/runelite-client/src/main/resources/net/runelite/client/plugins/info/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..92048f0c7844249c635de465efc0b258c64ccd61 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m96eneLp07OCrCVbV1N7nq5o@I zM1KDH|G%C$F}3oDrnZ7#q-wy;qCZ|0|K)%Fe_pR~b}EDD&VT>?95^FpsvH(zWC%QE VbfiC~pbBUhgQu&X%Q~loCIGE8ElvOc literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/info/discord_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/info/discord_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a5d1d5722e0365a5e429fa34940f1a8a0ada976b GIT binary patch literal 16013 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 Dz9Z8M literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/runelite.properties b/runelite-client/src/main/resources/net/runelite/client/runelite.properties index 4860325109..fa6ece9990 100644 --- a/runelite-client/src/main/resources/net/runelite/client/runelite.properties +++ b/runelite-client/src/main/resources/net/runelite/client/runelite.properties @@ -2,4 +2,6 @@ runelite.title=RuneLite runelite.version=${project.version} runescape.version=${rs.version} runelite.discord.appid=409416265891971072 -runelite.discord.invite=https://discord.gg/R4BQ8tU \ No newline at end of file +runelite.discord.invite=https://discord.gg/R4BQ8tU +runelite.github.link=https://github.com/runelite +runelite.patreon.link=https://www.patreon.com/runelite \ No newline at end of file