SIT/ui/widgets/message_tree_widget.py

243 lines
8.4 KiB
Python
Raw Permalink Normal View History

2026-01-29 09:08:31 +00:00
"""
消息树形控件
用于显示和管理消息
"""
from PyQt5.QtWidgets import (
QWidget, QVBoxLayout, QHBoxLayout, QTreeWidget, QTreeWidgetItem,
QPushButton, QLineEdit, QLabel, QMessageBox, QSplitter,
QGroupBox, QFormLayout, QTextEdit, QListWidget, QComboBox
)
from PyQt5.QtCore import Qt, pyqtSignal
from controllers.message_controller import MessageController
from models.message import Message
from utils.logger import get_logger
logger = get_logger(__name__)
class MessageManagementWidget(QWidget):
"""消息管理控件"""
message_selected = pyqtSignal(Message)
def __init__(self, controller: MessageController):
super().__init__()
self.controller = controller
self.current_message = None
self.init_ui()
self.load_messages()
def init_ui(self):
"""初始化UI"""
main_layout = QHBoxLayout(self)
# 创建分割器
splitter = QSplitter(Qt.Horizontal)
main_layout.addWidget(splitter)
# 左侧:树形结构
left_widget = QWidget()
left_layout = QVBoxLayout(left_widget)
# 搜索区域
search_layout = QHBoxLayout()
self.search_input = QLineEdit()
self.search_input.setPlaceholderText("搜索消息...")
self.search_btn = QPushButton("搜索")
self.search_btn.clicked.connect(self.on_search)
search_layout.addWidget(self.search_input)
search_layout.addWidget(self.search_btn)
left_layout.addLayout(search_layout)
# 消息树
self.message_tree = QTreeWidget()
self.message_tree.setHeaderLabels(["名称", "系统", "类型", "版本"])
self.message_tree.setColumnWidth(0, 200)
self.message_tree.itemClicked.connect(self.on_message_clicked)
left_layout.addWidget(self.message_tree)
# 操作按钮
btn_layout = QHBoxLayout()
self.add_btn = QPushButton("新建")
self.add_btn.clicked.connect(self.on_add_message)
self.edit_btn = QPushButton("编辑")
self.edit_btn.clicked.connect(self.on_edit_message)
self.delete_btn = QPushButton("删除")
self.delete_btn.clicked.connect(self.on_delete_message)
self.refresh_btn = QPushButton("刷新")
self.refresh_btn.clicked.connect(self.load_messages)
btn_layout.addWidget(self.add_btn)
btn_layout.addWidget(self.edit_btn)
btn_layout.addWidget(self.delete_btn)
btn_layout.addWidget(self.refresh_btn)
btn_layout.addStretch()
left_layout.addLayout(btn_layout)
# 右侧:消息详情
right_widget = QWidget()
right_layout = QVBoxLayout(right_widget)
detail_group = QGroupBox("消息详情")
detail_layout = QVBoxLayout(detail_group)
# 基本信息
info_layout = QFormLayout()
self.full_name_label = QLabel("-")
self.system_name_label = QLabel("-")
self.message_type_label = QLabel("-")
self.version_label = QLabel("-")
self.protocol_label = QLabel("-")
self.serialization_label = QLabel("-")
info_layout.addRow("完整名称:", self.full_name_label)
info_layout.addRow("系统名:", self.system_name_label)
info_layout.addRow("消息类型:", self.message_type_label)
info_layout.addRow("版本:", self.version_label)
info_layout.addRow("协议:", self.protocol_label)
info_layout.addRow("序列化:", self.serialization_label)
detail_layout.addLayout(info_layout)
# 描述
desc_label = QLabel("描述:")
detail_layout.addWidget(desc_label)
self.description_text = QTextEdit()
self.description_text.setReadOnly(True)
self.description_text.setMaximumHeight(80)
detail_layout.addWidget(self.description_text)
# 字段列表
fields_label = QLabel("包含字段:")
detail_layout.addWidget(fields_label)
self.fields_list = QListWidget()
detail_layout.addWidget(self.fields_list)
right_layout.addWidget(detail_group)
# 添加到分割器
splitter.addWidget(left_widget)
splitter.addWidget(right_widget)
splitter.setStretchFactor(0, 1)
splitter.setStretchFactor(1, 1)
def load_messages(self):
"""加载消息列表"""
self.message_tree.clear()
messages, total = self.controller.get_all_messages(page=1, page_size=1000)
# 按系统分组
system_items = {}
for message in messages:
# 获取或创建系统节点
if message.system_name not in system_items:
system_item = QTreeWidgetItem(self.message_tree)
system_item.setText(0, message.system_name)
system_item.setData(0, Qt.UserRole, None)
system_items[message.system_name] = system_item
# 创建消息节点
message_item = QTreeWidgetItem(system_items[message.system_name])
message_item.setText(0, message.full_name)
message_item.setText(1, message.system_name)
message_item.setText(2, message.message_type)
message_item.setText(3, message.version)
message_item.setData(0, Qt.UserRole, message)
self.message_tree.expandAll()
logger.info(f"Loaded {total} messages")
def on_message_clicked(self, item: QTreeWidgetItem, column: int):
"""消息被点击"""
message = item.data(0, Qt.UserRole)
if message:
self.current_message = message
self.display_message_details(message)
self.message_selected.emit(message)
def display_message_details(self, message: Message):
"""显示消息详情"""
self.full_name_label.setText(message.full_name)
self.system_name_label.setText(message.system_name)
self.message_type_label.setText(message.message_type)
self.version_label.setText(message.version)
self.protocol_label.setText(message.protocol.value)
self.serialization_label.setText(message.serialization.value)
self.description_text.setText(message.description or "")
# 显示字段列表
self.fields_list.clear()
for field in message.fields:
self.fields_list.addItem(f"{field.full_name} ({field.type.value})")
def on_add_message(self):
"""新建消息"""
from ui.dialogs.message_dialog import MessageDialog
dialog = MessageDialog(self)
if dialog.exec_():
self.load_messages()
def on_edit_message(self):
"""编辑消息"""
if not self.current_message:
QMessageBox.warning(self, "警告", "请先选择要编辑的消息")
return
from ui.dialogs.message_dialog import MessageDialog
dialog = MessageDialog(self, self.current_message)
if dialog.exec_():
self.load_messages()
def on_delete_message(self):
"""删除消息"""
if not self.current_message:
QMessageBox.warning(self, "警告", "请先选择要删除的消息")
return
reply = QMessageBox.question(
self,
"确认删除",
f"确定要删除消息 '{self.current_message.full_name}' 吗?",
QMessageBox.Yes | QMessageBox.No
)
if reply == QMessageBox.Yes:
success, msg = self.controller.delete_message(self.current_message.id)
if success:
QMessageBox.information(self, "成功", msg)
self.load_messages()
else:
QMessageBox.warning(self, "失败", msg)
def on_search(self):
"""搜索消息"""
search_text = self.search_input.text().strip()
if not search_text:
self.load_messages()
return
search_params = {
'system_name': search_text,
'page': 1,
'page_size': 1000
}
messages, total = self.controller.search_messages(search_params)
# 更新树形显示
self.message_tree.clear()
for message in messages:
message_item = QTreeWidgetItem(self.message_tree)
message_item.setText(0, message.full_name)
message_item.setText(1, message.system_name)
message_item.setText(2, message.message_type)
message_item.setText(3, message.version)
message_item.setData(0, Qt.UserRole, message)