Merge pull request #315 from Noremac201/fixXpGlobes
Changed XpGlobes to use new Overlay components
This commit is contained in:
@@ -27,8 +27,8 @@ package net.runelite.client.plugins.xpglobes;
|
|||||||
import java.awt.BasicStroke;
|
import java.awt.BasicStroke;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.FontMetrics;
|
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Stroke;
|
||||||
import java.awt.geom.Arc2D;
|
import java.awt.geom.Arc2D;
|
||||||
import java.awt.geom.Ellipse2D;
|
import java.awt.geom.Ellipse2D;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
@@ -45,6 +45,8 @@ import net.runelite.api.Point;
|
|||||||
import net.runelite.api.Skill;
|
import net.runelite.api.Skill;
|
||||||
import net.runelite.client.ui.overlay.Overlay;
|
import net.runelite.client.ui.overlay.Overlay;
|
||||||
import net.runelite.client.ui.overlay.OverlayPosition;
|
import net.runelite.client.ui.overlay.OverlayPosition;
|
||||||
|
import net.runelite.client.ui.overlay.components.PanelComponent;
|
||||||
|
import net.runelite.client.ui.overlay.components.ProgressBarComponent;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class XpGlobesOverlay extends Overlay
|
public class XpGlobesOverlay extends Overlay
|
||||||
@@ -69,8 +71,6 @@ public class XpGlobesOverlay extends Overlay
|
|||||||
private final BufferedImage[] imgCache = new BufferedImage[Skill.values().length - 1];
|
private final BufferedImage[] imgCache = new BufferedImage[Skill.values().length - 1];
|
||||||
|
|
||||||
private static final int TOOLTIP_RECT_SIZE_X = 140;
|
private static final int TOOLTIP_RECT_SIZE_X = 140;
|
||||||
private static final int TOOLTIP_TEXT_RECT_SIZE_X = TOOLTIP_RECT_SIZE_X - 10;
|
|
||||||
private static final int TOOLTIP_RECT_SIZE_Y = 80;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public XpGlobesOverlay(@Nullable Client client, XpGlobesPlugin plugin, XpGlobesConfig config)
|
public XpGlobesOverlay(@Nullable Client client, XpGlobesPlugin plugin, XpGlobesConfig config)
|
||||||
@@ -107,7 +107,7 @@ public class XpGlobesOverlay extends Overlay
|
|||||||
|
|
||||||
for (XpGlobe xpGlobe : xpChangedQueue)
|
for (XpGlobe xpGlobe : xpChangedQueue)
|
||||||
{
|
{
|
||||||
renderProgressCircle(graphics, xpGlobe, startDrawX, DEFAULT_START_Y);
|
renderProgressCircle(graphics, point, xpGlobe, startDrawX, DEFAULT_START_Y);
|
||||||
startDrawX += MINIMUM_STEP_WIDTH;
|
startDrawX += MINIMUM_STEP_WIDTH;
|
||||||
}
|
}
|
||||||
plugin.removeExpiredXpGlobes();
|
plugin.removeExpiredXpGlobes();
|
||||||
@@ -116,7 +116,7 @@ public class XpGlobesOverlay extends Overlay
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void renderProgressCircle(Graphics2D graphics, XpGlobe skillToDraw, int x, int y)
|
private void renderProgressCircle(Graphics2D graphics, java.awt.Point parent, XpGlobe skillToDraw, int x, int y)
|
||||||
{
|
{
|
||||||
double radiusCurrentXp = skillToDraw.getSkillProgressRadius();
|
double radiusCurrentXp = skillToDraw.getSkillProgressRadius();
|
||||||
double radiusToGoalXp = 360; //draw a circle
|
double radiusToGoalXp = 360; //draw a circle
|
||||||
@@ -141,12 +141,13 @@ public class XpGlobesOverlay extends Overlay
|
|||||||
|
|
||||||
if (config.enableTooltips())
|
if (config.enableTooltips())
|
||||||
{
|
{
|
||||||
drawTooltipIfMouseover(graphics, skillToDraw, backgroundCircle);
|
drawTooltipIfMouseover(graphics, parent, skillToDraw, backgroundCircle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawProgressArc(Graphics2D graphics, int x, int y, int w, int h, double radiusStart, double radiusEnd, int strokeWidth, Color color)
|
private void drawProgressArc(Graphics2D graphics, int x, int y, int w, int h, double radiusStart, double radiusEnd, int strokeWidth, Color color)
|
||||||
{
|
{
|
||||||
|
Stroke stroke = graphics.getStroke();
|
||||||
graphics.setStroke(new BasicStroke(strokeWidth));
|
graphics.setStroke(new BasicStroke(strokeWidth));
|
||||||
graphics.setColor(color);
|
graphics.setColor(color);
|
||||||
graphics.draw(new Arc2D.Double(
|
graphics.draw(new Arc2D.Double(
|
||||||
@@ -154,6 +155,7 @@ public class XpGlobesOverlay extends Overlay
|
|||||||
w, h,
|
w, h,
|
||||||
radiusStart, radiusEnd,
|
radiusStart, radiusEnd,
|
||||||
Arc2D.OPEN));
|
Arc2D.OPEN));
|
||||||
|
graphics.setStroke(stroke);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Ellipse2D drawEllipse(Graphics2D graphics, int x, int y)
|
private Ellipse2D drawEllipse(Graphics2D graphics, int x, int y)
|
||||||
@@ -207,7 +209,7 @@ public class XpGlobesOverlay extends Overlay
|
|||||||
return skillImage;
|
return skillImage;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void drawTooltipIfMouseover(Graphics2D graphics, XpGlobe mouseOverSkill, Ellipse2D drawnGlobe)
|
private void drawTooltipIfMouseover(Graphics2D graphics, java.awt.Point parent, XpGlobe mouseOverSkill, Ellipse2D drawnGlobe)
|
||||||
{
|
{
|
||||||
Point mouse = client.getMouseCanvasPosition();
|
Point mouse = client.getMouseCanvasPosition();
|
||||||
int mouseX = mouse.getX();
|
int mouseX = mouse.getX();
|
||||||
@@ -221,55 +223,29 @@ public class XpGlobesOverlay extends Overlay
|
|||||||
//draw tooltip under the globe of the mouse location
|
//draw tooltip under the globe of the mouse location
|
||||||
int x = (int) drawnGlobe.getX() - (TOOLTIP_RECT_SIZE_X / 2) + (DEFAULT_CIRCLE_WIDTH / 2);
|
int x = (int) drawnGlobe.getX() - (TOOLTIP_RECT_SIZE_X / 2) + (DEFAULT_CIRCLE_WIDTH / 2);
|
||||||
int y = (int) drawnGlobe.getY() + DEFAULT_CIRCLE_HEIGHT + 10;
|
int y = (int) drawnGlobe.getY() + DEFAULT_CIRCLE_HEIGHT + 10;
|
||||||
int padding = (TOOLTIP_RECT_SIZE_X - TOOLTIP_TEXT_RECT_SIZE_X) / 2;
|
|
||||||
int stringX = x + padding;
|
|
||||||
|
|
||||||
|
String skillName = mouseOverSkill.getSkillName();
|
||||||
String skillLevel = Integer.toString(mouseOverSkill.getCurrentLevel());
|
String skillLevel = Integer.toString(mouseOverSkill.getCurrentLevel());
|
||||||
String skillCurrentXp = Integer.toString(mouseOverSkill.getCurrentXp());
|
|
||||||
String skillXpToLvl = Integer.toString((mouseOverSkill.getGoalXp() - mouseOverSkill.getCurrentXp()));
|
|
||||||
|
|
||||||
FontMetrics fm = graphics.getFontMetrics();
|
DecimalFormat decimalFormat = new DecimalFormat("###,###,###");
|
||||||
int skillLevelX = x + padding + (TOOLTIP_TEXT_RECT_SIZE_X - fm.stringWidth(skillLevel));
|
String skillCurrentXp = decimalFormat.format(mouseOverSkill.getCurrentXp());
|
||||||
int skillCurrentXpX = x + padding + (TOOLTIP_TEXT_RECT_SIZE_X - fm.stringWidth(skillCurrentXp));
|
String skillXpToLvl = decimalFormat.format(mouseOverSkill.getGoalXp() - mouseOverSkill.getCurrentXp());
|
||||||
int skillXpToLvlX = x + padding + (TOOLTIP_TEXT_RECT_SIZE_X - fm.stringWidth(skillXpToLvl));
|
|
||||||
int stringHeight = fm.getHeight();
|
|
||||||
|
|
||||||
//draw tooltip container
|
PanelComponent xpTooltip = new PanelComponent();
|
||||||
graphics.setPaint(DEFAULT_XPGLOBE_BACKGROUND_COLOR);
|
xpTooltip.setPosition(new java.awt.Point(x, y));
|
||||||
graphics.fillRect(x, y, TOOLTIP_RECT_SIZE_X, TOOLTIP_RECT_SIZE_Y);
|
|
||||||
graphics.setPaint(DEFAULT_PROGRESS_REMAINDER_ARC_COLOR);
|
|
||||||
graphics.setStroke(new BasicStroke(2));
|
|
||||||
graphics.drawRect(x, y, TOOLTIP_RECT_SIZE_X, TOOLTIP_RECT_SIZE_Y);
|
|
||||||
|
|
||||||
//draw the text
|
List<PanelComponent.Line> lines = xpTooltip.getLines();
|
||||||
graphics.setPaint(Color.WHITE);
|
lines.add(new PanelComponent.Line(skillName, Color.WHITE, skillLevel, Color.WHITE));
|
||||||
graphics.drawString(mouseOverSkill.getSkillName(), stringX, y + stringHeight);
|
lines.add(new PanelComponent.Line("Current xp:", Color.ORANGE, skillCurrentXp, Color.WHITE));
|
||||||
graphics.drawString(skillLevel, skillLevelX, y + stringHeight);
|
lines.add(new PanelComponent.Line("Xp to level: ", Color.ORANGE, skillXpToLvl, Color.WHITE));
|
||||||
graphics.drawString("Current exp:", stringX, y + (stringHeight * 2));
|
|
||||||
graphics.drawString(skillCurrentXp, skillCurrentXpX, y + (stringHeight * 2));
|
|
||||||
graphics.drawString("Exp to level:", stringX, y + (stringHeight * 3));
|
|
||||||
graphics.drawString(skillXpToLvl, skillXpToLvlX, y + (stringHeight * 3));
|
|
||||||
|
|
||||||
//draw the progress bar
|
//Create progress bar for skill.
|
||||||
double progress = mouseOverSkill.getSkillProgress(Experience.getXpForLevel(mouseOverSkill.getCurrentLevel()), mouseOverSkill.getCurrentXp(), mouseOverSkill.getGoalXp());
|
ProgressBarComponent progressBar = new ProgressBarComponent();
|
||||||
int barWidth = TOOLTIP_TEXT_RECT_SIZE_X;
|
double progress = mouseOverSkill.getSkillProgress(Experience.getXpForLevel(mouseOverSkill.getCurrentLevel()),
|
||||||
int barHeight = 16;
|
mouseOverSkill.getCurrentXp(), mouseOverSkill.getGoalXp());
|
||||||
int barX = x + padding;
|
progressBar.setProgress(progress);
|
||||||
int barY = y + (stringHeight * 3) + 10;
|
|
||||||
|
|
||||||
DecimalFormat df = new DecimalFormat("#.00");
|
xpTooltip.setProgressBar(progressBar);
|
||||||
String progressText = df.format(progress) + "%";
|
xpTooltip.render(graphics, parent);
|
||||||
int progressTextLength = fm.stringWidth(progressText);
|
|
||||||
int progressTextX = barX + (barWidth / 2) - (progressTextLength / 2);
|
|
||||||
int progressTextY = barY + 12;
|
|
||||||
|
|
||||||
int progressFill = (int) ((barWidth / 100F) * progress);
|
|
||||||
|
|
||||||
graphics.setColor(Color.WHITE);
|
|
||||||
graphics.fillRect(barX, barY, barWidth, barHeight);
|
|
||||||
graphics.setColor(Color.GREEN);
|
|
||||||
graphics.fillRect(barX, barY, progressFill, barHeight);
|
|
||||||
graphics.setPaint(Color.BLACK);
|
|
||||||
graphics.drawString(progressText, progressTextX, progressTextY);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import java.awt.Point;
|
|||||||
import java.awt.Rectangle;
|
import java.awt.Rectangle;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -74,6 +75,9 @@ public class PanelComponent implements RenderableEntity
|
|||||||
@Getter
|
@Getter
|
||||||
private List<Line> lines = new ArrayList<>();
|
private List<Line> lines = new ArrayList<>();
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
private ProgressBarComponent progressBar;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private int width = 140;
|
private int width = 140;
|
||||||
|
|
||||||
@@ -81,10 +85,11 @@ public class PanelComponent implements RenderableEntity
|
|||||||
public Dimension render(Graphics2D graphics, Point parent)
|
public Dimension render(Graphics2D graphics, Point parent)
|
||||||
{
|
{
|
||||||
final Dimension dimension = new Dimension();
|
final Dimension dimension = new Dimension();
|
||||||
final int elementNumber = (Strings.isNullOrEmpty(title) ? 0 : 1) + lines.size();
|
final int elementNumber = (Strings.isNullOrEmpty(title) ? 0 : 1) + lines.size() + (Objects.isNull(progressBar) ? 0 : 1);
|
||||||
int height = elementNumber == 0 ? 0 :
|
int height = elementNumber == 0 ? 0 :
|
||||||
TOP_BORDER + (graphics.getFontMetrics().getHeight() * elementNumber)
|
TOP_BORDER + (graphics.getFontMetrics().getHeight() * elementNumber)
|
||||||
+ SEPARATOR * elementNumber + BOTTOM_BORDER;
|
+ SEPARATOR * elementNumber + (Objects.isNull(progressBar) ? 0 : progressBar.getHeight() / 2)
|
||||||
|
+ BOTTOM_BORDER;
|
||||||
dimension.setSize(width, height);
|
dimension.setSize(width, height);
|
||||||
|
|
||||||
if (dimension.height == 0)
|
if (dimension.height == 0)
|
||||||
@@ -131,6 +136,14 @@ public class PanelComponent implements RenderableEntity
|
|||||||
y += metrics.getHeight() + SEPARATOR;
|
y += metrics.getHeight() + SEPARATOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Render progress bar
|
||||||
|
if (!Objects.isNull(progressBar))
|
||||||
|
{
|
||||||
|
progressBar.setWidth(width - LEFT_BORDER - RIGHT_BORDER);
|
||||||
|
progressBar.setPosition(new Point(position.x + LEFT_BORDER, y - (metrics.getHeight() / 2)));
|
||||||
|
progressBar.render(graphics, parent);
|
||||||
|
}
|
||||||
|
|
||||||
return dimension;
|
return dimension;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, Cameron <moberg@tuta.io>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package net.runelite.client.ui.overlay.components;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.FontMetrics;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
public class ProgressBarComponent
|
||||||
|
{
|
||||||
|
@Setter
|
||||||
|
private String text;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
private double progress;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
private Point position = new Point();
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
private Color foregroundColor = new Color(82, 161, 82);
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
private Color backgroundColor = new Color(255, 255, 255, 127);
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
private Color fontColor = Color.WHITE;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private int width = 140;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
private int height = 16;
|
||||||
|
|
||||||
|
public Dimension render(Graphics2D graphics, Point parent)
|
||||||
|
{
|
||||||
|
FontMetrics metrics = graphics.getFontMetrics();
|
||||||
|
|
||||||
|
int barX = position.x;
|
||||||
|
int barY = position.y;
|
||||||
|
String textToWrite;
|
||||||
|
|
||||||
|
if (Strings.isNullOrEmpty(text))
|
||||||
|
{
|
||||||
|
DecimalFormat df = new DecimalFormat("#.00");
|
||||||
|
textToWrite = df.format(progress) + "%";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
textToWrite = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
int progressTextX = barX + (width - metrics.stringWidth(textToWrite)) / 2;
|
||||||
|
int progressTextY = barY + ((height - metrics.getHeight()) / 2) + metrics.getAscent();
|
||||||
|
|
||||||
|
int progressFill = (int) ((width / 100F) * progress);
|
||||||
|
|
||||||
|
//Draw bar
|
||||||
|
graphics.setColor(backgroundColor);
|
||||||
|
graphics.fillRect(barX, barY, width, height);
|
||||||
|
graphics.setColor(foregroundColor);
|
||||||
|
graphics.fillRect(barX, barY, progressFill, height);
|
||||||
|
|
||||||
|
TextComponent textComponent = new TextComponent();
|
||||||
|
textComponent.setPosition(new Point(progressTextX, progressTextY));
|
||||||
|
textComponent.setColor(fontColor);
|
||||||
|
textComponent.setText(textToWrite);
|
||||||
|
textComponent.render(graphics, parent);
|
||||||
|
|
||||||
|
return new Dimension(width, height);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user