Skill: Combat
"; + content += "Exact Combat Level: " + StackFormatter.formatNumber(combatLevel) + "
"; + content += "Experience: " + StackFormatter.formatNumber(combatExperience) + "
"; + } + else + { + switch (skill) + { + case CLUE_SCROLL_ALL: + { + String rank = (result.getClueScrollAll().getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(result.getClueScrollAll().getRank()); + String allRank = (result.getClueScrollAll().getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(result.getClueScrollAll().getRank()); + String easyRank = (result.getClueScrollEasy().getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(result.getClueScrollEasy().getRank()); + String mediumRank = (result.getClueScrollMedium().getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(result.getClueScrollMedium().getRank()); + String hardRank = (result.getClueScrollHard().getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(result.getClueScrollHard().getRank()); + String eliteRank = (result.getClueScrollElite().getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(result.getClueScrollElite().getRank()); + String masterRank = (result.getClueScrollMaster().getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(result.getClueScrollMaster().getRank()); + String all = (result.getClueScrollAll().getLevel() == -1 ? "0" : StackFormatter.formatNumber(result.getClueScrollAll().getLevel())); + String easy = (result.getClueScrollEasy().getLevel() == -1 ? "0" : StackFormatter.formatNumber(result.getClueScrollEasy().getLevel())); + String medium = (result.getClueScrollMedium().getLevel() == -1 ? "0" : StackFormatter.formatNumber(result.getClueScrollMedium().getLevel())); + String hard = (result.getClueScrollHard().getLevel() == -1 ? "0" : StackFormatter.formatNumber(result.getClueScrollHard().getLevel())); + String elite = (result.getClueScrollElite().getLevel() == -1 ? "0" : StackFormatter.formatNumber(result.getClueScrollElite().getLevel())); + String master = (result.getClueScrollMaster().getLevel() == -1 ? "0" : StackFormatter.formatNumber(result.getClueScrollMaster().getLevel())); + content += "All: " + all + " Rank: " + allRank + "
"; + content += "Easy: " + easy + " Rank: " + easyRank + "
"; + content += "Medium: " + medium + " Rank: " + mediumRank + "
"; + content += "Hard: " + hard + " Rank: " + hardRank + "
"; + content += "Elite: " + elite + " Rank: " + eliteRank + "
"; + content += "Master: " + master + " Rank: " + masterRank + "
"; + break; + } + case BOUNTY_HUNTER_ROGUE: + { + String rank = (result.getBountyHunterRogue().getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(result.getBountyHunterRogue().getRank()); + content += "Rank: " + rank + "
"; + break; + } + case BOUNTY_HUNTER_HUNTER: + { + String rank = (result.getBountyHunterHunter().getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(result.getBountyHunterHunter().getRank()); + content += "Rank: " + rank + "
"; + break; + } + case LAST_MAN_STANDING: + { + String rank = (result.getLastManStanding().getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(result.getLastManStanding().getRank()); + content += "Rank: " + rank + "
"; + break; + } + case OVERALL: + { + Skill requestedSkill = result.getSkill(skill); + String rank = (requestedSkill.getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(requestedSkill.getRank()); + String exp = (requestedSkill.getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(requestedSkill.getExperience()); + content += "Skill: " + skill.getName() + "
"; + content += "Rank: " + rank + "
"; + content += "Experience: " + exp + "
"; + break; + } + default: + { + Skill requestedSkill = result.getSkill(skill); + + String rank = (requestedSkill.getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(requestedSkill.getRank()); + String exp = (requestedSkill.getRank() == -1) ? "Unranked" : StackFormatter.formatNumber(requestedSkill.getExperience()); + String remainingXp; + if (requestedSkill.getRank() == -1) + { + remainingXp = "Unranked"; + } + else + { + int currentLevel = Experience.getLevelForXp((int) requestedSkill.getExperience()); + remainingXp = (currentLevel + 1 <= Experience.MAX_VIRT_LEVEL) ? StackFormatter.formatNumber(Experience.getXpForLevel(currentLevel + 1) - requestedSkill.getExperience()) : "0"; + } + + content += "Skill: " + skill.getName() + "
"; + content += "Rank: " + rank + "
"; + content += "Experience: " + exp + "
"; + content += "Remaining XP: " + remainingXp + "
"; + + break; + } + } + } + } + + /** + * Adds a html progress bar to the hover information + */ + if (SKILLS.contains(skill)) + { + int currentLevel = Experience.getLevelForXp((int) result.getSkill(skill).getExperience()); + int currentXp = (int) result.getSkill(skill).getExperience(); + int xpForCurrentLevel = Experience.getXpForLevel(currentLevel); + int xpForNextLevel = currentLevel + 1 <= Experience.MAX_VIRT_LEVEL ? Experience.getXpForLevel(currentLevel + 1) : -1; + + double xpGained = currentXp - xpForCurrentLevel; + double xpGoal = xpForNextLevel != -1 ? xpForNextLevel - xpForCurrentLevel : 100; + int progress = (int) ((xpGained / xpGoal) * 100f); + + // had to wrap the bar with an empty div, if i added the margin directly to the bar, it would mess up + content += "
+ * Each tab will communicate with it's containing group when it's clicked
+ * and that group will display the tab's content on it's own display.
+ *
+ * @author Psikoi
+ */
+public class MaterialTab extends JLabel
+{
+ private static final Border SELECTED_BORDER = new CompoundBorder(
+ BorderFactory.createMatteBorder(0, 0, 1, 0, ColorScheme.BRAND_ORANGE),
+ BorderFactory.createEmptyBorder(5, 10, 5, 10));
+
+ private static final Border UNSELECTED_BORDER = BorderFactory
+ .createEmptyBorder(5, 10, 5, 10);
+
+ /* The tab's containing group */
+ private final MaterialTabGroup group;
+
+ /* The tab's associated content display */
+ @Getter
+ private final JComponent content;
+
+ /* To be execuded when the tab is selected */
+ @Setter
+ private Runnable onSelectEvent;
+
+ @Getter
+ private boolean selected;
+
+ public MaterialTab(String string, MaterialTabGroup group, JComponent content)
+ {
+ super(string);
+
+ this.group = group;
+ this.content = content;
+
+ if (selected)
+ {
+ select();
+ }
+ else
+ {
+ unselect();
+ }
+
+ addMouseListener(new MouseAdapter()
+ {
+ @Override
+ public void mousePressed(MouseEvent mouseEvent)
+ {
+ group.select(MaterialTab.this);
+ }
+ });
+ }
+
+ public void select()
+ {
+ setBorder(SELECTED_BORDER);
+ setForeground(Color.WHITE);
+ selected = true;
+ if (onSelectEvent != null)
+ {
+ onSelectEvent.run();
+ }
+ }
+
+ public void unselect()
+ {
+ setBorder(UNSELECTED_BORDER);
+ setForeground(Color.GRAY);
+ selected = false;
+ }
+}
\ No newline at end of file
diff --git a/runelite-client/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTabGroup.java b/runelite-client/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTabGroup.java
new file mode 100644
index 0000000000..67978efd37
--- /dev/null
+++ b/runelite-client/src/main/java/net/runelite/client/ui/components/materialtabs/MaterialTabGroup.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2018, Psikoi
+ * How to use these tabs:
+ *
+ * This differs from quantityToRSStack in that it displays
+ * decimals. Ex: 27100 is 27,1k (not 27k)
+ *
+ * This uses the NumberFormat singleton instead of the
+ * NUMBER_FORMATTER variable to ensure the UK locale.
+ *
+ * @param quantity The quantity to convert.
+ * @return The stack size as it would appear in RS, with decimals,
+ * with K after 100,000 and M after 10,000,000
+ */
+ public static String quantityToRSDecimalStack(int quantity)
+ {
+
+ if (quantity < 10_000)
+ {
+ return Integer.toString(quantity);
+ }
+ else if (quantity < 1_000_000)
+ {
+ if (quantity % 1000 == 0)
+ {
+ return quantity / 1000 + "K";
+ }
+ return NUMBER_FORMATTER.format(quantity).substring(0, Integer.toString(quantity).length() - 1) + "K";
+ }
+ else if (quantity < 10_000_000)
+ {
+ if (quantity % 1_000_000 == 0)
+ {
+ return quantity / 1_000_000 + "M";
+ }
+ return NUMBER_FORMATTER.format(quantity).substring(0, Integer.toString(quantity).length() - 4) + "M";
+ }
+ else if (quantity < 1_000_000_000)
+ {
+ if (quantity % 1_000_000 == 0)
+ {
+ return quantity / 1_000_000 + "M";
+ }
+ return NUMBER_FORMATTER.format(quantity).substring(0, Integer.toString(quantity).length() - 4) + "M";
+ }
+ else
+ {
+ if (quantity % 1_000_000_000 == 0)
+ {
+ return quantity / 1_000_000_000 + "B";
+ }
+ return NUMBER_FORMATTER.format(quantity).substring(0, Integer.toString(quantity).length() - 7) + "B";
+ }
+ }
+
/**
* Converts a string representation of a stack
* back to (close to) it's original value.
@@ -147,8 +202,8 @@ public class StackFormatter
*
* @param number the long number to format
* @return the formatted String
- * @exception ArithmeticException if rounding is needed with rounding
- * mode being set to RoundingMode.UNNECESSARY
+ * @throws ArithmeticException if rounding is needed with rounding
+ * mode being set to RoundingMode.UNNECESSARY
* @see java.text.Format#format
*/
public static String formatNumber(final long number)
@@ -161,8 +216,8 @@ public class StackFormatter
*
* @param number the double number to format
* @return the formatted String
- * @exception ArithmeticException if rounding is needed with rounding
- * mode being set to RoundingMode.UNNECESSARY
+ * @throws ArithmeticException if rounding is needed with rounding
+ * mode being set to RoundingMode.UNNECESSARY
* @see java.text.Format#format
*/
public static String formatNumber(double number)
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 ff5015917e..82e7ec726d 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
@@ -25,12 +25,14 @@
package net.runelite.client.util;
import java.awt.AWTException;
+import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
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;
@@ -40,6 +42,8 @@ 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.BiConsumer;
@@ -59,6 +63,7 @@ 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 net.runelite.client.ui.components.CustomScrollBarUI;
import org.pushingpixels.substance.internal.SubstanceSynapse;
import org.pushingpixels.substance.internal.utils.SubstanceCoreUtilities;
@@ -77,8 +82,13 @@ public class SwingUtil
// Force heavy-weight popups/tooltips.
// Prevents them from being obscured by the game applet.
ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false);
+ ToolTipManager.sharedInstance().setInitialDelay(300);
JPopupMenu.setDefaultLightWeightPopupEnabled(false);
+ UIManager.put("Button.foreground", Color.WHITE);
+ UIManager.put("MenuItem.foreground", Color.WHITE);
+ UIManager.put("ScrollBarUI", CustomScrollBarUI.class.getName());
+
// Do not render shadows under popups/tooltips.
// Fixes black boxes under popups that are above the game applet.
System.setProperty("jgoodies.popupDropShadowEnabled", "false");
@@ -88,6 +98,48 @@ public class SwingUtil
System.setProperty("sun.awt.noerasebackground", "true");
}
+ /**
+ * Offsets an image in the grayscale (darkens/brightens) by an offset
+ */
+ public static BufferedImage grayscaleOffset(BufferedImage image, int offset)
+ {
+ int numComponents = image.getColorModel().getNumComponents();
+ int index = numComponents - 1;
+
+ LookupTable lookup = new LookupTable(0, numComponents)
+ {
+ @Override
+ public int[] lookupPixel(int[] src, int[] dest)
+ {
+ if (dest[index] != 0)
+ {
+ dest[index] = dest[index] + offset;
+ if (dest[index] < 0)
+ {
+ dest[index] = 0;
+ }
+ else if (dest[index] > 255)
+ {
+ dest[index] = 255;
+ }
+ }
+
+ return dest;
+ }
+ };
+
+ LookupOp op = new LookupOp(lookup, new RenderingHints(null));
+ return op.filter(image, null);
+ }
+
+ /**
+ * Converts a given color to it's hexidecimal equivalent.
+ */
+ public static String toHexColor(Color color)
+ {
+ return "#" + Integer.toHexString(color.getRGB()).substring(2);
+ }
+
/**
* Safely sets Swing theme
*
@@ -210,7 +262,7 @@ public class SwingUtil
result = JOptionPane.showConfirmDialog(
frame,
"Are you sure you want to exit?", "Exit",
- JOptionPane .OK_CANCEL_OPTION,
+ JOptionPane.OK_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
}
}
@@ -258,6 +310,7 @@ public class SwingUtil
: navigationButton.getIcon();
final JButton button = new JButton();
+ button.setMaximumSize(new Dimension(30, 30));
button.setName(navigationButton.getName());
button.setToolTipText(navigationButton.getTooltip());
button.setIcon(new ImageIcon(scaledImage));
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/account/login_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/account/login_icon.png
index eed416cfd1..1ba7ac1fae 100644
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/account/login_icon.png and b/runelite-client/src/main/resources/net/runelite/client/plugins/account/login_icon.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/account/logout_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/account/logout_icon.png
index 8d8ee8c565..b1bfcd1115 100644
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/account/logout_icon.png and b/runelite-client/src/main/resources/net/runelite/client/plugins/account/logout_icon.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/config/config_edit_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/config_edit_icon.png
new file mode 100644
index 0000000000..d88ec51f71
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/config/config_edit_icon.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/config/disabled.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/disabled.png
deleted file mode 100644
index 160d431a95..0000000000
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/config/disabled.png and /dev/null differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/config/enabled.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/enabled.png
deleted file mode 100644
index a48cfcd5cc..0000000000
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/config/enabled.png and /dev/null differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/config/switchers/off.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/switchers/off.png
new file mode 100644
index 0000000000..ff25cc611a
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/config/switchers/off.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/config/switchers/on.png b/runelite-client/src/main/resources/net/runelite/client/plugins/config/switchers/on.png
new file mode 100644
index 0000000000..43028e1716
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/config/switchers/on.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/feed/icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/feed/icon.png
index 95b048b153..20ef822883 100644
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/feed/icon.png and b/runelite-client/src/main/resources/net/runelite/client/plugins/feed/icon.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/feed/reset.png b/runelite-client/src/main/resources/net/runelite/client/plugins/feed/reset.png
new file mode 100644
index 0000000000..e94f6102a5
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/feed/reset.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/arrow_left.png b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/arrow_left.png
new file mode 100644
index 0000000000..480358e6a1
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/arrow_left.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/arrow_right.png b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/arrow_right.png
new file mode 100644
index 0000000000..63ab23f273
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/arrow_right.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_icon.png
index 0783e0cd32..6455733f8f 100644
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_icon.png and b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/ge_icon.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/search.png b/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/search.png
deleted file mode 100644
index 23bf66b759..0000000000
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/grandexchange/search.png and /dev/null differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/hardcore_ironman.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/hardcore_ironman.png
index 2f4631d36e..bf70440802 100644
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/hardcore_ironman.png and b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/hardcore_ironman.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ironman.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ironman.png
index a00b92b1f8..453e0326de 100644
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ironman.png and b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ironman.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/normal.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/normal.png
index c00f4ec040..375dd4e906 100644
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/normal.png and b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/normal.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/search.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/search.png
deleted file mode 100644
index 23bf66b759..0000000000
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/search.png and /dev/null differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ultimate_ironman.png b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ultimate_ironman.png
index efa7643d97..07eb519971 100644
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ultimate_ironman.png and b/runelite-client/src/main/resources/net/runelite/client/plugins/hiscore/ultimate_ironman.png differ
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 0000000000..92048f0c78
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/info/arrow_right.png differ
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 0000000000..a5d1d5722e
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/info/discord_icon.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/info/github_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/info/github_icon.png
new file mode 100644
index 0000000000..92222740b7
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/info/github_icon.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/info/info_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/info/info_icon.png
index 565f2a48b2..f4d052870a 100644
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/info/info_icon.png and b/runelite-client/src/main/resources/net/runelite/client/plugins/info/info_icon.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/info/patreon_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/info/patreon_icon.png
new file mode 100644
index 0000000000..0a52c8d262
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/info/patreon_icon.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/kourendlibrary/panel_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/kourendlibrary/panel_icon.png
index cb569cd1be..3b116835d6 100644
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/kourendlibrary/panel_icon.png and b/runelite-client/src/main/resources/net/runelite/client/plugins/kourendlibrary/panel_icon.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/kourendlibrary/reset.png b/runelite-client/src/main/resources/net/runelite/client/plugins/kourendlibrary/reset.png
new file mode 100644
index 0000000000..e94f6102a5
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/kourendlibrary/reset.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/notes/notes_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/notes/notes_icon.png
index e94292baf1..31379ce441 100644
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/notes/notes_icon.png and b/runelite-client/src/main/resources/net/runelite/client/plugins/notes/notes_icon.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/screenshot/screenshot.png b/runelite-client/src/main/resources/net/runelite/client/plugins/screenshot/screenshot.png
index 9a4f892bd7..cae8ee2341 100644
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/screenshot/screenshot.png and b/runelite-client/src/main/resources/net/runelite/client/plugins/screenshot/screenshot.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/xptracker/reset.png b/runelite-client/src/main/resources/net/runelite/client/plugins/xptracker/reset.png
deleted file mode 100644
index 4d9d111037..0000000000
Binary files a/runelite-client/src/main/resources/net/runelite/client/plugins/xptracker/reset.png and /dev/null differ
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
diff --git a/runelite-client/src/main/resources/net/runelite/client/ui/components/error.png b/runelite-client/src/main/resources/net/runelite/client/ui/components/error.png
new file mode 100644
index 0000000000..11048a6501
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/ui/components/error.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/ui/components/loading_spinner.gif b/runelite-client/src/main/resources/net/runelite/client/ui/components/loading_spinner.gif
new file mode 100644
index 0000000000..81e7c2845d
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/ui/components/loading_spinner.gif differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/ui/components/loading_spinner_darker.gif b/runelite-client/src/main/resources/net/runelite/client/ui/components/loading_spinner_darker.gif
new file mode 100644
index 0000000000..e44fcdab65
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/ui/components/loading_spinner_darker.gif differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/ui/components/search.png b/runelite-client/src/main/resources/net/runelite/client/ui/components/search.png
new file mode 100644
index 0000000000..e68566fe4d
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/ui/components/search.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/ui/components/search_darker.png b/runelite-client/src/main/resources/net/runelite/client/ui/components/search_darker.png
new file mode 100644
index 0000000000..0d5d4608a6
Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/ui/components/search_darker.png differ
diff --git a/runelite-client/src/main/resources/net/runelite/client/ui/skin/RuneLite.colorschemes b/runelite-client/src/main/resources/net/runelite/client/ui/skin/RuneLite.colorschemes
new file mode 100644
index 0000000000..1d9ffee41b
--- /dev/null
+++ b/runelite-client/src/main/resources/net/runelite/client/ui/skin/RuneLite.colorschemes
@@ -0,0 +1,166 @@
+# Copyright (c) 2018, Tomas Slusny
+ *
+ *
+ * @author Psikoi
+ */
+public class MaterialTabGroup extends JPanel
+{
+ /* The panel on which the content tab's content will be displayed on. */
+ private final JPanel display;
+ /* A list of all the tabs contained in this group. */
+ private final Listthis skin.
+ */
+ private static final String NAME = "RuneLite";
+
+ /**
+ * Creates a new RuneLite skin.
+ */
+ ObsidianSkin()
+ {
+ final SubstanceSkin.ColorSchemes schemes = SubstanceSkin
+ .getColorSchemes(getClass().getResource(NAME + ".colorschemes"));
+ final SubstanceColorScheme activeScheme = schemes.get("RuneLite Active");
+ final SubstanceColorScheme enabledScheme = schemes.get("RuneLite Enabled");
+
+ final SubstanceColorSchemeBundle defaultSchemeBundle = new SubstanceColorSchemeBundle(
+ activeScheme, enabledScheme, enabledScheme);
+ defaultSchemeBundle.registerColorScheme(enabledScheme, 0.6f,
+ ComponentState.DISABLED_UNSELECTED);
+ defaultSchemeBundle.registerColorScheme(activeScheme, 0.6f,
+ ComponentState.DISABLED_SELECTED);
+
+ // borders
+ final SubstanceColorScheme borderDisabledSelectedScheme = schemes
+ .get("RuneLite Selected Disabled Border");
+ final SubstanceColorScheme borderScheme = schemes.get("RuneLite Border");
+ defaultSchemeBundle.registerColorScheme(borderDisabledSelectedScheme,
+ ColorSchemeAssociationKind.BORDER, ComponentState.DISABLED_SELECTED);
+ defaultSchemeBundle.registerColorScheme(borderScheme, ColorSchemeAssociationKind.BORDER);
+
+ // marks
+ final SubstanceColorScheme markActiveScheme = schemes.get("RuneLite Mark Active");
+ defaultSchemeBundle.registerColorScheme(markActiveScheme, ColorSchemeAssociationKind.MARK,
+ ComponentState.getActiveStates());
+ defaultSchemeBundle.registerColorScheme(markActiveScheme, 0.6f,
+ ColorSchemeAssociationKind.MARK, ComponentState.DISABLED_SELECTED,
+ ComponentState.DISABLED_UNSELECTED);
+
+ // separators
+ final SubstanceColorScheme separatorScheme = schemes.get("RuneLite Separator");
+ defaultSchemeBundle.registerColorScheme(separatorScheme,
+ ColorSchemeAssociationKind.SEPARATOR);
+
+ // tab borders
+ defaultSchemeBundle.registerColorScheme(schemes.get("RuneLite Tab Border"),
+ ColorSchemeAssociationKind.TAB_BORDER, ComponentState.getActiveStates());
+
+ final SubstanceColorScheme watermarkScheme = schemes.get("RuneLite Watermark");
+
+ this.registerDecorationAreaSchemeBundle(defaultSchemeBundle, watermarkScheme,
+ DecorationAreaType.NONE);
+
+ final SubstanceColorSchemeBundle decorationsSchemeBundle = new SubstanceColorSchemeBundle(
+ activeScheme, enabledScheme, enabledScheme);
+ decorationsSchemeBundle.registerColorScheme(enabledScheme, 0.5f,
+ ComponentState.DISABLED_UNSELECTED);
+
+ // borders
+ decorationsSchemeBundle.registerColorScheme(borderDisabledSelectedScheme,
+ ColorSchemeAssociationKind.BORDER, ComponentState.DISABLED_SELECTED);
+ decorationsSchemeBundle.registerColorScheme(borderScheme,
+ ColorSchemeAssociationKind.BORDER);
+
+ // marks
+ decorationsSchemeBundle.registerColorScheme(markActiveScheme,
+ ColorSchemeAssociationKind.MARK, ComponentState.getActiveStates());
+
+ // separators
+ final SubstanceColorScheme separatorDecorationsScheme = schemes
+ .get("RuneLite Decorations Separator");
+ decorationsSchemeBundle.registerColorScheme(separatorDecorationsScheme,
+ ColorSchemeAssociationKind.SEPARATOR);
+
+ final SubstanceColorScheme decorationsWatermarkScheme = schemes
+ .get("RuneLite Decorations Watermark");
+
+ this.registerDecorationAreaSchemeBundle(decorationsSchemeBundle, decorationsWatermarkScheme,
+ DecorationAreaType.TOOLBAR, DecorationAreaType.GENERAL, DecorationAreaType.FOOTER);
+
+ final SubstanceColorSchemeBundle headerSchemeBundle = new SubstanceColorSchemeBundle(activeScheme,
+ enabledScheme, enabledScheme);
+ headerSchemeBundle.registerColorScheme(enabledScheme, 0.5f,
+ ComponentState.DISABLED_UNSELECTED);
+
+ // borders
+ final SubstanceColorScheme headerBorderScheme = schemes.get("RuneLite Header Border");
+ headerSchemeBundle.registerColorScheme(borderDisabledSelectedScheme,
+ ColorSchemeAssociationKind.BORDER, ComponentState.DISABLED_SELECTED);
+ headerSchemeBundle.registerColorScheme(headerBorderScheme,
+ ColorSchemeAssociationKind.BORDER);
+ // marks
+ headerSchemeBundle.registerColorScheme(markActiveScheme, ColorSchemeAssociationKind.MARK,
+ ComponentState.getActiveStates());
+
+ headerSchemeBundle.registerHighlightColorScheme(activeScheme, 0.7f,
+ ComponentState.ROLLOVER_UNSELECTED, ComponentState.ROLLOVER_ARMED,
+ ComponentState.ARMED);
+ headerSchemeBundle.registerHighlightColorScheme(activeScheme, 0.8f,
+ ComponentState.SELECTED);
+ headerSchemeBundle.registerHighlightColorScheme(activeScheme, 1.0f,
+ ComponentState.ROLLOVER_SELECTED);
+
+ final SubstanceColorScheme headerWatermarkScheme = schemes.get("RuneLite Header Watermark");
+
+ this.registerDecorationAreaSchemeBundle(headerSchemeBundle, headerWatermarkScheme,
+ DecorationAreaType.PRIMARY_TITLE_PANE, DecorationAreaType.SECONDARY_TITLE_PANE,
+ DecorationAreaType.HEADER);
+
+ setTabFadeStart(0.2);
+ setTabFadeEnd(0.9);
+
+ // Add overlay painters to paint drop shadows along the bottom
+ // edges of toolbars and footers
+ this.addOverlayPainter(BottomShadowOverlayPainter.getInstance(),
+ DecorationAreaType.TOOLBAR);
+ this.addOverlayPainter(BottomShadowOverlayPainter.getInstance(), DecorationAreaType.FOOTER);
+
+ // add an overlay painter to paint a dark line along the bottom
+ // edge of toolbars
+ final BottomLineOverlayPainter toolbarBottomLineOverlayPainter = new BottomLineOverlayPainter(
+ (SubstanceColorScheme scheme) -> scheme.getUltraDarkColor().darker());
+ this.addOverlayPainter(toolbarBottomLineOverlayPainter, DecorationAreaType.TOOLBAR);
+
+ // add an overlay painter to paint a dark line along the bottom
+ // edge of toolbars
+ final TopLineOverlayPainter toolbarTopLineOverlayPainter = new TopLineOverlayPainter(
+ (SubstanceColorScheme scheme) -> SubstanceColorUtilities
+ .getAlphaColor(scheme.getForegroundColor(), 32));
+ this.addOverlayPainter(toolbarTopLineOverlayPainter, DecorationAreaType.TOOLBAR);
+
+ // add an overlay painter to paint a bezel line along the top
+ // edge of footer
+ final TopBezelOverlayPainter footerTopBezelOverlayPainter = new TopBezelOverlayPainter(
+ (SubstanceColorScheme scheme) -> scheme.getUltraDarkColor().darker(),
+ (SubstanceColorScheme scheme) -> SubstanceColorUtilities
+ .getAlphaColor(scheme.getForegroundColor(), 32));
+ this.addOverlayPainter(footerTopBezelOverlayPainter, DecorationAreaType.FOOTER);
+
+ this.setTabFadeStart(0.18);
+ this.setTabFadeEnd(0.18);
+
+ // Set button shaper to use "flat" design
+ this.buttonShaper = new ClassicButtonShaper()
+ {
+ @Override
+ public float getCornerRadius(AbstractButton button, float insets)
+ {
+ return 0;
+ }
+ };
+
+ this.watermark = null;
+ this.fillPainter = new FractionBasedFillPainter("RuneLite",
+ new float[]{0.0f, 0.5f, 1.0f},
+ new ColorSchemeSingleColorQuery[]{ColorSchemeSingleColorQuery.ULTRALIGHT,
+ ColorSchemeSingleColorQuery.LIGHT, ColorSchemeSingleColorQuery.LIGHT});
+ this.decorationPainter = new MatteDecorationPainter();
+ this.highlightPainter = new ClassicHighlightPainter();
+ this.borderPainter = new CompositeBorderPainter("RuneLite", new ClassicBorderPainter(),
+ new DelegateBorderPainter("RuneLite Inner", new ClassicBorderPainter(), 0x40FFFFFF,
+ 0x20FFFFFF, 0x00FFFFFF,
+ (SubstanceColorScheme scheme) -> scheme.tint(0.2f)));
+ }
+
+ @Override
+ public String getDisplayName()
+ {
+ return NAME;
+ }
+}
\ No newline at end of file
diff --git a/runelite-client/src/main/java/net/runelite/client/ui/skin/SubstanceRuneLiteLookAndFeel.java b/runelite-client/src/main/java/net/runelite/client/ui/skin/SubstanceRuneLiteLookAndFeel.java
new file mode 100644
index 0000000000..86afea00a8
--- /dev/null
+++ b/runelite-client/src/main/java/net/runelite/client/ui/skin/SubstanceRuneLiteLookAndFeel.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2018, Tomas Slusny