"""Icono de bandeja del sistema.""" import sys from pathlib import Path from PySide6.QtCore import Qt from PySide6.QtGui import QColor, QIcon, QPainter, QPixmap _ASSETS_DIR = Path(__file__).resolve().parent.parent.parent / "packaging" / "assets" def _generated_tray_icon() -> QIcon: """Icono simple en memoria si no hay archivo empaquetado.""" size = 32 pixmap = QPixmap(size, size) pixmap.fill(Qt.GlobalColor.transparent) painter = QPainter(pixmap) painter.setRenderHint(QPainter.RenderHint.Antialiasing) painter.setBrush(QColor(0, 120, 215)) painter.setPen(Qt.PenStyle.NoPen) painter.drawRoundedRect(2, 2, size - 4, size - 4, 6, 6) painter.setPen(QColor(255, 255, 255)) font = painter.font() font.setBold(True) font.setPointSize(14) painter.setFont(font) painter.drawText(pixmap.rect(), Qt.AlignmentFlag.AlignCenter, "C") painter.end() return QIcon(pixmap) def load_tray_icon() -> QIcon: """Carga icono de bandeja desde assets empaquetados o genera uno por defecto.""" candidates: list[Path] = [] meipass = getattr(sys, "_MEIPASS", None) if meipass: base = Path(meipass) candidates.extend( [ base / "packaging" / "assets" / "tray-icon.png", base / "packaging" / "assets" / "tray-icon.ico", ] ) candidates.extend( [ _ASSETS_DIR / "tray-icon.png", _ASSETS_DIR / "tray-icon.ico", ] ) for path in candidates: if path.is_file(): icon = QIcon(str(path)) if not icon.isNull(): return icon return _generated_tray_icon()