barebone app with django and react, sse, jwt token, comport reader, test comport writer, requires com0com, users with groups, sample table vehicles, tokens for access and refresh
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user