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 1f01e1c3c1..720c5633e9 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 @@ -122,6 +122,11 @@ public class ClockManager { notifier.notify("[" + timer.getName() + "] has finished counting down."); } + + if (timer.isLoop()) + { + timer.start(); + } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java index cd1b1a5a2e..e3ce75f631 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/clocks/ClockTabPanel.java @@ -57,6 +57,10 @@ public class ClockTabPanel extends TabContentPanel static final ImageIcon RESET_ICON_HOVER; static final ImageIcon START_ICON; static final ImageIcon START_ICON_HOVER; + static final ImageIcon LOOP_ICON; + static final ImageIcon LOOP_ICON_HOVER; + static final ImageIcon LOOP_SELECTED_ICON; + static final ImageIcon LOOP_SELECTED_ICON_HOVER; private static final ImageIcon ADD_ICON; private static final ImageIcon ADD_ICON_HOVER; @@ -73,6 +77,8 @@ public class ClockTabPanel extends TabContentPanel BufferedImage resetIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "reset_icon.png"); BufferedImage startIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "start_icon.png"); BufferedImage addIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "add_icon.png"); + BufferedImage loopIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "loop_icon.png"); + BufferedImage loopSelectedIcon = ImageUtil.getResourceStreamFromClass(TimeTrackingPlugin.class, "loop_selected_icon.png"); DELETE_ICON = new ImageIcon(deleteIcon); DELETE_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(deleteIcon, -80)); @@ -86,6 +92,10 @@ public class ClockTabPanel extends TabContentPanel START_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(startIcon, -80)); ADD_ICON = new ImageIcon(addIcon); ADD_ICON_HOVER = new ImageIcon(ImageUtil.alphaOffset(addIcon, 0.53f)); + LOOP_ICON = new ImageIcon(loopIcon); + LOOP_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(loopIcon, -80)); + LOOP_SELECTED_ICON = new ImageIcon(loopSelectedIcon); + LOOP_SELECTED_ICON_HOVER = new ImageIcon(ImageUtil.luminanceOffset(loopSelectedIcon, -80)); } ClockTabPanel(ClockManager clockManager) 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 48adf0e768..de21af9e5e 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 @@ -45,6 +45,9 @@ class Timer extends Clock @Getter(AccessLevel.NONE) private transient boolean warning; + // whether this timer should loop or not + private boolean loop; + Timer(String name, long duration) { super(name); 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 af65253480..abe3778428 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 @@ -27,6 +27,7 @@ package net.runelite.client.plugins.timetracking.clocks; import java.awt.Color; import java.awt.Dimension; import javax.swing.JButton; +import javax.swing.JToggleButton; import net.runelite.client.ui.ColorScheme; import net.runelite.client.util.SwingUtil; @@ -38,6 +39,17 @@ class TimerPanel extends ClockPanel { super(clockManager, timer, "timer", true); + JToggleButton loopButton = new JToggleButton(ClockTabPanel.LOOP_ICON); + loopButton.setRolloverIcon(ClockTabPanel.LOOP_ICON_HOVER); + loopButton.setSelectedIcon(ClockTabPanel.LOOP_SELECTED_ICON); + loopButton.setRolloverSelectedIcon(ClockTabPanel.LOOP_SELECTED_ICON_HOVER); + SwingUtil.removeButtonDecorations(loopButton); + loopButton.setPreferredSize(new Dimension(16, 14)); + loopButton.setToolTipText("Loop timer"); + loopButton.addActionListener(e -> timer.setLoop(!timer.isLoop())); + loopButton.setSelected(timer.isLoop()); + leftActions.add(loopButton); + JButton deleteButton = new JButton(ClockTabPanel.DELETE_ICON); SwingUtil.removeButtonDecorations(deleteButton); deleteButton.setRolloverIcon(ClockTabPanel.DELETE_ICON_HOVER); diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/loop_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/loop_icon.png new file mode 100644 index 0000000000..112b3bf489 Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/loop_icon.png differ diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/loop_selected_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/loop_selected_icon.png new file mode 100644 index 0000000000..2eca67e08f Binary files /dev/null and b/runelite-client/src/main/resources/net/runelite/client/plugins/timetracking/loop_selected_icon.png differ