diff --git a/gui.py b/gui.py index 2a9b99d..a08b520 100644 --- a/gui.py +++ b/gui.py @@ -921,28 +921,44 @@ class InventoryOverview: def __init__(self, manager: GUIManager, master: ttk.Widget): self._cache = manager._cache self._filters = { - "notlinked": IntVar(master, 0), + "linked": IntVar(master, 1), "expired": IntVar(master, 1), "upcoming": IntVar(master, 1), + "finished": IntVar(master, 1), } # Filtering options filter_frame = ttk.LabelFrame(master, text="Filter", padding=(4, 0, 4, 4)) LABEL_SPACING = 20 filter_frame.grid(column=0, row=0, columnspan=2, sticky="nsew") ttk.Label(filter_frame, text="Show:", padding=(0, 0, 10, 0)).grid(column=0, row=0) - ttk.Checkbutton(filter_frame, variable=self._filters["notlinked"]).grid(column=1, row=0) + icolumn = 0 + ttk.Checkbutton( + filter_frame, variable=self._filters["linked"] + ).grid(column=(icolumn := icolumn + 1), row=0) ttk.Label( - filter_frame, text="Not linked", padding=(0, 0, LABEL_SPACING, 0) - ).grid(column=2, row=0) - ttk.Checkbutton(filter_frame, variable=self._filters["expired"]).grid(column=3, row=0) + filter_frame, text="Linked", padding=(0, 0, LABEL_SPACING, 0) + ).grid(column=(icolumn := icolumn + 1), row=0) + ttk.Checkbutton( + filter_frame, variable=self._filters["expired"] + ).grid(column=(icolumn := icolumn + 1), row=0) ttk.Label( filter_frame, text="Expired", padding=(0, 0, LABEL_SPACING, 0) - ).grid(column=4, row=0) - ttk.Checkbutton(filter_frame, variable=self._filters["upcoming"]).grid(column=5, row=0) + ).grid(column=(icolumn := icolumn + 1), row=0) + ttk.Checkbutton( + filter_frame, variable=self._filters["upcoming"] + ).grid(column=(icolumn := icolumn + 1), row=0) ttk.Label( filter_frame, text="Upcoming", padding=(0, 0, LABEL_SPACING, 0) - ).grid(column=6, row=0) - ttk.Button(filter_frame, text="Refresh", command=self.refresh).grid(column=7, row=0) + ).grid(column=(icolumn := icolumn + 1), row=0) + ttk.Checkbutton( + filter_frame, variable=self._filters["finished"] + ).grid(column=(icolumn := icolumn + 1), row=0) + ttk.Label( + filter_frame, text="Finished", padding=(0, 0, LABEL_SPACING, 0) + ).grid(column=(icolumn := icolumn + 1), row=0) + ttk.Button( + filter_frame, text="Refresh", command=self.refresh + ).grid(column=(icolumn := icolumn + 1), row=0) # Inventory view self._canvas = tk.Canvas(master, scrollregion=(0, 0, 0, 0)) self._canvas.grid(column=0, row=1, sticky="nsew") @@ -966,13 +982,14 @@ class InventoryOverview: def _update_visibility(self, campaign: DropsCampaign): # True if the campaign is supposed to show, False makes it hidden. frame = self._campaigns[campaign] + linked = bool(self._filters["linked"].get()) + expired = bool(self._filters["expired"].get()) + upcoming = bool(self._filters["upcoming"].get()) + finished = bool(self._filters["finished"].get()) if ( - (campaign.linked or self._filters["notlinked"].get()) - and ( - campaign.active - or self._filters["expired"].get() and campaign.expired - or self._filters["upcoming"].get() and campaign.upcoming - ) + (not linked or campaign.linked) + and (campaign.active or upcoming and campaign.upcoming or expired and campaign.expired) + and (finished or not campaign.finished) ): frame.grid() else: diff --git a/inventory.py b/inventory.py index 64249c5..58431aa 100644 --- a/inventory.py +++ b/inventory.py @@ -252,6 +252,10 @@ class DropsCampaign: def total_drops(self) -> int: return len(self.timed_drops) + @cached_property + def finished(self) -> bool: + return all(d.is_claimed for d in self.drops) + @cached_property def claimed_drops(self) -> int: return sum(d.is_claimed for d in self.drops) @@ -262,14 +266,14 @@ class DropsCampaign: @cached_property def remaining_minutes(self) -> int: - return sum(d.remaining_minutes for d in self.timed_drops.values()) + return sum(d.remaining_minutes for d in self.drops) @cached_property def progress(self) -> float: return sum(d.progress for d in self.drops) / self.total_drops def _on_claim(self) -> None: - invalidate_cache(self, "claimed_drops", "remaining_drops") + invalidate_cache(self, "finished", "claimed_drops", "remaining_drops") for drop in self.drops: drop._on_claim()