DiagramDesigner/diagramCavas/source/diagramCavas.cpp

386 lines
11 KiB
C++
Raw Normal View History

2025-05-16 19:20:46 +08:00
#include <QMdiSubWindow>
#include <QMessageBox>
#include <QJsonObject>
#include <QStandardItem>
2025-02-06 16:36:50 +08:00
#include "drawingPanel.h"
#include "diagramCavas.h"
2025-05-30 16:28:51 +08:00
//#include "mainwindow.h"
2025-02-06 16:36:50 +08:00
#include "dataBase.h"
#include "graphicsItem/graphicsBaseItem.h"
2025-04-30 16:29:17 +08:00
#include "topologyManager.h"
#include "powerEntity.h"
2025-05-30 16:28:51 +08:00
#include "diagramEditor/diagramEditorWizard.h"
2025-05-16 19:20:46 +08:00
#include "componentIconManager.h"
2025-05-30 16:28:51 +08:00
#include "diagramEditor/editPanel.h"
2025-02-06 16:36:50 +08:00
DiagramCavas::DiagramCavas(QWidget *parent)
: QMdiArea(parent)
{
_pageIndex = 0;
2025-05-30 16:28:51 +08:00
_pEditorWizard = nullptr;
2025-02-06 16:36:50 +08:00
}
DiagramCavas::~DiagramCavas()
{
}
2025-06-20 18:09:41 +08:00
DrawingPanel* DiagramCavas::getPanel(QString sPage)
{
if(m_mapDrawPanel.contains(sPage))
return m_mapDrawPanel[sPage].first;
return nullptr;
}
2025-02-06 16:36:50 +08:00
void DiagramCavas::initial()
{
//todo:读取数据并初始化
2025-05-16 19:20:46 +08:00
QList<pageInfo> lst = DataBase::GetInstance()->getAllPage();
for(auto info:lst)
{
TopologyManager::instance().createDiagram(QString::number(info.id),info.name);
}
//QString sPath = ComponentIconManager::instance().getIconPath("circuitBreaker",DM_edit,VI_thumbnail);
2025-02-06 16:36:50 +08:00
}
2025-04-30 16:29:17 +08:00
void DiagramCavas::onSignal_addDrawingPanel(PowerEntity* pItem,DiagramMode mode)
2025-02-06 16:36:50 +08:00
{
2025-04-30 16:29:17 +08:00
DrawingPanel* pPanel = new DrawingPanel(pItem,this,mode);
_curPage = pItem->name();
pPanel->setPageName(_curPage);
pPanel->setWindowTitle(_curPage);
//->setAttribute(Qt::WA_DeleteOnClose);
QMdiSubWindow* pSub = this->addSubWindow(pPanel);
m_mapDrawPanel.insert(_curPage,qMakePair(pPanel,pSub));
2025-02-06 16:36:50 +08:00
pPanel->show();
FixedPortsModel* pModel = pPanel->getModel();
2025-06-20 18:09:41 +08:00
pModel->setCavas(this);
2025-02-06 16:36:50 +08:00
connect(pModel,&FixedPortsModel::activatePage,this,&DiagramCavas::onSignal_activatePage);
connect(pPanel,&DrawingPanel::panelDelete,this,&DiagramCavas::onSignal_panelDelete);
if(mode == DM_baseModel)
{
}
2025-02-06 16:36:50 +08:00
}
2025-03-28 18:08:21 +08:00
void DiagramCavas::onSignal_addGraphicsItem(modelStateInfo& info)
2025-02-06 16:36:50 +08:00
{
2025-04-30 16:29:17 +08:00
QMdiSubWindow* actWindow = activeSubWindow();
if(!actWindow)
return;
2025-02-06 16:36:50 +08:00
QWidget* pWindow= currentSubWindow()->widget();
DrawingPanel* pPanel = dynamic_cast<DrawingPanel*>(pWindow);
if(pPanel)
2025-03-28 18:08:21 +08:00
pPanel->onSignal_addGraphicsItem(info);
2025-02-06 16:36:50 +08:00
}
void DiagramCavas::onSignal_addPage()
{
2025-04-30 16:29:17 +08:00
//onSignal_addDrawingPanel(QString("Page_")+QString::number(++_pageIndex));
2025-02-06 16:36:50 +08:00
}
void DiagramCavas::onSignal_savePage()
{
QWidget* pWindow= currentSubWindow()->widget();
DrawingPanel* pPanel = dynamic_cast<DrawingPanel*>(pWindow);
if(pPanel)
{
if(pPanel->getMode() == DM_run)
{
QMessageBox::about(NULL,QString::fromWCharArray(L"提示"), QString::fromWCharArray(L"运行中无法保存!"));
}
else if(pPanel->getMode() == DM_edit)
{
_curPage = pPanel->pageName();
QMessageBox msgBox;
msgBox.setText(QString::fromWCharArray(L"提示"));
msgBox.setInformativeText(QString::fromWCharArray(L"内容已修改,是否保存?"));
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Save);
int ret = msgBox.exec();
switch (ret) {
case QMessageBox::Save: //todo:已存在更新
{
QMap<QUuid,GraphicsProjectModelItem*> map = pPanel->getModel()->allItems();
2025-02-06 16:36:50 +08:00
for(auto pItem:map)
{
if(pItem->itemChanged())
{
pItem->updateConnectData(); //更新连接状态
pItem->setItemChanged(false);
}
}
if(DataBase::GetInstance()->getPageIdByName(_curPage) == -1) //不存在,创建
2025-05-23 10:30:52 +08:00
DataBase::GetInstance()->insertPage(_curPage,_curPage,QJsonObject(),pPanel->getDiagramInfo(),QString("page"),1);
2025-02-06 16:36:50 +08:00
else
DataBase::GetInstance()->updatePage(_curPage,_curPage,pPanel->getDiagramInfo());
int pageId = DataBase::GetInstance()->getPageIdByName(_curPage);
pPanel->saveNodes(pageId);
}
break;
case QMessageBox::Cancel:
// Cancel was clicked
break;
default:
// should never be reached
break;
}
}
else if(pPanel->getMode() == DM_baseModel)
{
}
2025-02-06 16:36:50 +08:00
}
}
2025-04-30 16:29:17 +08:00
void DiagramCavas::onSignal_loadPage(PowerEntity* p)
2025-02-06 16:36:50 +08:00
{
2025-04-30 16:29:17 +08:00
if(!m_mapDrawPanel.contains(p->name()))
2025-02-06 16:36:50 +08:00
{
//todo:加载数据
2025-04-30 16:29:17 +08:00
onSignal_addDrawingPanel(p);
QJsonObject context = DataBase::GetInstance()->getPageContextByName(p->name());
m_mapDrawPanel[p->name()].first->loadNodes(context);
2025-02-06 16:36:50 +08:00
}
else //已存在
{
2025-04-30 16:29:17 +08:00
m_mapDrawPanel[p->name()].first->show();
2025-02-06 16:36:50 +08:00
}
}
void DiagramCavas::runPage(const QString sName)
{
QString pageName = sName+QString("_run");
if(!m_mapDrawPanel.contains(pageName))
{
2025-04-30 16:29:17 +08:00
//onSignal_addDrawingPanel(pageName,DM_run);
2025-02-06 16:36:50 +08:00
QJsonObject context = DataBase::GetInstance()->getPageContextByName(sName);
2025-04-30 16:29:17 +08:00
//m_mapDrawPanel[pageName]->loadNodes(context);
2025-02-06 16:36:50 +08:00
}
else //已存在
{
2025-04-30 16:29:17 +08:00
//m_mapDrawPanel[pageName]->show();
2025-02-06 16:36:50 +08:00
}
}
void DiagramCavas::onSignal_runPage()
{
runPage(_curPage);
}
void DiagramCavas::onSignal_deletePage()
{
}
void DiagramCavas::onSignal_activatePage(const QString& name)
{
_curPage = name;
}
void DiagramCavas::onSignal_panelDelete(const QString& name)
{
2025-04-30 16:29:17 +08:00
DrawingPanel* pPanel = m_mapDrawPanel.take(name).first;
2025-02-06 16:36:50 +08:00
if(m_mapDrawPanel.isEmpty())
{
2025-05-09 19:36:32 +08:00
//FixedPortsModel::_dataInitialised = false;
2025-02-06 16:36:50 +08:00
}
this->removeSubWindow(pPanel);
delete pPanel;
}
2025-04-30 16:29:17 +08:00
void DiagramCavas::onSignal_createEntity(EntityInfo info)
{
PowerEntity* pEntity;
pEntity = TopologyManager::instance().findEntity(info.sUuid);
if(!pEntity) //不存在创建
{
pEntity = TopologyManager::instance().createEntity(info.eType,info.sUuid,info.sName);
PowerEntity* pParent = TopologyManager::instance().findEntity(info.sParentId);
if(pParent) //构建父子关系
{
pParent->addChild(pEntity);
}
switch (info.eType){
case EntityType::Grid:
case EntityType::Zone:
case EntityType::Station:
break;
case EntityType::ConfigurationDiagram:
onSignal_addDrawingPanel(pEntity);
break;
default:
break;
}
}
}
void DiagramCavas::onSignal_changeEntity(EntityInfo info)
{
}
void DiagramCavas::onSignal_deleteEntity(EntityInfo info)
{
PowerEntity* pEntity = TopologyManager::instance().findEntity(info.sUuid);
if(pEntity)
{
switch (info.eType){
case EntityType::Grid:
case EntityType::Zone:
case EntityType::Station:
TopologyManager::instance().deleteEntity(info.sUuid);
break;
case EntityType::ConfigurationDiagram:
removePanel(pEntity);
TopologyManager::instance().deleteEntity(info.sUuid);
break;
default:
break;
}
}
}
void DiagramCavas::onSignal_selectEntity(EntityInfo info)
{
PowerEntity* pEntity = TopologyManager::instance().findEntity(info.sUuid);
if(pEntity)
{
2025-05-09 19:36:32 +08:00
switch (info.eType){
case EntityType::Grid:
case EntityType::Zone:
case EntityType::Station:
break;
default:
break;
}
}
else //不存在,从数据库中load
{
}
}
void DiagramCavas::onSignal_createDiagram(DiagramInfo info)
{
PowerEntity* pEntity;
pEntity = TopologyManager::instance().findDiagram(info.id.toString());
if(!pEntity) //不存在创建
{
pEntity = TopologyManager::instance().createDiagram(info.id.toString(),info.sName);
PowerEntity* pParent = TopologyManager::instance().findDiagram(info.parentId.toString());
if(pParent) //构建父子关系
2025-04-30 16:29:17 +08:00
{
2025-05-09 19:36:32 +08:00
pParent->addChild(pEntity);
2025-04-30 16:29:17 +08:00
}
2025-05-09 19:36:32 +08:00
onSignal_addDrawingPanel(pEntity);
}
}
void DiagramCavas::onSignal_changeDiagram(DiagramInfo info)
{
}
void DiagramCavas::onSignal_deleteDiagram(DiagramInfo info)
{
PowerEntity* pEntity = TopologyManager::instance().findDiagram(info.id.toString());
if(pEntity)
{
removePanel(pEntity);
TopologyManager::instance().deleteEntity(info.id.toString());
}
}
void DiagramCavas::onSignal_selectDiagram(DiagramInfo info)
{
2025-05-16 19:20:46 +08:00
PowerEntity* pEntity = TopologyManager::instance().findDiagram(QString::number(info.id.toInt()));
2025-05-09 19:36:32 +08:00
if(pEntity)
{
onSignal_loadPage(pEntity);
}
else //不存在,从数据库中load
{
2025-04-30 16:29:17 +08:00
}
}
void DiagramCavas::removePanel(PowerEntity* pEntity)
{
QMap<QString,QPair<DrawingPanel*,QMdiSubWindow*>>::Iterator iter;
for(iter = m_mapDrawPanel.begin(); iter != m_mapDrawPanel.end();++iter)
{
if(pEntity->name() == iter.value().first->pageName())
{
DrawingPanel* pPanel = m_mapDrawPanel.take(iter.key()).first;
QWidget* pWindow = static_cast<QWidget*>(pPanel);
setActiveSubWindow(iter->second);
closeActiveSubWindow();
//removeSubWindow(pPanel);
//todo记录删除组态图从数据库中删除
delete pPanel;
break;
}
}
}
2025-05-30 16:28:51 +08:00
void DiagramCavas::onCreateTestBaseModelDiagram()
{
PowerEntity* pEntity;
QUuid id = QUuid::createUuid();
pEntity = TopologyManager::instance().findDiagram(id.toString());
if(!pEntity) //不存在创建
{
pEntity = TopologyManager::instance().createDiagram(id.toString(),"测试1");
onSignal_addDrawingPanel(pEntity,DM_baseModel);
2025-06-20 18:09:41 +08:00
DrawingPanel* pPanel = getPanel(pEntity->name());
pPanel->getModel()->addTestData();
}
}
2025-05-30 16:28:51 +08:00
/*******************************************************/
void DiagramCavas::onSignal_createEditPanel(QString sName)
{
//onSignal_addEditPanel(sName);
onSignal_addEditWizard(sName);
}
EditPanel* DiagramCavas::onSignal_addEditPanel(QString sName)
{
EditPanel* pPanel = new EditPanel(this);
pPanel->setWindowTitle(_curPage);
QMdiSubWindow* pSub = this->addSubWindow(pPanel);
pPanel->show();
return pPanel;
}
void DiagramCavas::onSignal_addEditWizard(QString name)
{
if(_pEditorWizard == nullptr){
_pEditorWizard = new DiagramEditorWizard(this);
connect(_pEditorWizard,&DiagramEditorWizard::wizardFinish,this,[&,name](DiagramEditorWizardInfo info){
EditPanel* pPanel = onSignal_addEditPanel(name);
pPanel->initByWizardInfo(info);
});
}
_pEditorWizard->show();
}
void DiagramCavas::onSignal_wizardFinished(DiagramEditorWizardInfo info)
{
}