326 lines
11 KiB
C++
326 lines
11 KiB
C++
#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);
|
||
}
|
||
}
|
||
}
|