From 35c46c2b78ea0a3f2cbb9ea17b18aeab45dd2c5a Mon Sep 17 00:00:00 2001 From: DevilXD <4180725+DevilXD@users.noreply.github.com> Date: Mon, 1 Jul 2024 21:20:27 +0200 Subject: [PATCH] Implement a dynamic tray icon status picture --- appimage/AppImageBuilder.yml | 2 +- build.spec | 9 +++++++-- gui.py | 25 +++++++++++++++++++++---- icons/active.ico | Bin 0 -> 67646 bytes icons/error.ico | Bin 0 -> 67646 bytes icons/idle.ico | Bin 0 -> 67646 bytes icons/maint.ico | Bin 0 -> 67646 bytes pickaxe.ico => icons/pickaxe.ico | Bin main.py | 3 ++- twitch.py | 4 ++++ 10 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 icons/active.ico create mode 100644 icons/error.ico create mode 100644 icons/idle.ico create mode 100644 icons/maint.ico rename pickaxe.ico => icons/pickaxe.ico (100%) diff --git a/appimage/AppImageBuilder.yml b/appimage/AppImageBuilder.yml index ba71833..284f47b 100644 --- a/appimage/AppImageBuilder.yml +++ b/appimage/AppImageBuilder.yml @@ -19,7 +19,7 @@ script: # Package the app. - mkdir -p "$TARGET_APPDIR"/usr/{src,share/icons/hicolor/128x128/apps} - - cp -r "$SOURCE_DIR/../lang" "$SOURCE_DIR/../pickaxe.ico" "$SOURCE_DIR"/../*.py "$TARGET_APPDIR/usr/src" + - cp -r "$SOURCE_DIR/../lang" "$SOURCE_DIR/../icons" "$SOURCE_DIR"/../*.py "$TARGET_APPDIR/usr/src" - cp "$SOURCE_DIR/pickaxe.png" "$TARGET_APPDIR/usr/share/icons/hicolor/128x128/apps/io.github.devilxd.twitchdropsminer.png" # Install requirements. diff --git a/build.spec b/build.spec index e14aac6..4ff7224 100644 --- a/build.spec +++ b/build.spec @@ -17,7 +17,12 @@ if TYPE_CHECKING: # (source_path, dest_path, required) to_add: list[tuple[Path, str, bool]] = [ - (Path("pickaxe.ico"), '.', True), # icon file + # icon files + (Path("icons/pickaxe.ico"), "./icons", True), + (Path("icons/active.ico"), "./icons", True), + (Path("icons/idle.ico"), "./icons", True), + (Path("icons/error.ico"), "./icons", True), + (Path("icons/maint.ico"), "./icons", True), # SeleniumWire HTTPS/SSL cert file and key (Path(SITE_PACKAGES_PATH, "seleniumwire/ca.crt"), "./seleniumwire", False), (Path(SITE_PACKAGES_PATH, "seleniumwire/ca.key"), "./seleniumwire", False), @@ -99,10 +104,10 @@ exe = EXE( console=False, upx_exclude=[], target_arch=None, - icon="pickaxe.ico", runtime_tmpdir=None, codesign_identity=None, entitlements_file=None, + icon="icons/pickaxe.ico", bootloader_ignore_signals=False, disable_windowed_traceback=False, name="Twitch Drops Miner (by DevilXD)", diff --git a/gui.py b/gui.py index 5af35dc..12cba14 100644 --- a/gui.py +++ b/gui.py @@ -1044,13 +1044,21 @@ class TrayIcon: def __init__(self, manager: GUIManager, master: ttk.Widget): self._manager = manager self.icon: pystray.Icon | None = None - self.icon_image = Image_module.open(resource_path("pickaxe.ico")) + self._icon_images: dict[str, Image_module.Image] = { + "pickaxe": Image_module.open(resource_path("icons/pickaxe.ico")), + "active": Image_module.open(resource_path("icons/active.ico")), + "idle": Image_module.open(resource_path("icons/idle.ico")), + "error": Image_module.open(resource_path("icons/error.ico")), + "maint": Image_module.open(resource_path("icons/maint.ico")), + } + self._icon_state: str = "pickaxe" self._button = ttk.Button(master, command=self.minimize, text=_("gui", "tray", "minimize")) self._button.grid(column=0, row=0, sticky="ne") def __del__(self) -> None: self.stop() - self.icon_image.close() + for icon_image in self._icon_images.values(): + icon_image.close() def _shorten(self, text: str, by_len: int, min_len: int) -> str: if (text_len := len(text)) <= min_len + 3 or by_len <= 0: @@ -1096,7 +1104,9 @@ class TrayIcon: pystray.Menu.SEPARATOR, pystray.MenuItem(_("gui", "tray", "quit"), bridge(self.quit)), ) - self.icon = pystray.Icon("twitch_miner", self.icon_image, self.get_title(drop), menu) + self.icon = pystray.Icon( + "twitch_miner", self._icon_images[self._icon_state], self.get_title(drop), menu + ) # self.icon.run_detached() loop.run_in_executor(None, self.icon.run) @@ -1142,6 +1152,13 @@ class TrayIcon: if self.icon is not None: self.icon.title = self.get_title(drop) + def change_icon(self, state: str): + if state not in self._icon_images: + raise ValueError("Invalid icon state") + self._icon_state = state + if self.icon is not None: + self.icon.icon = self._icon_images[state] + class Notebook: def __init__(self, manager: GUIManager, master: ttk.Widget): @@ -1937,7 +1954,7 @@ class GUIManager: # withdraw immediately to prevent the window from flashing self._root.withdraw() # root.resizable(False, True) - set_root_icon(root, resource_path("pickaxe.ico")) + set_root_icon(root, resource_path("icons/pickaxe.ico")) root.title(WINDOW_TITLE) # window title root.bind_all("", self.unfocus) # pressing ESC unfocuses selection # Image cache for displaying images diff --git a/icons/active.ico b/icons/active.ico new file mode 100644 index 0000000000000000000000000000000000000000..a0e3471b4a3fbc5d685d5325c872038119861d06 GIT binary patch literal 67646 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 aFop2JQrMbHkk}gbi)Se@3ws6I-~1nU`Nwzw literal 0 HcmV?d00001 diff --git a/icons/error.ico b/icons/error.ico new file mode 100644 index 0000000000000000000000000000000000000000..9cd1ccd1f829142b6c85842a507d2b6f202eeb5c GIT binary patch literal 67646 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 MMX|6~vHRWs0dVkzM*si- literal 0 HcmV?d00001 diff --git a/pickaxe.ico b/icons/pickaxe.ico similarity index 100% rename from pickaxe.ico rename to icons/pickaxe.ico diff --git a/main.py b/main.py index f192ee9..eb6bd85 100644 --- a/main.py +++ b/main.py @@ -87,7 +87,7 @@ if __name__ == "__main__": root = tk.Tk() root.overrideredirect(True) root.withdraw() - set_root_icon(root, resource_path("pickaxe.ico")) + set_root_icon(root, resource_path("icons/pickaxe.ico")) root.update() parser = Parser( SELF_PATH.name, @@ -168,6 +168,7 @@ if __name__ == "__main__": await client.shutdown() if not client.gui.close_requested: # user didn't request the closure + client.gui.tray.change_icon("error") client.print(_("status", "terminated")) client.gui.status.update(_("gui", "status", "terminated")) # notify the user about the closure diff --git a/twitch.py b/twitch.py index 5436001..975e341 100644 --- a/twitch.py +++ b/twitch.py @@ -608,11 +608,13 @@ class Twitch: if self.settings.dump: self.gui.close() continue + self.gui.tray.change_icon("idle") self.gui.status.update(_("gui", "status", "idle")) self.stop_watching() # clear the flag and wait until it's set again self._state_change.clear() elif self._state is State.INVENTORY_FETCH: + self.gui.tray.change_icon("maint") # ensure the websocket is running await self.websocket.start() await self.fetch_inventory() @@ -835,6 +837,7 @@ class Twitch: self.change_state(State.IDLE) del new_watching, selected_channel, watching_channel elif self._state is State.EXIT: + self.gui.tray.change_icon("pickaxe") self.gui.status.update(_("gui", "status", "exiting")) # we've been requested to exit the application break @@ -982,6 +985,7 @@ class Twitch: ) def watch(self, channel: Channel, *, update_status: bool = True): + self.gui.tray.change_icon("active") self.gui.channels.set_watching(channel) self.watching_channel.set(channel) if update_status: