Make it possible for the campaign status;
to dymanically update upon switching to the Inventory tab
This commit is contained in:
1 parent
64a7bdc6fd
commit
3551eabcee
1 file changed
+49
-17
@@ -1048,10 +1048,10 @@ class Notebook:
|
|||||||
def __init__(self, manager: GUIManager, master: ttk.Widget):
|
def __init__(self, manager: GUIManager, master: ttk.Widget):
|
||||||
self._nb = ttk.Notebook(master)
|
self._nb = ttk.Notebook(master)
|
||||||
self._nb.grid(column=0, row=0, sticky="nsew")
|
self._nb.grid(column=0, row=0, sticky="nsew")
|
||||||
# prevent entries from being selected after switching tabs
|
|
||||||
self._nb.bind("<<NotebookTabChanged>>", lambda event: manager._root.focus_set())
|
|
||||||
master.rowconfigure(0, weight=1)
|
master.rowconfigure(0, weight=1)
|
||||||
master.columnconfigure(0, weight=1)
|
master.columnconfigure(0, weight=1)
|
||||||
|
# prevent entries from being selected after switching tabs
|
||||||
|
self._nb.bind("<<NotebookTabChanged>>", lambda event: manager._root.focus_set())
|
||||||
|
|
||||||
def add_tab(self, widget: ttk.Widget, *, name: str, **kwargs):
|
def add_tab(self, widget: ttk.Widget, *, name: str, **kwargs):
|
||||||
kwargs.pop("text", None)
|
kwargs.pop("text", None)
|
||||||
@@ -1059,9 +1059,21 @@ class Notebook:
|
|||||||
kwargs["sticky"] = "nsew"
|
kwargs["sticky"] = "nsew"
|
||||||
self._nb.add(widget, text=name, **kwargs)
|
self._nb.add(widget, text=name, **kwargs)
|
||||||
|
|
||||||
|
def current_tab(self) -> str:
|
||||||
|
return self._nb.tab("current", "text")
|
||||||
|
|
||||||
|
def add_view_event(self, callback: abc.Callable[[tk.Event[ttk.Notebook]], Any]):
|
||||||
|
self._nb.bind("<<NotebookTabChanged>>", callback, True)
|
||||||
|
|
||||||
|
|
||||||
|
class CampaignDisplay(TypedDict):
|
||||||
|
frame: ttk.Frame
|
||||||
|
status: ttk.Label
|
||||||
|
|
||||||
|
|
||||||
class InventoryOverview:
|
class InventoryOverview:
|
||||||
def __init__(self, manager: GUIManager, master: ttk.Widget):
|
def __init__(self, manager: GUIManager, master: ttk.Widget):
|
||||||
|
self._manager = manager
|
||||||
self._cache: ImageCache = manager._cache
|
self._cache: ImageCache = manager._cache
|
||||||
self._settings: Settings = manager._twitch.settings
|
self._settings: Settings = manager._twitch.settings
|
||||||
self._filters = {
|
self._filters = {
|
||||||
@@ -1071,6 +1083,7 @@ class InventoryOverview:
|
|||||||
"excluded": IntVar(master, 0),
|
"excluded": IntVar(master, 0),
|
||||||
"finished": IntVar(master, 0),
|
"finished": IntVar(master, 0),
|
||||||
}
|
}
|
||||||
|
manager.tabs.add_view_event(self._on_tab_switched)
|
||||||
# Filtering options
|
# Filtering options
|
||||||
filter_frame = ttk.LabelFrame(
|
filter_frame = ttk.LabelFrame(
|
||||||
master, text=_("gui", "inventory", "filter", "name"), padding=(4, 0, 4, 4)
|
master, text=_("gui", "inventory", "filter", "name"), padding=(4, 0, 4, 4)
|
||||||
@@ -1141,12 +1154,12 @@ class InventoryOverview:
|
|||||||
)
|
)
|
||||||
self._canvas.bind("<Leave>", lambda e: self._canvas.unbind_all("<MouseWheel>"))
|
self._canvas.bind("<Leave>", lambda e: self._canvas.unbind_all("<MouseWheel>"))
|
||||||
self._canvas.create_window(0, 0, anchor="nw", window=self._main_frame)
|
self._canvas.create_window(0, 0, anchor="nw", window=self._main_frame)
|
||||||
self._campaigns: dict[DropsCampaign, ttk.Frame] = {}
|
self._campaigns: dict[DropsCampaign, CampaignDisplay] = {}
|
||||||
self._drops: dict[str, ttk.Label] = {}
|
self._drops: dict[str, ttk.Label] = {}
|
||||||
|
|
||||||
def _update_visibility(self, campaign: DropsCampaign):
|
def _update_visibility(self, campaign: DropsCampaign):
|
||||||
# True if the campaign is supposed to show, False makes it hidden.
|
# True if the campaign is supposed to show, False makes it hidden.
|
||||||
frame = self._campaigns[campaign]
|
frame = self._campaigns[campaign]["frame"]
|
||||||
linked = bool(self._filters["linked"].get())
|
linked = bool(self._filters["linked"].get())
|
||||||
expired = bool(self._filters["expired"].get())
|
expired = bool(self._filters["expired"].get())
|
||||||
excluded = bool(self._filters["excluded"].get())
|
excluded = bool(self._filters["excluded"].get())
|
||||||
@@ -1168,8 +1181,18 @@ class InventoryOverview:
|
|||||||
else:
|
else:
|
||||||
frame.grid_remove()
|
frame.grid_remove()
|
||||||
|
|
||||||
|
def _on_tab_switched(self, event: tk.Event[ttk.Notebook]) -> None:
|
||||||
|
if self._manager.tabs.current_tab() == "Inventory":
|
||||||
|
# refresh only if we're switching to the tab
|
||||||
|
self.refresh()
|
||||||
|
|
||||||
def refresh(self):
|
def refresh(self):
|
||||||
for campaign in self._campaigns:
|
for campaign in self._campaigns:
|
||||||
|
# status
|
||||||
|
status_label = self._campaigns[campaign]["status"]
|
||||||
|
status_text, status_color = self.get_status(campaign)
|
||||||
|
status_label.config(text=status_text, foreground=status_color)
|
||||||
|
# visibility
|
||||||
self._update_visibility(campaign)
|
self._update_visibility(campaign)
|
||||||
self._canvas_update()
|
self._canvas_update()
|
||||||
|
|
||||||
@@ -1189,8 +1212,6 @@ class InventoryOverview:
|
|||||||
async def add_campaign(self, campaign: DropsCampaign) -> None:
|
async def add_campaign(self, campaign: DropsCampaign) -> None:
|
||||||
campaign_frame = ttk.Frame(self._main_frame, relief="ridge", borderwidth=1, padding=4)
|
campaign_frame = ttk.Frame(self._main_frame, relief="ridge", borderwidth=1, padding=4)
|
||||||
campaign_frame.grid(column=0, row=len(self._campaigns), sticky="nsew", pady=3)
|
campaign_frame.grid(column=0, row=len(self._campaigns), sticky="nsew", pady=3)
|
||||||
self._campaigns[campaign] = campaign_frame
|
|
||||||
self._update_visibility(campaign)
|
|
||||||
campaign_frame.rowconfigure(4, weight=1)
|
campaign_frame.rowconfigure(4, weight=1)
|
||||||
campaign_frame.columnconfigure(1, weight=1)
|
campaign_frame.columnconfigure(1, weight=1)
|
||||||
campaign_frame.columnconfigure(3, weight=10000)
|
campaign_frame.columnconfigure(3, weight=10000)
|
||||||
@@ -1199,18 +1220,11 @@ class InventoryOverview:
|
|||||||
campaign_frame, text=campaign.name, takefocus=False, width=45
|
campaign_frame, text=campaign.name, takefocus=False, width=45
|
||||||
).grid(column=0, row=0, columnspan=2, sticky="w")
|
).grid(column=0, row=0, columnspan=2, sticky="w")
|
||||||
# Status
|
# Status
|
||||||
if campaign.active:
|
status_text, status_color = self.get_status(campaign)
|
||||||
status_text: str = _("gui", "inventory", "status", "active")
|
status_label = ttk.Label(
|
||||||
status_color: tk._Color = "green"
|
|
||||||
elif campaign.upcoming:
|
|
||||||
status_text = _("gui", "inventory", "status", "upcoming")
|
|
||||||
status_color = "goldenrod"
|
|
||||||
else:
|
|
||||||
status_text = _("gui", "inventory", "status", "expired")
|
|
||||||
status_color = "red"
|
|
||||||
ttk.Label(
|
|
||||||
campaign_frame, text=status_text, takefocus=False, foreground=status_color
|
campaign_frame, text=status_text, takefocus=False, foreground=status_color
|
||||||
).grid(column=1, row=1, sticky="w", padx=4)
|
)
|
||||||
|
status_label.grid(column=1, row=1, sticky="w", padx=4)
|
||||||
# Starts / Ends
|
# Starts / Ends
|
||||||
MouseOverLabel(
|
MouseOverLabel(
|
||||||
campaign_frame,
|
campaign_frame,
|
||||||
@@ -1287,6 +1301,12 @@ class InventoryOverview:
|
|||||||
drop_frame, text=progress_text, foreground=progress_color
|
drop_frame, text=progress_text, foreground=progress_color
|
||||||
)
|
)
|
||||||
label.grid(column=0, row=1)
|
label.grid(column=0, row=1)
|
||||||
|
self._campaigns[campaign] = {
|
||||||
|
"frame": campaign_frame,
|
||||||
|
"status": status_label,
|
||||||
|
}
|
||||||
|
if self._manager.tabs.current_tab() == "Inventory":
|
||||||
|
self._update_visibility(campaign)
|
||||||
self._canvas_update()
|
self._canvas_update()
|
||||||
|
|
||||||
def clear(self) -> None:
|
def clear(self) -> None:
|
||||||
@@ -1295,6 +1315,18 @@ class InventoryOverview:
|
|||||||
self._drops.clear()
|
self._drops.clear()
|
||||||
self._campaigns.clear()
|
self._campaigns.clear()
|
||||||
|
|
||||||
|
def get_status(self, campaign: DropsCampaign) -> tuple[str, tk._Color]:
|
||||||
|
if campaign.active:
|
||||||
|
status_text: str = _("gui", "inventory", "status", "active")
|
||||||
|
status_color: tk._Color = "green"
|
||||||
|
elif campaign.upcoming:
|
||||||
|
status_text = _("gui", "inventory", "status", "upcoming")
|
||||||
|
status_color = "goldenrod"
|
||||||
|
else:
|
||||||
|
status_text = _("gui", "inventory", "status", "expired")
|
||||||
|
status_color = "red"
|
||||||
|
return (status_text, status_color)
|
||||||
|
|
||||||
def get_progress(self, drop: TimedDrop) -> tuple[str, tk._Color]:
|
def get_progress(self, drop: TimedDrop) -> tuple[str, tk._Color]:
|
||||||
progress_text: str
|
progress_text: str
|
||||||
progress_color: tk._Color = ''
|
progress_color: tk._Color = ''
|
||||||
|
|||||||
Reference in new issue
Block a user