from enum import Enum, auto from PyQt6.QtGui import QIcon from pathlib import Path import requests import os class IconType(Enum): # Навигация HOME = auto() SETTINGS = auto() MENU = "menu" BACK = "arrow-back" FORWARD = "arrow-forward" # Действия ADD = "add" REMOVE = "remove" EDIT = "edit" DELETE = "delete" SAVE = "save" REFRESH = "refresh" SEARCH = "search" # Медиа IMAGE = auto() VIDEO = "video" AUDIO = "audio" PLAY = "play" PAUSE = "pause" STOP = "stop" # Статусы SUCCESS = "check-circle" WARNING = "warning" ERROR = "error" INFO = "info" # Интерфейс CLOSE = "close" MINIMIZE = "minimize" MAXIMIZE = "maximize" RESTORE = "restore" # Тема LIGHT_MODE = "light-mode" DARK_MODE = "dark-mode" class IconManager: _instance = None _icons = {} def __new__(cls): if cls._instance is None: cls._instance = super(IconManager, cls).__new__(cls) cls._instance._download_icons() return cls._instance @classmethod def get_instance(cls): if cls._instance is None: cls._instance = cls() return cls._instance def _download_icons(self): """Загрузка иконок из интернета""" icons_dir = Path("resources/icons") icons_dir.mkdir(parents=True, exist_ok=True) icons = { IconType.HOME: "https://api.iconify.design/mdi/home.svg", IconType.IMAGE: "https://api.iconify.design/mdi/image.svg", IconType.SETTINGS: "https://api.iconify.design/mdi/cog.svg" } for icon_type, url in icons.items(): icon_path = icons_dir / f"{icon_type.name.lower()}.svg" if not icon_path.exists(): try: response = requests.get(url) response.raise_for_status() with open(icon_path, "wb") as f: f.write(response.content) except Exception as e: print(f"Ошибка при загрузке иконки {icon_type}: {e}") self._icons[icon_type] = QIcon(str(icon_path)) def get_icon(self, icon_type: IconType) -> QIcon: """Получение иконки по типу""" return self._icons.get(icon_type, QIcon()) def get_themed_icon(self, icon_type: IconType, theme: str) -> QIcon: """Получение иконки с учетом темы""" icon_file = Path("resources/icons") / theme / f"{icon_type.value}.svg" if icon_file.exists(): return QIcon(str(icon_file)) return self.get_icon(icon_type)