""" 消息树形控件 用于显示和管理消息 """ 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)