- README: 补充项目概述、技术栈、架构图(Mermaid)、插件生命周期时序图 - build.py: 补充模块和函数 docstring - core/__init__.py: 修正模块说明(工具箱→插件系统) - log.py: 修复过时注释,清理死代码,抑制第三方库日志刷屏 - plugin_registry.py: 修正矛盾注释,补充缺失日志,隐藏远程路径 - plugins.py: 修正过时注释,清理死代码和无用导入 - plugins_card.py: 修正错误类名注释,补充全量 docstring - main.py: 修正错误注释,补充启动/退出/插件加载日志
104 lines
3.7 KiB
Python
104 lines
3.7 KiB
Python
"""
|
||
插件管理模块
|
||
|
||
提供插件管理主窗口,包含插件卡片列表和安装/更新/卸载入口。
|
||
使用 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() |