#include #include #include #include "diagramView.h" #include "ui_diagramView.h" #include "tools.h" #include "topologyManager.h" #include "projectManager.h" #include "dataBase.h" DiagramView::DiagramView(QWidget *parent) : QDialog(parent) , ui(new Ui::diagramView) ,_pModel(nullptr) { ui->setupUi(this); _pModel = new QStandardItemModel(this); ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu); ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); _count = 0; } DiagramView::~DiagramView() { delete ui; } void DiagramView::initial() { connect(ui->treeView, &QTreeView::customContextMenuRequested, this, &DiagramView::onIndexRbtnClicked); connect(ui->treeWidget, &QTreeView::customContextMenuRequested, this, &DiagramView::onEditorRbtnClicked); connect(ui->treeView, &QTreeView::clicked, this, &DiagramView::onItemClicked); connect(_pModel, &QStandardItemModel::itemChanged, this, &DiagramView::onItemChanged); connect(ui->btn_new, &QPushButton::clicked, this, &DiagramView::onNewEditorClicked); connect(ui->btn_open, &QPushButton::clicked, this, &DiagramView::onOpenEditorClicked); connect(ui->btn_save, &QPushButton::clicked, this, &DiagramView::onSaveEditorClicked); connect(&ProjectManager::instance(),&ProjectManager::createNewEditor,this,&DiagramView::onNewEditorCreated); connect(&ProjectManager::instance(),&ProjectManager::editorSaved,this,&DiagramView::onEditorSaved); ui->treeView->setHeaderHidden(true); ui->treeWidget->setHeaderHidden(true); ui->treeWidget->setColumnCount(2); // 设置模型的列数 _pModel->setColumnCount(1); //QList pageList; QList lst = DataBase::GetInstance()->getAllPage(); for(auto info:lst) { QStandardItem* pItem = new QStandardItem(info.name); pItem->setData(info.id,Qt::UserRole); //pageList.append(pItem); _pModel->appendRow(pItem); } //_pModel->appendRow(pageList); // 创建树视图 ui->treeView->setModel(_pModel); // 展开所有节点 ui->treeView->expandAll(); // 显示树视图 ui->treeView->setWindowTitle(QObject::tr("组态图结构")); } void DiagramView::loadTopologyFromDB() { } void DiagramView::onIndexRbtnClicked(const QPoint &pos) { // 获取当前点击的位置对应的索引 QMenu menu; QModelIndex index = ui->treeView->indexAt(pos); if (!index.isValid()) { // 如果点击的是空白区域,创建新组态图菜单 QAction *addAction = new QAction("添加组态图", this); connect(addAction,&QAction::triggered,this,[&](){ QVariant id = QUuid::createUuid(); QString sName = generateName(); QStandardItem *item = new QStandardItem(sName); item->setData(id,Qt::UserRole+1); _pModel->appendRow(item); DiagramInfo info; //todo:具体信息 info.id = id; //新建的组态图随机赋予临时id info.sName = sName; info.sTag = sName; emit diagramCreate(info); }); menu.addAction(addAction); } else{ //目标组态图下添加子组态图 QStandardItem* item = _pModel->itemFromIndex(index); QVariant parentId = item->data(Qt::UserRole+1); if(item) { QAction *addAction = new QAction("添加子组态图", this); connect(addAction,&QAction::triggered,this,[&](){ QVariant id = QUuid::createUuid(); QString sName = generateName(); QStandardItem *item = new QStandardItem(sName); item->setData(id,Qt::UserRole+1); item->appendRow(item); DiagramInfo info; //todo:具体信息 info.id = id; //新建的随机赋予临时id info.sName = sName; info.sTag = sName; info.parentId = parentId; emit diagramCreate(info); }); menu.addAction(addAction); QAction *delAction = new QAction("删除", this); connect(delAction,&QAction::triggered,this,[&](){ QModelIndex currentIndex = ui->treeView->currentIndex(); if(currentIndex.isValid()) { QStandardItem* pItem = _pModel->itemFromIndex(currentIndex); QVariant id = pItem->data(Qt::UserRole+1); QString sName = pItem->text(); if(pItem) { QString str = item->text(); DiagramInfo info; //todo:具体信息 info.id = id; //新建的随机赋予临时id info.sName = sName; info.sTag = sName; info.parentId = parentId; emit diagramDelete(info); QStandardItem* pParent = item->parent(); if(pParent) { pParent->removeRow(currentIndex.row()); } } } }); menu.addAction(delAction); } } // 在点击位置显示菜单 menu.exec(ui->treeView->mapToGlobal(pos)); } void DiagramView::onItemChanged(QStandardItem *item) { int nLevel = getLevel(item); QString str = item->text(); //名称可能修改 DiagramInfo info; info.id = item->data(Qt::UserRole).toInt(); info.sName = str; emit diagramChange(info); } void DiagramView::onItemClicked(const QModelIndex &index) { QStandardItem* item = _pModel->itemFromIndex(index); QStandardItem* parent = item->parent(); if(item) { DiagramInfo info; info.id = item->data(Qt::UserRole).toInt(); info.sName = item->text(); if(parent) info.parentId = parent->data(Qt::UserRole).toInt(); emit diagramSelected(info); } } void DiagramView::onEditorRbtnClicked(const QPoint &pos) { QTreeWidgetItem *item = ui->treeWidget->itemAt(pos); if (!item) return; int level = getItemLevel(item); QMenu menu(this); switch (level) { case 1:{ // 顶级节点 QAction *actSaveTop = menu.addAction("保存"); QAction *actGenTop = menu.addAction("生成"); menu.addSeparator(); QAction *actDelTop = menu.addAction("删除"); QAction *act = menu.exec(ui->treeWidget->mapToGlobal(pos)); if(act == actSaveTop){ ProjectManager::instance().saveEditor(item->text(0)); } else if(act == actGenTop){ } else if(act == actDelTop){ } } break; case 2:{ // 二级节点 } break; case 3:{ // 三级节点 } break; } } void DiagramView::onNewEditorCreated(const QString& str,QUuid id) { ui->treeWidget->clear(); QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(ui->treeWidget); topLevelItem->setText(0, str); topLevelItem->setData(0,Qt::UserRole,id); topLevelItem->setText(1,"未保存"); topLevelItem->setForeground(1,Qt::yellow); } void DiagramView::onEditorSaved(const QString& str,QUuid uid) { QTreeWidgetItemIterator it(ui->treeWidget); while (*it) { QTreeWidgetItem* item = *it; if(item->data(0,Qt::UserRole).toUuid() == uid) { item->setText(1,"已保存"); item->setForeground(1,Qt::green); break; } ++it; } } void DiagramView::onNewEditorClicked() { } void DiagramView::onOpenEditorClicked() { emit loadProject(); } void DiagramView::onSaveEditorClicked() { } QString DiagramView::generateName() { QString sName = QString::fromWCharArray(L"组态图_")+QString::number(_count); QModelIndex Idx = findIndex(_pModel,sName); if(Idx.isValid()) //已存在 { _count += 1; return generateName(); } else { return sName; } } int DiagramView::getItemLevel(QTreeWidgetItem *item) { int level = 0; while (item->parent()) { level++; item = item->parent(); } return level + 1; // 顶级节点为1级 }