#include #include "drawingPanel.h" #include "ui_drawingPanel.h" #include #include "designerView.h" #include "graphicsDataModel/fixedPortsModel.h" #include "util/selectorManager.h" #include "graphicsItem/electricConnectLineItem.h" #include "statusBar.h" #include "dataBase.h" DrawingPanel::DrawingPanel(QWidget *parent,DiagramMode mode) : QWidget(parent) , ui(new Ui::drawingPanel) ,_pModel(nullptr) ,_mode(mode) { ui->setupUi(this); _pModel = new FixedPortsModel(); _pModel->setTopWidget(this); if(mode == DM_edit) m_pSelectorManager = new SelectorManager(_pModel,this); m_pGraphicsScene = new DesignerScene(_pModel,this); //设置场景大小.前两个参数为scene的坐标远点,设置到view的中心点后,无论view如何缩放,secne的坐标原点都不会动,方便后续的位置计算 m_pGraphicsScene->setSceneRect(-g_dGriaphicsScene_Width / 2, -g_dGriaphicsScene_Height / 2, g_dGriaphicsScene_Width, g_dGriaphicsScene_Height); m_pGraphicsScene->setGridVisible(true); m_pGraphicsView = new DesignerView(this); m_pGraphicsView->setScene(m_pGraphicsScene); m_pGraphicsScene->setView(m_pGraphicsView); ui->mainLayout->addWidget(m_pGraphicsView); _pModel->setScene(m_pGraphicsScene); m_pStatusBar = new StatusBar(this); ui->mainLayout->addWidget(m_pStatusBar); connect(m_pGraphicsView,&DesignerView::onScaleChanged,m_pStatusBar,&StatusBar::onScaleLevelChanged); } DrawingPanel::~DrawingPanel() { delete ui; if(_pModel) delete _pModel; } QGraphicsScene* DrawingPanel::getQGraphicsScene() { return m_pGraphicsView->scene(); } DesignerScene* DrawingPanel::getDesignerScene() { return m_pGraphicsScene; } void DrawingPanel::grahpicsViewZoomIn() { m_pGraphicsView->zoomIn(); } void DrawingPanel::grahpicsViewZoomOut() { m_pGraphicsView->zoomOut(); } void DrawingPanel::grahpicsViewZoomFit() { m_pGraphicsView->zoomFit(); } GraphicsItemGroup* DrawingPanel::createItemGroup() { return m_pGraphicsScene->createGroup(); } void DrawingPanel::destroyItemGroup() { m_pGraphicsScene->destroyGroup(); } SelectorManager* DrawingPanel::selectorManager() const { if(m_pSelectorManager) return m_pSelectorManager; else return NULL; } void DrawingPanel::closeEvent(QCloseEvent *closeEvent) { bool changed = false; QMap map = _pModel->allItems(); if(_pModel) { for(auto pItem:map) { if(pItem->itemChanged()) { changed = true; break; } } } if(changed) { QMessageBox msgBox; msgBox.setText(QString::fromWCharArray(L"提示")); msgBox.setInformativeText(QString::fromWCharArray(L"保存修改内容?")); msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); int ret = msgBox.exec(); switch (ret) { case QMessageBox::Ok: { for(auto pItem:map) { if(pItem->itemChanged()) pItem->updateConnectData(); } if(DataBase::GetInstance()->getPageIdByName(_name) == -1) //不存在,创建 DataBase::GetInstance()->insertPage(_name,_name,1,QJsonObject(),getDiagramInfo(),QString("page"),1); else DataBase::GetInstance()->updatePage(_name,_name,getDiagramInfo()); int pageId = DataBase::GetInstance()->getPageIdByName(_name); saveNodes(pageId); //todo:同步图形数据到数据对象,保存到服务器 } break; case QMessageBox::Cancel: { //todo:取消保存,删除panel } break; default: // should never be reached break; } } /*for(auto pItem:map) //删除图元前先解绑 { pItem->unbindProperty(); }*/ emit panelDelete(_name); } void DrawingPanel::onSignal_addGraphicsItem(GraphicsItemType& itemType) { if(m_pSelectorManager) { m_pSelectorManager->setWorkingSelector(ST_cerating); m_pSelectorManager->setDrawGraphicsItem(itemType); } } QJsonObject DrawingPanel::getDiagramInfo() const { QJsonObject obj; QJsonArray arr; if(_pModel) { QMap map = _pModel->allNodePos(); for(auto iter = map.begin();iter != map.end();++iter) { QJsonObject node; node["id"] = iter.key().toString(); node["x"] = iter.value().x(); node["y"] = iter.value().y(); arr.append(node); } obj["nodes"] = arr; QJsonArray arrConnect; QVector vec = _pModel->allConnections(); for(auto iter = vec.begin(); iter != vec.end();++iter) { QJsonObject connect; connect["SrcNodeId"] = iter->nSrcNodeId.toString(); connect["SrcPort"] = iter->nSrcPort; connect["DestNodeId"] = iter->nDestNodeId.toString(); connect["DestPort"] = iter->nDestPort; arrConnect.append(connect); } obj["connections"] = arrConnect; } return obj; } void DrawingPanel::loadNodes(QJsonObject obj) { QJsonArray nodesJsonArray = obj["nodes"].toArray(); for (QJsonValueRef nodeJson : nodesJsonArray) { QJsonObject node = nodeJson.toObject(); QString uuid = node["id"].toString(); double dX = node["x"].toDouble(); double dY = node["y"].toDouble(); //componentInfo info =DataBase::GetInstance()->getComponentInfoByUuid(uuid); if(_pModel) { _pModel->addNodeItem(QUuid(uuid)/*,info.type*/,QPointF(dX,dY)); } } QJsonArray connectArr = obj["connections"].toArray(); for(QJsonValueRef connectJson:connectArr) { QJsonObject connect = connectJson.toObject(); QUuid srcId = QUuid(connect["SrcNodeId"].toString()); int srcPort = connect["SrcPort"].toInt(); QUuid destId = QUuid(connect["DestNodeId"].toString()); int destPort = connect["DestPort"].toInt(); if(_pModel) { _pModel->addConnectLline(srcId,destId,srcPort,destPort); } } if(_mode == DM_run) { if(_pModel) _pModel->startHttpRequest(); } } void DrawingPanel::saveNodes(int pageId) { if(_pModel) _pModel->saveNode(pageId); }