""" 插件管理模块 提供插件管理主窗口,包含插件卡片列表和安装/更新/卸载入口。 使用 PySide6 构建的窗口框架。 主要功能: - 插件管理窗口界面 - 插件卡片列表渲染与状态刷新 - 插件事件的转发与处理 Author: Model Team Version: 0.0.1 """ import logging from qt_material import apply_stylesheet from .plugins_ui import Ui_FormPlugins from PySide6.QtGui import QIcon from PySide6.QtWidgets import QWidget, QListWidgetItem from PySide6.QtCore import QSize from .plugins_card import PluginsCard from .plugin_registry import PluginRegistry logger = logging.getLogger(__name__) class Plugins(QWidget, Ui_FormPlugins): """插件管理窗口。 继承自 QWidget 和 Ui_FormPlugins(Qt Designer 生成的 UI 界面), 负责展示插件卡片列表,处理插件安装/更新/卸载事件的转发。 可作为独立窗口或嵌入其他窗口使用。 """ def __init__(self, plugin_registry: PluginRegistry, parent: QWidget = None) -> None: """初始化插件管理窗口。 Args: plugin_registry: 插件注册中心实例,用于事件转发 parent: 父窗口对象,默认为 None(顶级窗口) """ super().__init__(parent) self.setupUi(self) self.plugin_registry = plugin_registry self.cards: dict = {} self.initUI() self.load_stylesheet() self.plugin_registry.update_plugins_card_signal.connect(self.on_update_plugins_card) self.plugin_registry.uninstall_completed_signal.connect(self.on_plugin_uninstalled) def initUI(self) -> None: """初始化窗口标题和图标。""" self.setWindowTitle("工具箱") self.setWindowIcon(QIcon('resources/tools.ico')) def load_stylesheet(self) -> None: """ 加载 Qt 样式表和自定义样式文件 使用 qt_material 库加载暗色主题,并应用自定义 QSS 样式表 失败时记录错误日志,但不影响应用继续运行(降级策略) 异常处理: - FileNotFoundError: 样式文件不存在 - RuntimeError: 主题加载失败 - 其他异常: 记录警告但不中断应用 """ try: apply_stylesheet(self, style=None,theme='dark_teal.xml', css_file='resources/my.qss') except FileNotFoundError as e: logger.warning(f"样式文件未找到,使用默认主题: {e}") except RuntimeError as e: logger.warning(f"主题加载失败,使用默认主题: {e}") except Exception as e: logger.warning(f"样式加载失败,使用默认主题: {e}") def on_update_plugins_card(self, plugins: dict) -> None: for name in plugins.keys(): if name in self.cards: # 卡片已存在,只刷新状态(避免重复创建叠加) self.cards[name].info = plugins[name] self.cards[name].refresh() else: item = QListWidgetItem(self.listWidget) plugin_card = PluginsCard(name, plugins[name]) plugin_card.send_event_signal.connect(self.plugin_registry.start_plugins_event) self.cards[name] = plugin_card item.setSizeHint(QSize(plugin_card.sizeHint().width(), 200)) self.listWidget.addItem(item) self.listWidget.setCurrentItem(item) self.listWidget.setItemWidget(item, plugin_card) def on_plugin_uninstalled(self, name: str) -> None: """卸载完成后刷新对应卡片状态。""" card = self.cards.get(name) if card is not None: card.refresh()