DiagramDesigner/diagramCavas/source/diagramCavas.cpp

316 lines
8.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <QMdiSubWindow>
#include <QMessageBox>
#include <QJsonObject>
#include <QStandardItem>
#include "drawingPanel.h"
#include "diagramCavas.h"
#include "mainwindow.h"
#include "dataBase.h"
#include "graphicsItem/graphicsBaseItem.h"
#include "topologyManager.h"
#include "powerEntity.h"
#include "componentIconManager.h"
DiagramCavas::DiagramCavas(QWidget *parent)
: QMdiArea(parent)
{
_pageIndex = 0;
}
DiagramCavas::~DiagramCavas()
{
}
void DiagramCavas::initial()
{
//todo:读取数据并初始化
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);
}
void DiagramCavas::onSignal_addDrawingPanel(PowerEntity* pItem,DiagramMode mode)
{
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));
pPanel->show();
FixedPortsModel* pModel = pPanel->getModel();
connect(pModel,&FixedPortsModel::activatePage,this,&DiagramCavas::onSignal_activatePage);
connect(pPanel,&DrawingPanel::panelDelete,this,&DiagramCavas::onSignal_panelDelete);
}
void DiagramCavas::onSignal_addGraphicsItem(modelStateInfo& info)
{
QMdiSubWindow* actWindow = activeSubWindow();
if(!actWindow)
return;
QWidget* pWindow= currentSubWindow()->widget();
DrawingPanel* pPanel = dynamic_cast<DrawingPanel*>(pWindow);
if(pPanel)
pPanel->onSignal_addGraphicsItem(info);
}
void DiagramCavas::onSignal_addPage()
{
//onSignal_addDrawingPanel(QString("Page_")+QString::number(++_pageIndex));
}
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,GraphicsBaseItem*> map = pPanel->getModel()->allItems();
for(auto pItem:map)
{
if(pItem->itemChanged())
{
pItem->updateConnectData(); //更新连接状态
pItem->setItemChanged(false);
}
}
if(DataBase::GetInstance()->getPageIdByName(_curPage) == -1) //不存在,创建
DataBase::GetInstance()->insertPage(_curPage,_curPage,QJsonObject(),pPanel->getDiagramInfo(),QString("page"),1);
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;
}
}
}
}
void DiagramCavas::onSignal_loadPage(PowerEntity* p)
{
if(!m_mapDrawPanel.contains(p->name()))
{
//todo:加载数据
onSignal_addDrawingPanel(p);
QJsonObject context = DataBase::GetInstance()->getPageContextByName(p->name());
m_mapDrawPanel[p->name()].first->loadNodes(context);
}
else //已存在
{
m_mapDrawPanel[p->name()].first->show();
}
}
void DiagramCavas::runPage(const QString sName)
{
QString pageName = sName+QString("_run");
if(!m_mapDrawPanel.contains(pageName))
{
//onSignal_addDrawingPanel(pageName,DM_run);
QJsonObject context = DataBase::GetInstance()->getPageContextByName(sName);
//m_mapDrawPanel[pageName]->loadNodes(context);
}
else //已存在
{
//m_mapDrawPanel[pageName]->show();
}
}
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)
{
DrawingPanel* pPanel = m_mapDrawPanel.take(name).first;
if(m_mapDrawPanel.isEmpty())
{
//FixedPortsModel::_dataInitialised = false;
}
this->removeSubWindow(pPanel);
delete pPanel;
}
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)
{
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) //构建父子关系
{
pParent->addChild(pEntity);
}
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)
{
PowerEntity* pEntity = TopologyManager::instance().findDiagram(QString::number(info.id.toInt()));
if(pEntity)
{
onSignal_loadPage(pEntity);
}
else //不存在,从数据库中load
{
}
}
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;
}
}
}