MetaCore-startup/MetaCore/ui/icon_manager.py
2025-10-11 09:27:51 +08:00

197 lines
5.4 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
图标管理器
统一管理应用程序中使用的所有图标
"""
import os
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import QSize
class IconManager:
"""图标管理器"""
# 图标目录路径
ICONS_DIR = "Resources/Icons"
# 图标文件映射
ICON_FILES = {
# 应用程序图标
'app': 'app_icon.png',
'logo': 'logo.png',
# 操作图标
'create': 'create.png',
'import': 'import.png',
'folder': 'folder.png',
'delete': 'delete.png',
'Refresh': 'Refresh.png',
# 视图图标
'grid_view': 'grid_view.png',
'list_view': 'list_view.png',
# 导航图标
'overview': 'overview.png',
'management': 'management.png',
'resource_category': 'category.png',
'resource_management': 'resource.png',
'project_settings': 'settings.png',
'system_settings': 'system.png',
# 树箭头
'down': 'down.png',
'right': 'right.png',
}
# 图标缓存
_icon_cache = {}
@classmethod
def get_icon(cls, icon_name: str, size: QSize = None) -> QIcon:
"""
获取图标
Args:
icon_name (str): 图标名称
size (QSize, optional): 图标尺寸
Returns:
QIcon: 图标对象,如果文件不存在则返回空图标
"""
# 检查缓存
cache_key = f"{icon_name}_{size.width() if size else 'default'}_{size.height() if size else 'default'}"
if cache_key in cls._icon_cache:
return cls._icon_cache[cache_key]
# 获取图标文件路径
icon_path = cls.get_icon_path(icon_name)
if not icon_path or not os.path.exists(icon_path):
# 如果图标文件不存在,返回空图标
icon = QIcon()
else:
# 创建图标
if size:
pixmap = QPixmap(icon_path).scaled(size, aspectRatioMode=1, transformMode=1)
icon = QIcon(pixmap)
else:
icon = QIcon(icon_path)
# 缓存图标
cls._icon_cache[cache_key] = icon
return icon
@classmethod
def get_icon_path(cls, icon_name: str) -> str:
"""
获取图标文件路径
Args:
icon_name (str): 图标名称
Returns:
str: 图标文件的完整路径,如果不存在则返回空字符串
"""
if icon_name not in cls.ICON_FILES:
return ""
icon_file = cls.ICON_FILES[icon_name]
icon_path = os.path.join(cls.ICONS_DIR, icon_file)
return icon_path
@classmethod
def get_pixmap(cls, icon_name: str, size: QSize = None) -> QPixmap:
"""
获取图标的 QPixmap 对象
Args:
icon_name (str): 图标名称
size (QSize, optional): 图标尺寸
Returns:
QPixmap: 图标的 QPixmap 对象
"""
icon_path = cls.get_icon_path(icon_name)
if not icon_path or not os.path.exists(icon_path):
return QPixmap()
pixmap = QPixmap(icon_path)
if size:
pixmap = pixmap.scaled(size, aspectRatioMode=1, transformMode=1)
return pixmap
@classmethod
def icon_exists(cls, icon_name: str) -> bool:
"""
检查图标是否存在
Args:
icon_name (str): 图标名称
Returns:
bool: 图标文件是否存在
"""
icon_path = cls.get_icon_path(icon_name)
return icon_path and os.path.exists(icon_path)
@classmethod
def get_project_type_icon(cls, project_type: str) -> QIcon:
"""
根据项目类型获取对应图标
Args:
project_type (str): 项目类型
Returns:
QIcon: 项目类型对应的图标
"""
icon_name = f"project_{project_type}"
if icon_name in cls.ICON_FILES:
return cls.get_icon(icon_name)
else:
# 如果没有对应的项目类型图标,返回默认项目图标
return cls.get_icon('project_empty')
@classmethod
def clear_cache(cls):
"""清空图标缓存"""
cls._icon_cache.clear()
@classmethod
def ensure_icons_directory(cls):
"""确保图标目录存在"""
if not os.path.exists(cls.ICONS_DIR):
os.makedirs(cls.ICONS_DIR, exist_ok=True)
@classmethod
def get_available_icons(cls) -> list:
"""
获取所有可用的图标列表
Returns:
list: 可用图标名称列表
"""
available_icons = []
for icon_name in cls.ICON_FILES:
if cls.icon_exists(icon_name):
available_icons.append(icon_name)
return available_icons
@classmethod
def get_missing_icons(cls) -> list:
"""
获取缺失的图标列表
Returns:
list: 缺失图标名称列表
"""
missing_icons = []
for icon_name in cls.ICON_FILES:
if not cls.icon_exists(icon_name):
missing_icons.append(icon_name)
return missing_icons