From df18bdb542a93b09a2f0ffde28703d3ee671b8ff Mon Sep 17 00:00:00 2001 From: melkypie <5113962+melkypie@users.noreply.github.com> Date: Wed, 18 Mar 2020 13:56:35 +0200 Subject: [PATCH] timetracking: add timer warning colors Lets the user choose a time for showing when the timer should turn orange. Co-authored-by: jakewilson --- .../timetracking/TimeTrackingConfig.java | 12 +++++++++ .../timetracking/TimeTrackingPlugin.java | 1 + .../timetracking/clocks/ClockManager.java | 11 ++++++++ .../timetracking/clocks/ClockPanel.java | 11 ++++++-- .../plugins/timetracking/clocks/Timer.java | 12 +++++++++ .../timetracking/clocks/TimerPanel.java | 25 +++++++++++++++++++ 6 files changed, 70 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingConfig.java index 94d388e40d..0f7598e4ca 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingConfig.java @@ -94,6 +94,18 @@ public interface TimeTrackingConfig extends Config return SortOrder.NONE; } + @ConfigItem( + keyName = "timerWarningThreshold", + name = "Timer Warning Threshold", + description = "The time at which to change the timer color to the warning color", + position = 6 + ) + @Units(Units.SECONDS) + default int timerWarningThreshold() + { + return 10; + } + @ConfigItem( keyName = "activeTab", name = "Active Tab", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java index e8b1c70ff3..c3def0d822 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TimeTrackingPlugin.java @@ -230,6 +230,7 @@ public class TimeTrackingPlugin extends Plugin { clockDataChanged = clockManager.checkCompletion(); timerOrderChanged = clockManager.checkTimerOrder(); + clockManager.checkForWarnings(); } if (unitTime % panel.getUpdateInterval() == 0 || clockDataChanged || timerOrderChanged) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockManager.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockManager.java index 342da8c3f7..1f01e1c3c1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockManager.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockManager.java @@ -161,6 +161,17 @@ public class ClockManager return false; } + /** + * Sets the warning flag on each timer that should be in the warning state + */ + public void checkForWarnings() + { + for (Timer timer : timers) + { + timer.setWarning(timer.getDisplayTime() <= config.timerWarningThreshold()); + } + } + public void loadTimers() { final String timersJson = configManager.getConfiguration(TimeTrackingConfig.CONFIG_GROUP, TimeTrackingConfig.TIMERS); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockPanel.java index 612a5a0918..2cf45b8f36 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockPanel.java @@ -64,7 +64,7 @@ abstract class ClockPanel extends JPanel private final FlatTextField nameInput; private final JToggleButton startPauseButton; - private final FlatTextField displayInput; + protected final FlatTextField displayInput; @Getter private final Clock clock; @@ -150,6 +150,7 @@ abstract class ClockPanel extends JPanel clock.setDuration(Math.max(0, duration)); clock.reset(); + clockManager.checkForWarnings(); updateDisplayInput(); updateActivityStatus(); clockManager.saveTimers(); @@ -199,6 +200,7 @@ abstract class ClockPanel extends JPanel resetButton.addActionListener(e -> { clock.reset(); + clockManager.checkForWarnings(); reset(); clockManager.saveToConfig(); }); @@ -238,7 +240,7 @@ abstract class ClockPanel extends JPanel boolean isActive = clock.isActive(); displayInput.setEditable(editable && !isActive); - displayInput.getTextField().setForeground(isActive ? ACTIVE_CLOCK_COLOR : INACTIVE_CLOCK_COLOR); + displayInput.getTextField().setForeground(getColor()); startPauseButton.setToolTipText(isActive ? "Pause " + clockType : "Start " + clockType); startPauseButton.setSelected(isActive); @@ -248,6 +250,11 @@ abstract class ClockPanel extends JPanel } } + protected Color getColor() + { + return clock.isActive() ? ACTIVE_CLOCK_COLOR : INACTIVE_CLOCK_COLOR; + } + static String getFormattedDuration(long duration) { long hours = duration / (60 * 60); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Timer.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Timer.java index d4e0de6132..48adf0e768 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Timer.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/Timer.java @@ -25,6 +25,7 @@ package net.runelite.client.plugins.timetracking.clocks; import java.time.Instant; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -40,11 +41,16 @@ class Timer extends Clock // the number of seconds remaining on the timer, as of last updated time private long remaining; + // whether this timer is in the 'warning' state or not + @Getter(AccessLevel.NONE) + private transient boolean warning; + Timer(String name, long duration) { super(name); this.duration = duration; this.remaining = duration; + this.warning = false; } @Override @@ -66,6 +72,7 @@ class Timer extends Clock if (remaining <= 0) { remaining = duration; + warning = false; } lastUpdate = Instant.now().getEpochSecond(); active = true; @@ -96,4 +103,9 @@ class Timer extends Clock remaining = duration; lastUpdate = Instant.now().getEpochSecond(); } + + boolean isWarning() + { + return warning && (remaining > 0); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/TimerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/TimerPanel.java index c1fc578dff..af65253480 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/TimerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/TimerPanel.java @@ -24,12 +24,16 @@ */ package net.runelite.client.plugins.timetracking.clocks; +import java.awt.Color; import java.awt.Dimension; import javax.swing.JButton; +import net.runelite.client.ui.ColorScheme; import net.runelite.client.util.SwingUtil; class TimerPanel extends ClockPanel { + private static final Color WARNING_COLOR = ColorScheme.BRAND_ORANGE; + TimerPanel(ClockManager clockManager, Timer timer) { super(clockManager, timer, "timer", true); @@ -42,4 +46,25 @@ class TimerPanel extends ClockPanel deleteButton.addActionListener(e -> clockManager.removeTimer(timer)); rightActions.add(deleteButton); } + + @Override + void updateDisplayInput() + { + super.updateDisplayInput(); + + Timer timer = (Timer) getClock(); + if (timer.isWarning()) + { + displayInput.getTextField().setForeground(getColor()); + } + } + + @Override + protected Color getColor() + { + Timer timer = (Timer) getClock(); + Color warningColor = timer.isActive() ? WARNING_COLOR : WARNING_COLOR.darker(); + + return timer.isWarning() ? warningColor : super.getColor(); + } }