""" System Tray Icon Handler Manages the application in the system tray """ import pystray import logging from typing import Callable, Optional from PIL import Image, ImageDraw logger = logging.getLogger(__name__) class SystemTrayIcon: def __init__(self, app_name: str): self.app_name = app_name self.icon: Optional[pystray.Icon] = None self.status_text = "Initializing..." self.on_quit: Optional[Callable] = None self.on_show: Optional[Callable] = None def _create_image(self, status: str = "ready") -> Image.Image: """Create a simple tray icon image""" size = 64 color_map = { 'ready': (0, 200, 0), 'running': (0, 150, 200), 'error': (200, 0, 0), 'waiting': (200, 150, 0), } color = color_map.get(status, (128, 128, 128)) image = Image.new('RGB', (size, size), color) draw = ImageDraw.Draw(image) draw.rectangle([0, 0, size-1, size-1], outline=(0, 0, 0), width=2) return image def set_status(self, status: str, text: str): """Update the tray icon status""" self.status_text = text if self.icon: self.icon.update_menu() def create_menu(self) -> pystray.Menu: """Create the context menu for the tray icon""" menu_items = [ pystray.MenuItem(f"📊 {self.app_name}", action=None), pystray.MenuItem("─" * 30, action=None), pystray.MenuItem("Status: " + self.status_text, action=None), pystray.MenuItem("─" * 30, action=None), pystray.MenuItem("Quit", self._on_quit_click), ] return pystray.Menu(*menu_items) def _on_quit_click(self, icon, item): """Handle quit click""" if self.on_quit: self.on_quit() if self.icon: self.icon.stop() def run(self): """Run the tray icon""" try: self.icon = pystray.Icon( name=self.app_name, icon=self._create_image('running'), menu=self.create_menu(), title=self.app_name ) self.icon.run() except Exception as e: logger.error(f"Error running tray icon: {e}") def stop(self): """Stop the tray icon""" if self.icon: self.icon.stop() def set_callbacks(self, on_quit: Optional[Callable] = None, on_show: Optional[Callable] = None): """Set callback functions""" self.on_quit = on_quit self.on_show = on_show