Display campaign's game, clear progress when idle

This commit is contained in:
DevilXD committed 2022-11-30 10:47:56 +01:00
1 parent e4088699c5
commit 36597d9a4a
2 files changed
+69 -24

No files matched your search

+67 -22
View File
@@ -494,6 +494,7 @@ class _BaseVars(TypedDict):
class _CampaignVars(_BaseVars): class _CampaignVars(_BaseVars):
name: StringVar name: StringVar
game: StringVar
class _DropVars(_BaseVars): class _DropVars(_BaseVars):
@@ -512,15 +513,16 @@ class CampaignProgress:
self._manager = manager self._manager = manager
self._vars: _ProgressVars = { self._vars: _ProgressVars = {
"campaign": { "campaign": {
"name": StringVar(master, "..."), # campaign name "name": StringVar(master), # campaign name
"game": StringVar(master), # game name
"progress": DoubleVar(master), # controls the progress bar "progress": DoubleVar(master), # controls the progress bar
"percentage": StringVar(master, "-%"), # percentage display string "percentage": StringVar(master), # percentage display string
"remaining": StringVar(master), # time remaining string, filled via _update_time "remaining": StringVar(master), # time remaining string, filled via _update_time
}, },
"drop": { "drop": {
"rewards": StringVar(master, "..."), # drop rewards "rewards": StringVar(master), # drop rewards
"progress": DoubleVar(master), # as above "progress": DoubleVar(master), # as above
"percentage": StringVar(master, "-%"), # as above "percentage": StringVar(master), # as above
"remaining": StringVar(master), # as above "remaining": StringVar(master), # as above
}, },
} }
@@ -530,10 +532,22 @@ class CampaignProgress:
frame.grid(column=0, row=2, columnspan=2, sticky="nsew", padx=2) frame.grid(column=0, row=2, columnspan=2, sticky="nsew", padx=2)
frame.columnconfigure(0, weight=2) frame.columnconfigure(0, weight=2)
frame.columnconfigure(1, weight=1) frame.columnconfigure(1, weight=1)
ttk.Label(frame, text=_("gui", "progress", "campaign")).grid(column=0, row=0, columnspan=2) game_campaign = ttk.Frame(frame)
game_campaign.grid(column=0, row=0, columnspan=2, sticky="nsew")
game_campaign.columnconfigure(0, weight=1)
game_campaign.columnconfigure(1, weight=1)
ttk.Label( ttk.Label(
frame, textvariable=self._vars["campaign"]["name"] game_campaign, text="Game:"
).grid(column=0, row=1, columnspan=2) ).grid(column=0, row=0)
ttk.Label(
game_campaign, textvariable=self._vars["campaign"]["game"]
).grid(column=0, row=1)
ttk.Label(
game_campaign, text=_("gui", "progress", "campaign")
).grid(column=1, row=0)
ttk.Label(
game_campaign, textvariable=self._vars["campaign"]["name"]
).grid(column=1, row=1)
ttk.Label( ttk.Label(
frame, text=_("gui", "progress", "campaign_progress") frame, text=_("gui", "progress", "campaign_progress")
).grid(column=0, row=2, rowspan=2) ).grid(column=0, row=2, rowspan=2)
@@ -567,7 +581,7 @@ class CampaignProgress:
).grid(column=0, row=10, columnspan=2) ).grid(column=0, row=10, columnspan=2)
self._drop: TimedDrop | None = None self._drop: TimedDrop | None = None
self._timer_task: asyncio.Task[None] | None = None self._timer_task: asyncio.Task[None] | None = None
self._update_time(0) self.display(None)
@staticmethod @staticmethod
def _divmod(minutes: int, seconds: int) -> tuple[int, int]: def _divmod(minutes: int, seconds: int) -> tuple[int, int]:
@@ -620,22 +634,32 @@ class CampaignProgress:
self._timer_task.cancel() self._timer_task.cancel()
self._timer_task = None self._timer_task = None
def display(self, drop: TimedDrop, *, countdown: bool = True, subone: bool = False): def display(self, drop: TimedDrop | None, *, countdown: bool = True, subone: bool = False):
self._drop = drop self._drop = drop
# drop update
vars_drop = self._vars["drop"] vars_drop = self._vars["drop"]
vars_campaign = self._vars["campaign"]
self.stop_timer()
if drop is None:
# clear the drop display
vars_drop["rewards"].set("...")
vars_drop["progress"].set(0.0)
vars_drop["percentage"].set("-%")
vars_campaign["name"].set("...")
vars_campaign["game"].set("...")
vars_campaign["progress"].set(0.0)
vars_campaign["percentage"].set("-%")
self._update_time(0)
return
vars_drop["rewards"].set(drop.rewards_text()) vars_drop["rewards"].set(drop.rewards_text())
vars_drop["progress"].set(drop.progress) vars_drop["progress"].set(drop.progress)
vars_drop["percentage"].set(f"{drop.progress:6.1%}") vars_drop["percentage"].set(f"{drop.progress:6.1%}")
# campaign update
campaign = drop.campaign campaign = drop.campaign
vars_campaign = self._vars["campaign"]
vars_campaign["name"].set(campaign.name) vars_campaign["name"].set(campaign.name)
vars_campaign["game"].set(campaign.game.name)
vars_campaign["progress"].set(campaign.progress) vars_campaign["progress"].set(campaign.progress)
vars_campaign["percentage"].set( vars_campaign["percentage"].set(
f"{campaign.progress:6.1%} ({campaign.claimed_drops}/{campaign.total_drops})" f"{campaign.progress:6.1%} ({campaign.claimed_drops}/{campaign.total_drops})"
) )
self.stop_timer()
if countdown: if countdown:
# restart our seconds update timer # restart our seconds update timer
self.start_timer() self.start_timer()
@@ -1008,7 +1032,7 @@ class TrayIcon:
return asyncio.create_task(notifier()) return asyncio.create_task(notifier())
return None return None
def update_title(self, drop: TimedDrop): def update_title(self, drop: TimedDrop | None):
if self.icon is not None: if self.icon is not None:
self.icon.title = self.get_title(drop) self.icon.title = self.get_title(drop)
@@ -1929,6 +1953,10 @@ class GUIManager:
# inventory overview is updated from within drops themselves via change events # inventory overview is updated from within drops themselves via change events
self.tray.update_title(drop) # tray self.tray.update_title(drop) # tray
def clear_drop(self):
self.progress.display(None)
self.tray.update_title(None)
def print(self, *args, **kwargs): def print(self, *args, **kwargs):
# print to our custom output # print to our custom output
self.output.print(*args, **kwargs) self.output.print(*args, **kwargs)
@@ -1965,7 +1993,7 @@ if __name__ == "__main__":
drops: bool, drops: bool,
viewers: int, viewers: int,
points: int, points: int,
priority: bool, acl_based: bool,
): ):
# status: 0 -> OFFLINE, 1 -> PENDING_ONLINE, 2 -> ONLINE # status: 0 -> OFFLINE, 1 -> PENDING_ONLINE, 2 -> ONLINE
if status == 1: if status == 1:
@@ -1987,11 +2015,12 @@ if __name__ == "__main__":
game=game_obj, game=game_obj,
drops_enabled=drops, drops_enabled=drops,
viewers=viewers, viewers=viewers,
priority=priority, acl_based=acl_based,
) )
def create_drop( def create_drop(
campaign_name: str, campaign_name: str,
game_name: str,
rewards: list[str], rewards: list[str],
claimed_drops: int, claimed_drops: int,
total_drops: int, total_drops: int,
@@ -2013,6 +2042,7 @@ if __name__ == "__main__":
campaign=HashNamespace( campaign=HashNamespace(
name=campaign_name, name=campaign_name,
id="campaign", id="campaign",
game=create_game(0, game_name),
expired=False, expired=False,
active=False, active=False,
upcoming=True, upcoming=True,
@@ -2080,12 +2110,18 @@ if __name__ == "__main__":
# Channel list # Channel list
gui.channels.display( gui.channels.display(
create_channel( create_channel(
name="Thomus", status=0, game=None, drops=False, viewers=0, points=0, priority=True name="Thomus",
status=0,
game=None,
drops=False,
viewers=0,
points=0,
acl_based=True,
), ),
add=True, add=True,
) )
channel = create_channel( channel = create_channel(
name="Traitus", status=1, game=None, drops=False, viewers=0, points=0, priority=True name="Traitus", status=1, game=None, drops=False, viewers=0, points=0, acl_based=True
) )
gui.channels.display(channel, add=True,) gui.channels.display(channel, add=True,)
gui.channels.set_watching(channel) gui.channels.set_watching(channel)
@@ -2097,7 +2133,7 @@ if __name__ == "__main__":
drops=True, drops=True,
viewers=42, viewers=42,
points=1234567, points=1234567,
priority=False, acl_based=False,
), ),
add=True, add=True,
) )
@@ -2109,7 +2145,7 @@ if __name__ == "__main__":
drops=True, drops=True,
viewers=69, viewers=69,
points=1234567, points=1234567,
priority=False, acl_based=False,
), ),
add=True, add=True,
) )
@@ -2117,12 +2153,21 @@ if __name__ == "__main__":
gui.channels.get_selection() gui.channels.get_selection()
# Tray # Tray
# gui.tray.minimize() # gui.tray.minimize()
await asyncio.sleep(1) await asyncio.sleep(2)
gui.tray.notify("Bounty Coins (3/7)", "Mined Drop") gui.tray.notify("Bounty Coins (3/7)", "Mined Drop")
# Inventory overview # Inventory overview
drop = create_drop("Wardrobe Cleaning", ["Fancy Pants"], 2, 7, 239, 240) drop = create_drop(
"Wardrobe Cleaning", "Cleaning Masters", ["Fancy Pants"], 2, 7, 239, 240
)
await gui.inv.add_campaign(drop.campaign) await gui.inv.add_campaign(drop.campaign)
# Drop progress # Drop progress
gui.display_drop(drop, countdown=False)
await asyncio.sleep(3)
gui.progress.start_timer()
await asyncio.sleep(5)
gui.clear_drop()
await asyncio.sleep(5)
gui.display_drop(drop) gui.display_drop(drop)
await asyncio.sleep(63) await asyncio.sleep(63)
+2 -2
View File
@@ -1045,9 +1045,9 @@ class Twitch:
self.watching_channel.set(channel) self.watching_channel.set(channel)
def stop_watching(self): def stop_watching(self):
self.gui.progress.stop_timer() self.gui.clear_drop()
self.gui.channels.clear_watching()
self.watching_channel.clear() self.watching_channel.clear()
self.gui.channels.clear_watching()
def restart_watching(self): def restart_watching(self):
self.gui.progress.stop_timer() self.gui.progress.stop_timer()