DiagramDesigner/diagramCavas/source/dataSourceDlg.cpp

326 lines
11 KiB
C++
Raw Normal View History

2026-01-30 18:36:55 +08:00
#include "dataSourceDlg.h"
#include "ui_dataSourceDlg.h"
#include <QStandardItemModel>
#include "structDataSource.h"
#include "instance/extraPropertyManager.h"
#include "global.h"
DataSourceDlg::DataSourceDlg(QWidget *parent)
: QDialog(parent)
, ui(new Ui::dataSourceDlg)
,_treeModel(nullptr)
,m_currentCategoryItem(nullptr)
,_pExtraProManager(nullptr)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | windowFlags());
initial();
}
DataSourceDlg::~DataSourceDlg()
{
delete ui;
}
void DataSourceDlg::initial()
{
connect(ui->btn_ok,&QPushButton::clicked,this,&DataSourceDlg::onOkClicked);
connect(ui->btn_cancel,&QPushButton::clicked,this,&DataSourceDlg::onCancelClicked);
m_dataSource = new StructDataSource(this);
_treeModel = new QStandardItemModel(this);
_treeModel->setHorizontalHeaderLabels(QStringList() << "属性层级结构");
ui->treeView->setModel(_treeModel);
}
void DataSourceDlg::loadData()
{
if(_pExtraProManager)
m_dataSource->loadExtrapro(_pExtraProManager->geAlltProperty());
}
void DataSourceDlg::showDlg()
{
if(_pExtraProManager)
{
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->treeView->expandAll();
}
}
void DataSourceDlg::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"}
};
}
void DataSourceDlg::onOkClicked()
{
hide();
}
void DataSourceDlg::onCancelClicked()
{
hide();
}
void DataSourceDlg::onTreeSelectionChanged(const QModelIndex& current, const QModelIndex& previous) {
Q_UNUSED(previous);
if (!current.isValid()) {
clearPropertyList();
return;
}
QStandardItem* item = _treeModel->itemFromIndex(current);
if (!item) {
clearPropertyList();
return;
}
QVariantMap itemData = item->data(Qt::UserRole + 1).toMap();
QString levelType = itemData.value("levelType", "").toString();
if (levelType == "category") {
// 点击分类节点从category节点获取属性
loadCategoryProperties(item);
}else{
clearPropertyList();
}
}
void DataSourceDlg::clearPropertyList()
{
ui->listWidget->clear();
m_currentCategoryItem = nullptr;
}
void DataSourceDlg::loadCategoryProperties(QStandardItem* categoryItem) {
m_currentCategoryItem = categoryItem;
// 从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()) {
clearItems();
return;
}
updatePropertyList(properties);
}
QVector<ExtraProperty> DataSourceDlg::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 DataSourceDlg::updatePropertyList(QVector<ExtraProperty> vec)
{
for(auto& pro:vec){
QListWidgetItem* pItem = new QListWidgetItem(pro.code);
pItem->setData(Qt::UserRole,pro.connect_para);
ui->listWidget->addItem(pItem);
}
}
bool DataSourceDlg::expandToPropertyByCode(const QString& propertyCode,
const QString& displayMode) {
// 在树中搜索对应编码的节点
QStandardItemModel* model = qobject_cast<QStandardItemModel*>(ui->treeView->model());
if (!model) {
return false;
}
QModelIndexList matches = model->match(
model->index(0, 0),
Qt::UserRole + 1, // 搜索用户数据
QVariant(), // 任意值
-1, // 搜索所有
Qt::MatchRecursive | Qt::MatchContains
);
for (const QModelIndex& index : matches) {
QStandardItem* item = model->itemFromIndex(index);
if (item) {
QVariantMap itemData = item->data(Qt::UserRole + 1).toMap();
// 检查是否是属性节点
if (itemData.contains("property")) {
ExtraProperty property = itemData["property"].value<ExtraProperty>();
if (property.code == propertyCode) {
// 构建从根节点到该节点的路径
QStringList nodeNames;
QModelIndex currentIndex = index;
while (currentIndex.isValid()) {
QStandardItem* currentItem = model->itemFromIndex(currentIndex);
if (currentItem) {
nodeNames.prepend(currentItem->text());
}
currentIndex = currentIndex.parent();
}
// 去掉根节点
if (!nodeNames.isEmpty()) {
nodeNames.removeFirst();
}
// 展开到该节点
QStandardItem* rootItem = model->invisibleRootItem();
return expandToNodeByNames(rootItem, nodeNames);
}
}
}
}
return false;
}
bool DataSourceDlg::expandToNodeByNames(QStandardItem* rootItem,
const QStringList& nodeNames) {
if (!rootItem || nodeNames.isEmpty()) {
return false;
}
QStandardItem* currentItem = rootItem;
QTreeView* treeView = ui->treeView;
for (int i = 0; i < nodeNames.size(); ++i) {
const QString& targetName = nodeNames[i];
bool found = false;
// 在当前节点的子节点中查找
for (int row = 0; row < currentItem->rowCount(); ++row) {
QStandardItem* childItem = currentItem->child(row, 0);
if (childItem && childItem->text() == targetName) {
// 展开当前节点
QModelIndex currentIndex = currentItem->index();
treeView->expand(currentIndex);
// 如果是最后一层,选中该节点
if (i == nodeNames.size() - 1) {
QModelIndex childIndex = childItem->index();
treeView->scrollTo(childIndex);
treeView->selectionModel()->select(
childIndex,
QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows
);
return true;
}
// 继续查找下一层
currentItem = childItem;
found = true;
break;
}
}
if (!found) {
// 没有找到对应的节点
qWarning() << "Node not found at level" << i << ":" << targetName;
// 展开到已找到的层级
if (currentItem != rootItem) {
QModelIndex currentIndex = currentItem->index();
treeView->expand(currentIndex);
treeView->scrollTo(currentIndex);
}
return false;
}
}
return true;
}
void DataSourceDlg::clearItems()
{
if(_treeModel){
QStandardItem *root = _treeModel->invisibleRootItem(); //先清空model
int rowCount = root->rowCount();
if (rowCount > 0) {
_treeModel->removeRows(0, rowCount);
}
}
}