236 lines
6.5 KiB
C++
236 lines
6.5 KiB
C++
#include <QJsonArray>
|
||
#include "drawingPanel.h"
|
||
#include "ui_drawingPanel.h"
|
||
#include <QMessageBox>
|
||
#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<QUuid,GraphicsBaseItem*> 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<QUuid,QPointF> 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<Connection> 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);
|
||
}
|