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:
2026-01-17 13:03:21 +02:00
commit 7f04566242
81 changed files with 22551 additions and 0 deletions
+82
View File
@@ -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