DiagramDesigner/diagramCavas/source/structDataPreviewDlg.cpp

922 lines
31 KiB
C++
Raw Normal View History

2025-12-31 17:15:55 +08:00
#include "structDataPreviewDlg.h"
#include "ui_structDataPreviewDlg.h"
#include <QStandardItemModel>
#include <QMenuBar>
2026-01-09 17:43:58 +08:00
#include <QMessageBox>
#include <QStatusBar>
#include <QCompleter>
#include <QStringListModel>
2025-12-31 17:15:55 +08:00
#include "titleBar.h"
#include "instance/extraPropertyManager.h"
2026-01-09 17:43:58 +08:00
#include "structDataSource.h"
#include "structDataMeasurementModel.h"
#include "structDataPropertyModel.h"
#include "structDataPropertyDelegate.h"
#include "structDataMeasurementDelegate.h"
#include "dataBase.h"
#include "global.h"
2025-12-31 17:15:55 +08:00
StructDataPreviewDlg::StructDataPreviewDlg(QWidget *parent)
: QDialog(parent)
, ui(new Ui::structDataPreviewDlg)
,_pExtraProManager(nullptr)
2026-01-09 17:43:58 +08:00
,_treeModel(nullptr)
,m_currentCategoryItem(nullptr)
,m_measurementTableModel(nullptr)
,m_propertyTableModel(nullptr)
,m_propertyDelegate(nullptr)
,m_measurementDelegate(nullptr)
,m_statusBar(nullptr)
2025-12-31 17:15:55 +08:00
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
2026-01-09 17:43:58 +08:00
m_statusBar = new QStatusBar(this);
ui->mainLayout->addWidget(m_statusBar);
2026-01-16 18:40:46 +08:00
m_statusBar->setMaximumHeight(24);
2025-12-31 17:15:55 +08:00
initial();
}
StructDataPreviewDlg::~StructDataPreviewDlg()
{
delete ui;
}
2026-01-09 17:43:58 +08:00
void StructDataPreviewDlg::loadData()
{
if(_pExtraProManager)
m_dataSource->loadExtrapro(_pExtraProManager->geAlltProperty());
m_dataSource->loadMeasurementData(DataBase::GetInstance()->getAllMeasurements());
m_dataSource->loadPropertyData(DataManager::instance().modelData());
2026-01-16 18:40:46 +08:00
addLog(QString("载入属性:%1").arg(m_dataSource->getAllProperties().size()));
2026-01-09 17:43:58 +08:00
}
2025-12-31 17:15:55 +08:00
void StructDataPreviewDlg::initial()
{
// 创建标题栏
m_titleBar = new TitleBar(this);
m_titleBar->setTitle("结构数据展示");
ui->mainLayout->insertWidget(0,m_titleBar);
QMenuBar *menuBar = new QMenuBar(this);
QMenu *fileMenu = menuBar->addMenu("文件");
QAction *saveAction = fileMenu->addAction("保存");
menuBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
menuBar->setFixedHeight(33);
QString style = R"(
QMenuBar {
background: #f1f5f9;
border-bottom: 1px solid #cbd5e1;
color: #334155;
font-weight: 500;
padding: 2px 0;
}
QMenuBar::item {
padding: 6px 12px;
border-radius: 3px;
margin: 0 1px;
}
QMenuBar::item:hover {
background: #e2e8f0;
border: 1px solid #cbd5e1;
}
QMenuBar::item:pressed {
background: #cbd5e0;
}
QMenu {
background: #ffffff;
border: 1px solid #cbd5e1;
border-radius: 4px;
color: #475569;
padding: 4px 0;
}
QMenu::item {
padding: 2px 20px 2px 6px;
margin: 1px 2px;
min-height: 20px;
}
QMenu::item:selected {
background: #3b82f6;
color: white;
border-radius: 2px;
}
QMenu::separator {
height: 1px;
background: #e2e8f0;
margin: 3px 8px;
}
)";
setStyleSheet(style);
ui->mainLayout->insertWidget(1,menuBar);
ui->mainLayout->setStretchFactor(menuBar, 0);
ui->splitter_2->setStretchFactor(0,1);
ui->splitter_2->setStretchFactor(1,4);
ui->splitter->setStretchFactor(0,5);
ui->splitter->setStretchFactor(1,1);
connect(saveAction,&QAction::triggered,this,&StructDataPreviewDlg::onSaveClicked);
connect(m_titleBar, &TitleBar::maximizeClicked, this, &StructDataPreviewDlg::toggleMaximize);
connect(m_titleBar, &TitleBar::closeClicked, this, &StructDataPreviewDlg::onExitClicked);
2026-01-09 17:43:58 +08:00
_treeModel = new QStandardItemModel(this);
_treeModel->setHorizontalHeaderLabels(QStringList() << "属性层级结构");
ui->tree_level->setModel(_treeModel);
connect(ui->btn_gird,&QPushButton::clicked,this,[=](){
onLevelButtonClicked(0);
});
connect(ui->btn_zone,&QPushButton::clicked,this,[=](){
onLevelButtonClicked(1);
});
connect(ui->btn_station,&QPushButton::clicked,this,[=](){
onLevelButtonClicked(2);
});
connect(ui->btn_level,&QPushButton::clicked,this,[=](){
onLevelButtonClicked(3);
});
connect(ui->btn_bay,&QPushButton::clicked,this,[=](){
onLevelButtonClicked(4);
});
connect(ui->btn_device,&QPushButton::clicked,this,[=](){
onLevelButtonClicked(5);
});
connect(ui->btn_group,&QPushButton::clicked,this,[=](){
onLevelButtonClicked(6);
});
m_dataSource = new StructDataSource(this);
connect(ui->tree_level->selectionModel(), &QItemSelectionModel::currentChanged,
this, &StructDataPreviewDlg::onTreeSelectionChanged);
// 连接数据更新信号
//connect(m_dataSource, &StructDataSource::propertyUpdated,this, &StructDataPreviewDlg::onPropertyUpdated);
m_propertyDelegate = new StructDataPropertyDelegate(this);
m_measurementDelegate = new StructDataMeasurementDelegate(this);
_recommandCompleter = new QCompleter(this);
_recommandCompleter->setCaseSensitivity(Qt::CaseInsensitive);
_recommandCompleter->setFilterMode(Qt::MatchContains);
_recommandCompleter->setCompletionMode(QCompleter::PopupCompletion);
_strLstModel = new QStringListModel(this);
_recommandCompleter->setModel(_strLstModel);
m_propertyDelegate->setConnectParaCompleter(_recommandCompleter);
m_measurementDelegate->setConnectParaCompleter(_recommandCompleter);
2025-12-31 17:15:55 +08:00
}
void StructDataPreviewDlg::clearItems()
{
if(_treeModel){
QStandardItem *root = _treeModel->invisibleRootItem(); //先清空model
int rowCount = root->rowCount();
if (rowCount > 0) {
_treeModel->removeRows(0, rowCount);
}
}
}
2026-01-09 17:43:58 +08:00
QString StructDataPreviewDlg::getLevelType(int index) {
switch (index) {
case 0: return "电网";
case 1: return "区域";
case 2: return "站点";
case 3: return "电压等级";
case 4: return "间隔";
case 5: return "设备";
case 6: return "分组";
default: return "未知层级";
}
2025-12-31 17:15:55 +08:00
}
2026-01-09 17:43:58 +08:00
void StructDataPreviewDlg::expandToLevel(QTreeView* treeView, int targetLevel)
2025-12-31 17:15:55 +08:00
{
2026-01-09 17:43:58 +08:00
if (!treeView || !treeView->model()) {
return;
}
QAbstractItemModel* model = treeView->model();
2025-12-31 17:15:55 +08:00
2026-01-09 17:43:58 +08:00
// 先收缩所有
treeView->collapseAll();
// 递归展开到指定层级
expandToLevelRecursive(treeView, model, QModelIndex(), 0, targetLevel);
2025-12-31 17:15:55 +08:00
}
2026-01-09 17:43:58 +08:00
void StructDataPreviewDlg::expandToLevelRecursive(QTreeView* treeView,
QAbstractItemModel* model,
const QModelIndex& parent,
int currentDepth,
int targetLevel)
2025-12-31 17:15:55 +08:00
{
2026-01-09 17:43:58 +08:00
if (!model || !treeView) {
return;
}
int rowCount = model->rowCount(parent);
2025-12-31 17:15:55 +08:00
2026-01-09 17:43:58 +08:00
for (int row = 0; row < rowCount; ++row) {
QModelIndex index = model->index(row, 0, parent);
// 获取节点的实际层级
int nodeLevel = getNodeLevel(model, index);
if (nodeLevel <= targetLevel) {
// 展开当前节点
treeView->expand(index);
} else {
// 收缩当前节点
treeView->collapse(index);
}
// 递归处理子节点
if (model->hasChildren(index)) {
expandToLevelRecursive(treeView, model, index, currentDepth + 1, targetLevel);
}
}
2025-12-31 17:15:55 +08:00
}
2026-01-09 17:43:58 +08:00
int StructDataPreviewDlg::getNodeLevel(QAbstractItemModel* model, const QModelIndex& index)
2025-12-31 17:15:55 +08:00
{
2026-01-09 17:43:58 +08:00
if (!model || !index.isValid()) {
return -1;
}
// 从UserRole+1中获取层级信息
QVariant data = model->data(index, Qt::UserRole + 1);
if (data.isValid()) {
QVariantMap nodeData = data.toMap();
2025-12-31 17:15:55 +08:00
2026-01-09 17:43:58 +08:00
// 先检查是否是属性节点
if (nodeData.contains("property")) {
return 7;
}
// 检查层级索引
if (nodeData.contains("levelIndex")) {
int levelIndex = nodeData["levelIndex"].toInt();
return qMin(levelIndex, 7);
}
}
// 如果没有存储层级信息,通过深度判断
return getDepthFromRoot(model, index);
2025-12-31 17:15:55 +08:00
}
2026-01-09 17:43:58 +08:00
QStandardItem* StructDataPreviewDlg::processGroupLevel(QStandardItem* componentItem,
const ExtraProperty& property) {
QString groupDisplayText = (property.group_name.isEmpty() ?
property.group_tag : property.group_name);
if (groupDisplayText.isEmpty()) {
groupDisplayText = "未命名分组";
}
// 查找group节点
for (int row = 0; row < componentItem->rowCount(); ++row) {
QStandardItem* child = componentItem->child(row, 0);
if (child) {
QVariantMap childData = child->data(Qt::UserRole + 1).toMap();
QString levelType = childData.value("levelType").toString();
if (levelType == "group") {
// 检查是否是同一个group
QString existingGroupTag = childData.value("groupTag", "").toString();
QString existingModelName = childData.value("modelName", "").toString();
QString propertyModelName = property.sourceConfig.value("modelName").toString();
if (existingGroupTag == property.group_tag) {
if (property.sourceType == "property") {
// 对于property类型还需要检查modelName
if (existingModelName == propertyModelName) {
return child;
}
} else {
// 对于measurement类型只需要groupTag匹配
return child;
}
}
}
}
}
2025-12-31 17:15:55 +08:00
2026-01-09 17:43:58 +08:00
// 创建新的group节点
QStandardItem* groupItem = new QStandardItem(groupDisplayText);
QVariantMap groupData;
groupData["levelIndex"] = 6; // 第7层
groupData["levelType"] = "group";
groupData["groupName"] = property.group_name;
groupData["groupTag"] = property.group_tag;
groupData["sourceType"] = property.sourceType;
if (property.sourceType == "property") {
groupData["modelName"] = property.sourceConfig.value("modelName");
}
groupData["properties"] = QVariant::fromValue(QVector<ExtraProperty>());
groupItem->setData(groupData, Qt::UserRole + 1);
// 设置工具提示
QString tooltip = QString("分组: %1\n类型: %2")
.arg(groupDisplayText)
.arg(property.sourceType == "property" ? "属性" : "量测");
groupItem->setToolTip(tooltip);
componentItem->appendRow(groupItem);
return groupItem;
2025-12-31 17:15:55 +08:00
}
2026-01-09 17:43:58 +08:00
// 处理category层级
void StructDataPreviewDlg::processCategoryLevel(QStandardItem* groupItem,
const ExtraProperty& property) {
QString categoryName = property.type_name;
QString paraType = property.type_tag;
if (categoryName.isEmpty() || paraType.isEmpty()) {
qWarning() << "Invalid category or paraType for property:" << property.code;
return;
}
// 查找category节点
for (int row = 0; row < groupItem->rowCount(); ++row) {
QStandardItem* child = groupItem->child(row, 0);
if (child) {
QVariantMap childData = child->data(Qt::UserRole + 1).toMap();
QString levelType = childData.value("levelType").toString();
QString childParaType = childData.value("paraType", "").toString();
if (levelType == "category" && childParaType == paraType) {
// 找到对应的category节点更新属性列表
updateCategoryProperties(child, property);
return;
}
}
}
// 创建新的category节点
QStandardItem* categoryItem = new QStandardItem(categoryName);
QVariantMap categoryData;
categoryData["levelType"] = "category";
categoryData["paraType"] = paraType;
categoryData["sourceType"] = property.sourceType;
categoryData["groupTag"] = property.group_tag;
categoryData["groupName"] = property.group_name;
if (property.sourceType == "property") {
categoryData["modelName"] = property.sourceConfig.value("modelName");
}
// 初始化属性列表
QVector<ExtraProperty> properties;
properties.append(property);
categoryData["properties"] = QVariant::fromValue(properties);
categoryData["propertyCount"] = 1;
categoryItem->setData(categoryData, Qt::UserRole + 1);
// 设置显示文本(包含数量)
categoryItem->setText(QString("%1 (1)").arg(categoryName));
// 设置工具提示
QString tooltip = QString("分类: %1\n参量类型: %2\n属性数量: 1")
.arg(categoryName)
.arg(categoryName);
categoryItem->setToolTip(tooltip);
groupItem->appendRow(categoryItem);
}
// 更新category节点的属性列表
void StructDataPreviewDlg::updateCategoryProperties(QStandardItem* categoryItem,
const ExtraProperty& property) {
QVariantMap categoryData = categoryItem->data(Qt::UserRole + 1).toMap();
QVector<ExtraProperty> properties = categoryData["properties"].value<QVector<ExtraProperty>>();
// 检查属性是否已存在
bool exists = false;
for (const auto& prop : properties) {
if (prop.code == property.code) {
exists = true;
break;
}
}
if (!exists) {
properties.append(property);
categoryData["properties"] = QVariant::fromValue(properties);
int newCount = properties.size();
categoryData["propertyCount"] = newCount;
// 更新显示文本
QString baseName = property.type_name;
categoryItem->setText(QString("%1 (%2)").arg(baseName).arg(newCount));
// 更新工具提示
QString tooltip = QString("属性数量: %1")
.arg(newCount);
categoryItem->setToolTip(tooltip);
categoryItem->setData(categoryData, Qt::UserRole + 1);
}
}
void StructDataPreviewDlg::loadCategoryProperties(QStandardItem* categoryItem) {
m_currentCategoryItem = categoryItem;
// 保存当前修改
saveCurrentIfModified();
// 从category节点获取属性列表
QVariantMap categoryData = categoryItem->data(Qt::UserRole + 1).toMap();
QVector<ExtraProperty> properties = categoryData["properties"].value<QVector<ExtraProperty>>();
if (properties.isEmpty()) {
// 如果没有属性从DataManager重新获取
properties = getCategoryPropertiesFromDataManager(categoryData);
}
if (properties.isEmpty()) {
clearTableView();
QString categoryName = categoryItem->text();
ui->tableTitle->setText(QString("分类: %1").arg(categoryName));
return;
}
// 重置修改状态
m_currentModified = false;
//updateWindowTitle();
// 获取group和category信息
QString categoryName = categoryItem->text();
QString groupName = categoryItem->parent() ? categoryItem->parent()->text() : "";
QString sourceType = categoryData.value("sourceType").toString();
// 根据sourceType显示表格
if (sourceType == "property") {
setupPropertyTable(properties, categoryName, groupName);
} else if (sourceType == "measurement") {
setupMeasurementTable(properties, categoryName, groupName);
}
ui->tableView->setVisible(true);
}
QVector<ExtraProperty> StructDataPreviewDlg::getCategoryPropertiesFromDataManager(const QVariantMap& categoryData) {
QString groupTag = categoryData.value("groupTag").toString();
QString modelName = categoryData.value("modelName").toString();
QString paraType = categoryData.value("paraType").toString();
QString sourceType = categoryData.value("sourceType").toString();
QString componentUuid = categoryData.value("component_uuid").toString();
QVector<ExtraProperty> result;
for (auto it = m_dataSource->allProperties.begin();
it != m_dataSource->allProperties.end(); ++it) {
const ExtraProperty& prop = it.value();
bool match = (prop.group_tag == groupTag) &&
(prop.sourceType == sourceType) &&
(prop.type_tag == paraType) &&
(prop.component_uuid.toString() == componentUuid);
if (sourceType == "property") {
match = match && (prop.sourceConfig.value("modelName").toString() == modelName);
}
if (match) {
result.append(prop);
}
}
return result;
}
void StructDataPreviewDlg::setupPropertyTable(const QVector<ExtraProperty>& properties,
const QString& categoryName,
const QString& groupName) {
if (!m_propertyTableModel) {
m_propertyTableModel = new StructDataPropertyModel(m_dataSource, this);
connect(m_propertyTableModel, &StructDataPropertyModel::propertyModified,
this, &StructDataPreviewDlg::onPropertyModified);
}
m_propertyTableModel->setProperties(properties);
ui->tableView->setModel(m_propertyTableModel);
// 使用Property代理
ui->tableView->setItemDelegate(m_propertyDelegate);
setupPropertyColumns();
updateTableTitle("属性", categoryName, groupName, properties.size());
}
void StructDataPreviewDlg::setupMeasurementTable(const QVector<ExtraProperty>& properties,
const QString& categoryName,
const QString& groupName) {
if (!m_measurementTableModel) {
m_measurementTableModel = new StructDataMeasurementModel(m_dataSource, this);
connect(m_measurementTableModel, &StructDataMeasurementModel::propertyModified,
this, &StructDataPreviewDlg::onPropertyModified);
}
m_measurementTableModel->setProperties(properties);
ui->tableView->setModel(m_measurementTableModel);
if (!m_measurementDelegate) {
m_measurementDelegate = new StructDataMeasurementDelegate(this);
}
ui->tableView->setItemDelegate(m_measurementDelegate);
setupMeasurementColumns();
// 去除数量显示
QString cleanCategoryName = categoryName;
int bracketPos = cleanCategoryName.indexOf(" (");
if (bracketPos != -1) {
cleanCategoryName = cleanCategoryName.left(bracketPos);
}
ui->tableTitle->setText(QString("分组: %1 - 分类: %2").arg(groupName).arg(cleanCategoryName));
}
void StructDataPreviewDlg::updateCategoryAfterPropertyModified(QStandardItem* categoryItem, const ExtraProperty& updatedProp) {
QVariantMap categoryData = categoryItem->data(Qt::UserRole + 1).toMap();
QVector<ExtraProperty> properties = categoryData["properties"].value<QVector<ExtraProperty>>();
// 更新属性列表
bool found = false;
for (auto& prop : properties) {
if (prop.code == updatedProp.code) {
prop = updatedProp;
found = true;
break;
}
}
if (found) {
categoryData["properties"] = QVariant::fromValue(properties);
categoryItem->setData(categoryData, Qt::UserRole + 1);
}
}
void StructDataPreviewDlg::saveCurrentIfModified()
2025-12-31 17:15:55 +08:00
{
2026-01-09 17:43:58 +08:00
if (m_currentModified && m_currentCategoryItem) {
int result = QMessageBox::question(this, "切换分类",
"当前分类有未保存的修改,是否保存?",
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
if (result == QMessageBox::Save) {
saveAll();
} else if (result == QMessageBox::Cancel) {
ui->tree_level->selectionModel()->select(ui->tree_level->selectionModel()->currentIndex(),
QItemSelectionModel::Select);
}
}
}
2025-12-31 17:15:55 +08:00
2026-01-09 17:43:58 +08:00
void StructDataPreviewDlg::saveAll() {
m_dataSource->saveAll();
m_currentModified = false;
m_statusBar->showMessage("保存成功", 2000);
2025-12-31 17:15:55 +08:00
}
2026-01-09 17:43:58 +08:00
void StructDataPreviewDlg::clearTableView() {
ui->tableTitle->setText("未选择分类");
ui->tableView->setModel(nullptr);
ui->tableView->setVisible(false);
m_currentCategoryItem = nullptr;
}
void StructDataPreviewDlg::setupPropertyColumns() {
ui->tableView->setColumnWidth(StructDataPropertyModel::ColName, 120);
ui->tableView->setColumnWidth(StructDataPropertyModel::ColTag, 100);
ui->tableView->setColumnWidth(StructDataPropertyModel::ColCode, 200);
ui->tableView->setColumnWidth(StructDataPropertyModel::ColSourceType, 60);
ui->tableView->setColumnWidth(StructDataPropertyModel::ColConnectPara, 400);
ui->tableView->setColumnWidth(StructDataPropertyModel::ColModelName, 100);
ui->tableView->setColumnWidth(StructDataPropertyModel::ColDataType, 80);
ui->tableView->setColumnWidth(StructDataPropertyModel::ColDefaultValue, 100);
ui->tableView->setColumnWidth(StructDataPropertyModel::ColLengthPrecision, 80);
}
void StructDataPreviewDlg::setupMeasurementColumns() {
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColName, 120);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColTag, 100);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColCode, 200);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColSourceType, 60);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColConnectPara, 400);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColEquipment, 100);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColChannel, 60);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColType, 60);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColSize, 60);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColSource, 60);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColStation, 80);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColPacket, 50);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColOffset, 60);
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColEnable, 50);
2026-01-16 18:40:46 +08:00
ui->tableView->setColumnWidth(StructDataMeasurementModel::ColCause, 120);
2026-01-09 17:43:58 +08:00
}
void StructDataPreviewDlg::updateTableTitle(const QString& dataType, const QString& categoryName,
const QString& groupName, int count) {
ui->tableTitle->setText(QString("%1分组: %2 - %3").arg(dataType).arg(groupName).arg(categoryName));
}
int StructDataPreviewDlg::getDepthFromRoot(QAbstractItemModel* model, const QModelIndex& index) {
int depth = 0;
QModelIndex parent = index.parent();
while (parent.isValid()) {
depth++;
parent = parent.parent();
}
return depth;
}
void StructDataPreviewDlg::onExitClicked()
{
hide();
}
void StructDataPreviewDlg::onSaveClicked()
2025-12-31 17:15:55 +08:00
{
}
2026-01-09 17:43:58 +08:00
void StructDataPreviewDlg::onLevelButtonClicked(int nLevel)
2025-12-31 17:15:55 +08:00
{
2026-01-09 17:43:58 +08:00
// 展开到指定层级
expandToLevel(ui->tree_level,nLevel);
}
void StructDataPreviewDlg::onTreeSelectionChanged(const QModelIndex& current, const QModelIndex& previous) {
Q_UNUSED(previous);
if (!current.isValid()) {
clearTableView();
return;
}
QStandardItem* item = _treeModel->itemFromIndex(current);
if (!item) {
clearTableView();
return;
}
2025-12-31 17:15:55 +08:00
2026-01-09 17:43:58 +08:00
QVariantMap itemData = item->data(Qt::UserRole + 1).toMap();
QString levelType = itemData.value("levelType", "").toString();
if (levelType == "category") {
// 点击分类节点从category节点获取属性
loadCategoryProperties(item);
}else{
clearTableView();
}
}
void StructDataPreviewDlg::onPropertyModified(int row, const ExtraProperty& prop) {
m_currentModified = true;
//updateWindowTitle();
// 更新树中category的属性数量
if (m_currentCategoryItem) {
updateCategoryAfterPropertyModified(m_currentCategoryItem, prop);
}
m_statusBar->showMessage(QString("属性'%1'已修改").arg(prop.name), 2000);
2025-12-31 17:15:55 +08:00
}
void StructDataPreviewDlg::showEvent(QShowEvent *event)
{
QDialog::showEvent(event);
if (m_titleBar) {
m_titleBar->updateMaximizeButton();
}
}
void StructDataPreviewDlg::showMaximized()
{
if (!isMaximized()) {
m_normalGeometry = geometry(); // 保存当前位置和大小
}
QDialog::showMaximized();
}
void StructDataPreviewDlg::showNormal()
{
QDialog::showNormal();
}
void StructDataPreviewDlg::showDlg()
{
if(_pExtraProManager)
{
2026-01-09 17:43:58 +08:00
show();
clearItems();
auto& mapExtra = m_dataSource->allProperties;
QStandardItem* root = _treeModel->invisibleRootItem();
for(auto& pro:mapExtra){
QStandardItem* propertyItem = new QStandardItem();
addItemToView(pro,"name",root,propertyItem);
}
ui->tree_level->expandAll();
}
}
QVector<ExtraProperty> StructDataPreviewDlg::getGroupProperties(QStandardItem* groupItem) {
if (!groupItem) return QVector<ExtraProperty>();
QVariantMap data = groupItem->data(Qt::UserRole + 1).toMap();
if (data.contains("properties")) {
return data["properties"].value<QVector<ExtraProperty>>();
}
return QVector<ExtraProperty>();
}
// 获取group节点的sourceType
QString getGroupSourceType(QStandardItem* groupItem) {
if (!groupItem) return "";
QVariantMap data = groupItem->data(Qt::UserRole + 1).toMap();
return data.value("sourceType", "").toString();
}
void StructDataPreviewDlg::addItemToView(const ExtraProperty& property,
const QString& displayMode, // "name" 或 "tag"
QStandardItem* root,
QStandardItem* pItem)
{
// 设置叶子节点的显示文本使用name或tag
if (displayMode == "name") {
pItem->setText(property.name.isEmpty() ? "未命名属性" : property.name);
} else {
pItem->setText(property.tag.isEmpty() ? "unknown_property" : property.tag);
}
// 在叶子节点存储完整的属性信息
QVariantMap propertyData;
propertyData["property"] = QVariant::fromValue(property);
propertyData["displayMode"] = displayMode;
propertyData["code"] = property.code;
pItem->setData(propertyData, Qt::UserRole + 1);
QVector<ExtraPropertyLevelInfo> levels = {
{(displayMode == "name") ? property.grid_name : property.grid_tag,
property.grid_name, property.grid_tag, true,
(displayMode == "name") ? "未命名电网" : "unknown_grid"},
{(displayMode == "name") ? property.zone_name : property.zone_tag,
property.zone_name, property.zone_tag, true,
(displayMode == "name") ? "未命名区域" : "unknown_zone"},
{(displayMode == "name") ? property.station_name : property.station_tag,
property.station_name, property.station_tag, true,
(displayMode == "name") ? "未命名站点" : "unknown_station"},
{property.currentLevel,
property.currentLevel, property.currentLevel, false,
(displayMode == "name") ? "通用层级" : "common_level"},
{(displayMode == "name") ? property.bay_name : property.bay_tag,
property.bay_name, property.bay_tag, false,
(displayMode == "name") ? "间隔" : "bay"},
{property.component_name.isEmpty() ?
(displayMode == "name") ? "未命名设备" : property.component_uuid.toString() :
(displayMode == "name") ? property.component_name : property.component_uuid.toString(),
property.component_name, property.component_uuid.toString(), true,
(displayMode == "name") ? "未命名设备" : "unknown_component"}
};
QStandardItem* currentParent = root;
for (size_t i = 0; i < levels.size(); ++i) {
const auto& level = levels[i];
bool isRequired = level.isRequired;
bool isEmpty = (displayMode == "name") ?
(level.nameValue.isEmpty() && level.displayText.isEmpty()) :
(level.tagValue.isEmpty() && level.displayText.isEmpty());
if (!isRequired && isEmpty) {
continue;
}
// 确定显示文本
QString displayText = level.displayText;
bool isMissing = false;
if (displayText.isEmpty()) {
if (isRequired) {
displayText = level.placeholder;
isMissing = true;
} else {
// 可选层级为空,跳过
continue;
}
}
// 查找当前层级是否已存在
QStandardItem* foundChild = nullptr;
for (int row = 0; row < currentParent->rowCount(); ++row) {
QStandardItem* child = currentParent->child(row, 0);
if (child && child->text() == displayText) {
// 检查是否为同一层级
QVariantMap childData = child->data(Qt::UserRole + 1).toMap();
int childLevelIndex = childData["levelIndex"].toInt();
if (childLevelIndex == static_cast<int>(i)) {
foundChild = child;
break;
}
}
}
if (foundChild) {
currentParent = foundChild;
} else {
QStandardItem* newNode = new QStandardItem(displayText);
QVariantMap levelData;
levelData["levelIndex"] = static_cast<int>(i);
levelData["levelType"] = getLevelType(i);
newNode->setData(levelData, Qt::UserRole + 1);
currentParent->appendRow(newNode);
currentParent = newNode;
}
2025-12-31 17:15:55 +08:00
}
2026-01-09 17:43:58 +08:00
// 现在currentParent是component节点
// 处理group层级第7层
QStandardItem* groupItem = processGroupLevel(currentParent, property);
// 处理category层级在group下
processCategoryLevel(groupItem, property);
2025-12-31 17:15:55 +08:00
}
2026-01-09 17:43:58 +08:00
void StructDataPreviewDlg::updateRecommandLst(QStringList lst)
{
for(auto& newName:lst){
if(!newName.isEmpty()){
if(!_curRecommandLst.contains(newName)){
_curRecommandLst.append(newName);
}
}
}
_strLstModel->setStringList(_curRecommandLst);
if (_recommandCompleter->popup()->isVisible()) {
_recommandCompleter->popup()->hide();
}
_recommandCompleter->complete(); // 重新显示补全列表
}
2026-01-16 18:40:46 +08:00
void StructDataPreviewDlg::addLog(const QString &message)
{
QString time = QDateTime::currentDateTime().toString("hh:mm:ss");
ui->listWidget->addItem(QString("[%1] %2").arg(time).arg(message));
ui->listWidget->scrollToBottom();
}
2026-01-09 17:43:58 +08:00
2025-12-31 17:15:55 +08:00
void StructDataPreviewDlg::resizeEvent(QResizeEvent *event)
{
QDialog::resizeEvent(event);
if (m_titleBar) {
m_titleBar->updateMaximizeButton();
}
}
void StructDataPreviewDlg::toggleMaximize()
{
if (isMaximized()) {
showNormal();
} else {
showMaximized();
}
// 更新标题栏按钮
if (m_titleBar) {
m_titleBar->updateMaximizeButton();
}
}