diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewTabPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewTabPanel.java index 8ac4c9979e..3fbe3ac505 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewTabPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/OverviewTabPanel.java @@ -31,10 +31,10 @@ import java.time.Instant; import java.util.Map; import java.util.function.Function; import java.util.stream.Stream; -import javax.annotation.Nullable; import net.runelite.api.ItemID; import net.runelite.client.game.ItemManager; import net.runelite.client.plugins.timetracking.clocks.ClockManager; +import net.runelite.client.plugins.timetracking.farming.CropState; import net.runelite.client.plugins.timetracking.farming.FarmingContractManager; import net.runelite.client.plugins.timetracking.farming.FarmingTracker; import net.runelite.client.plugins.timetracking.hunter.BirdHouseTracker; @@ -124,14 +124,13 @@ class OverviewTabPanel extends TabContentPanel } farmingOverviews.forEach((patchType, panel) -> - updateItemPanel(panel, farmingTracker.getSummary(patchType), farmingTracker.getCompletionTime(patchType), null)); + updateItemPanel(panel, farmingTracker.getSummary(patchType), farmingTracker.getCompletionTime(patchType))); - updateItemPanel(birdHouseOverview, birdHouseTracker.getSummary(), birdHouseTracker.getCompletionTime(), null); - updateItemPanel(farmingContractOverview, farmingContractManager.getSummary(), farmingContractManager.getCompletionTime(), - farmingContractManager.getContractName()); + updateItemPanel(birdHouseOverview, birdHouseTracker.getSummary(), birdHouseTracker.getCompletionTime()); + updateContractPanel(); } - private void updateItemPanel(OverviewItemPanel panel, SummaryState summary, long completionTime, @Nullable String farmingContract) + private void updateItemPanel(OverviewItemPanel panel, SummaryState summary, long completionTime) { switch (summary) { @@ -151,10 +150,7 @@ class OverviewTabPanel extends TabContentPanel break; } case EMPTY: - panel.updateStatus(farmingContract == null ? "Empty" : farmingContract, Color.GRAY); - break; - case OCCUPIED: - panel.updateStatus(farmingContract == null ? "" : farmingContract, Color.RED); + panel.updateStatus("Empty", Color.GRAY); break; case UNKNOWN: default: @@ -162,4 +158,45 @@ class OverviewTabPanel extends TabContentPanel break; } } + + private void updateContractPanel() + { + switch (farmingContractManager.getSummary()) + { + case COMPLETED: + case IN_PROGRESS: + switch (farmingContractManager.getContractCropState()) + { + case HARVESTABLE: + case GROWING: + long duration = farmingContractManager.getCompletionTime() - Instant.now().getEpochSecond(); + + if (duration <= 0) + { + farmingContractOverview.updateStatus("Ready", ColorScheme.PROGRESS_COMPLETE_COLOR); + return; + } + + farmingContractOverview.updateStatus("Ready " + getFormattedEstimate(duration, config.timeFormatMode()), Color.GRAY); + return; + case DISEASED: + farmingContractOverview.updateStatus("Diseased", CropState.DISEASED.getColor()); + return; + case DEAD: + farmingContractOverview.updateStatus("Dead", CropState.DEAD.getColor()); + return; + } + // fallthrough + case UNKNOWN: + default: + farmingContractOverview.updateStatus("Unknown", Color.GRAY); + return; + case EMPTY: + farmingContractOverview.updateStatus(farmingContractManager.getContractName(), Color.GRAY); + return; + case OCCUPIED: + farmingContractOverview.updateStatus(farmingContractManager.getContractName(), Color.RED); + return; + } + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TabContentPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TabContentPanel.java index 88b6362e26..b24f108182 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TabContentPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/timetracking/TabContentPanel.java @@ -24,13 +24,16 @@ */ package net.runelite.client.plugins.timetracking; +import java.time.DateTimeException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.TextStyle; import java.time.temporal.ChronoUnit; import java.util.Locale; import javax.swing.JPanel; +import lombok.extern.slf4j.Slf4j; +@Slf4j public abstract class TabContentPanel extends JPanel { private static final DateTimeFormatter DATETIME_FORMATTER_24H = DateTimeFormatter.ofPattern("HH:mm"); @@ -72,17 +75,25 @@ public abstract class TabContentPanel extends JPanel } else { - StringBuilder sb = new StringBuilder(); - LocalDateTime endTime = LocalDateTime.now().plus(remainingSeconds, ChronoUnit.SECONDS); - LocalDateTime currentTime = LocalDateTime.now(); - if (endTime.getDayOfWeek() != currentTime.getDayOfWeek()) + try { - sb.append(endTime.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.getDefault())).append(" "); - } - sb.append("at "); - sb.append(formatter.format(endTime)); + StringBuilder sb = new StringBuilder(); + LocalDateTime endTime = LocalDateTime.now().plus(remainingSeconds, ChronoUnit.SECONDS); + LocalDateTime currentTime = LocalDateTime.now(); + if (endTime.getDayOfWeek() != currentTime.getDayOfWeek()) + { + sb.append(endTime.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.getDefault())).append(" "); + } + sb.append("at "); + sb.append(formatter.format(endTime)); - return sb.toString(); + return sb.toString(); + } + catch (DateTimeException e) + { + log.warn("error formatting absolute time: now + {}", remainingSeconds, e); + return "Invalid"; + } } }