EU-Utility/core/tray_icon.py

83 lines
2.7 KiB
Python

"""
EU-Utility - System Tray Icon (Simplified)
==========================================
Simple, responsive system tray icon.
"""
from PyQt6.QtWidgets import QSystemTrayIcon, QMenu, QApplication, QWidget
from PyQt6.QtGui import QAction, QIcon, QColor, QPainter, QFont
from PyQt6.QtCore import pyqtSignal
class TrayIcon(QWidget):
"""Simple system tray icon for EU-Utility."""
show_dashboard = pyqtSignal()
toggle_activity_bar = pyqtSignal()
open_settings = pyqtSignal()
quit_app = pyqtSignal()
def __init__(self, app: QApplication, parent=None):
super().__init__(parent)
self.app = app
# Create icon
self._create_icon()
# Create menu (but don't set it yet)
self._create_menu()
# Connect signals
self.tray_icon.activated.connect(self._on_activated)
def _create_icon(self):
"""Create tray icon."""
# Create simple icon
px = QPixmap(64, 64)
px.fill(QColor(255, 140, 66)) # Orange
painter = QPainter(px)
painter.setPen(QColor(255, 255, 255))
font = QFont("Segoe UI", 24, QFont.Weight.Bold)
painter.setFont(font)
painter.drawText(px.rect(), 0x84, "EU") # AlignCenter
painter.end()
self.tray_icon = QSystemTrayIcon(self)
self.tray_icon.setIcon(QIcon(px))
self.tray_icon.setToolTip("EU-Utility")
self.tray_icon.show()
def _create_menu(self):
"""Create simple context menu."""
self.menu = QMenu()
# Simple actions (no emojis to avoid encoding issues)
self.dashboard_action = QAction("Dashboard", self)
self.dashboard_action.triggered.connect(self.show_dashboard.emit)
self.menu.addAction(self.dashboard_action)
self.activity_bar_action = QAction("Activity Bar", self)
self.activity_bar_action.setCheckable(True)
self.activity_bar_action.triggered.connect(self.toggle_activity_bar.emit)
self.menu.addAction(self.activity_bar_action)
self.menu.addSeparator()
self.quit_action = QAction("Quit", self)
self.quit_action.triggered.connect(self.quit_app.emit)
self.menu.addAction(self.quit_action)
# Set context menu
self.tray_icon.setContextMenu(self.menu)
def _on_activated(self, reason):
"""Handle double-click."""
if reason == QSystemTrayIcon.ActivationReason.DoubleClick:
self.show_dashboard.emit()
def set_activity_bar_checked(self, checked: bool):
"""Update checkbox."""
self.activity_bar_action.setChecked(checked)