120 lines
4.1 KiB
Python
120 lines
4.1 KiB
Python
from PySide6.QtCore import QAbstractListModel, QModelIndex, Qt
|
|
from PySide6.QtWidgets import QWidget, QFormLayout, QVBoxLayout
|
|
from qfluentwidgets import (
|
|
MessageBoxBase, LineEdit, ModelComboBox, TextEdit, TeachingTip,
|
|
InfoBarIcon, TeachingTipTailPosition
|
|
)
|
|
|
|
from common.utils import SAFE, SAFE_MAP, SAFE_MAP_ICON
|
|
|
|
|
|
class SafeStatusListModel(QAbstractListModel):
|
|
|
|
def __init__(self, parent: QWidget = None):
|
|
super().__init__(parent)
|
|
self.safe_status = SAFE
|
|
|
|
def rowCount(self, /, parent = ...):
|
|
return len(self.safe_status)
|
|
|
|
def columnCount(self, parent, /):
|
|
return 1
|
|
|
|
def data(self, index: QModelIndex, /, role: int = ...):
|
|
row = index.row()
|
|
if role == Qt.ItemDataRole.EditRole:
|
|
return SAFE_MAP[self.safe_status[row]]
|
|
elif role == Qt.ItemDataRole.DecorationRole:
|
|
return SAFE_MAP_ICON[self.safe_status[row]]
|
|
elif role == Qt.ItemDataRole.UserRole:
|
|
return self.safe_status[row]
|
|
return None
|
|
|
|
# --- 添加/编辑 对话框 ---
|
|
class ExtensionDialog(MessageBoxBase):
|
|
"""用于添加或编辑插件条目的对话框。"""
|
|
|
|
def __init__(self, extension_data: dict[str, str | int] = None, parent=None):
|
|
super().__init__(parent)
|
|
self.is_edit_mode = extension_data is not None
|
|
|
|
self.setMinimumWidth(400)
|
|
|
|
# 创建控件
|
|
self.lne_id = LineEdit(self)
|
|
self.lne_name = LineEdit(self)
|
|
self.safe_combo = ModelComboBox(self)
|
|
self.notes_edit = TextEdit(self)
|
|
|
|
# 填充 SAFE 下拉框 (使用新的 MAP)
|
|
safe_list_model = SafeStatusListModel(self)
|
|
self.safe_combo.setModel(safe_list_model)
|
|
|
|
# 布局
|
|
form_layout = QFormLayout()
|
|
form_layout.addRow("ID:", self.lne_id)
|
|
form_layout.addRow("名称:", self.lne_name)
|
|
form_layout.addRow("安全状态:", self.safe_combo)
|
|
form_layout.addRow("备注:", self.notes_edit)
|
|
|
|
self.cw = QWidget(self)
|
|
main_layout = QVBoxLayout()
|
|
main_layout.addLayout(form_layout)
|
|
self.cw.setLayout(main_layout)
|
|
|
|
self.viewLayout.addWidget(self.cw)
|
|
|
|
if self.is_edit_mode:
|
|
self.lne_id.setText(extension_data.get("ID", ""))
|
|
self.lne_id.setReadOnly(True) # ID 不允许修改
|
|
self.lne_name.setText(extension_data.get("NAME", ""))
|
|
safe_status: int = extension_data.get("SAFE", -2)
|
|
self.safe_combo.setCurrentIndex(SAFE.index(safe_status))
|
|
self.notes_edit.setText(extension_data.get("NOTES", ""))
|
|
else:
|
|
self.safe_combo.setCurrentIndex(SAFE.index(-2))
|
|
|
|
def validate(self) -> bool:
|
|
if len(self.lne_id.text()) == 0:
|
|
TeachingTip.create(
|
|
target=self.lne_id,
|
|
title="错误",
|
|
content="ID 不能为空!",
|
|
icon=InfoBarIcon.ERROR,
|
|
isClosable=True,
|
|
duration=2000,
|
|
tailPosition=TeachingTipTailPosition.BOTTOM,
|
|
parent=self
|
|
)
|
|
return False
|
|
if len(self.lne_name.text()) == 0:
|
|
TeachingTip.create(
|
|
target=self.lne_name,
|
|
title="错误",
|
|
content="名称不能为空!",
|
|
icon=InfoBarIcon.ERROR,
|
|
isClosable=True,
|
|
duration=2000,
|
|
tailPosition=TeachingTipTailPosition.BOTTOM,
|
|
parent=self,
|
|
)
|
|
return False
|
|
return True
|
|
|
|
def get_data(self) -> dict[str, str | int]:
|
|
"""获取对话框中用于 'add_one' 的数据"""
|
|
return {
|
|
"ID": self.lne_id.text(),
|
|
"NAME": self.lne_name.text(),
|
|
"SAFE": self.safe_combo.currentData(),
|
|
"NOTES": self.notes_edit.toPlainText()
|
|
}
|
|
|
|
def get_update_payload(self) -> dict[str, str | int]:
|
|
"""获取对话框中用于 'update_one' 的数据 (不含ID)"""
|
|
return {
|
|
"NAME": self.lne_name.text(),
|
|
"SAFE": self.safe_combo.currentData(),
|
|
"NOTES": self.notes_edit.toPlainText()
|
|
}
|