diff --git a/CMakeLists.txt b/CMakeLists.txt index 0959b72..da3de88 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,7 +12,7 @@ find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Gui Widgets Sql Xml REQUIRED) find_package(Qt6 REQUIRED COMPONENTS SvgWidgets) find_package(Qt6 COMPONENTS Network REQUIRED) -find_package(PostgreSQL REQUIRED) +find_package(PostgreSQL REQUIRED) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -127,7 +127,7 @@ endif() include_directories(include) include_directories(common/include) -include_directories(${POSTGRESQL_INCLUDE_DIRS}) +include_directories(${PostgreSQL_INCLUDE_DIRS}) target_include_directories(DiagramDesigner PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include") target_link_libraries(DiagramDesigner PUBLIC Qt${QT_VERSION_MAJOR}::Core @@ -136,7 +136,8 @@ target_link_libraries(DiagramDesigner PUBLIC Qt${QT_VERSION_MAJOR}::Core target_link_libraries(DiagramDesigner PRIVATE Qt6::SvgWidgets) target_link_libraries(DiagramDesigner PRIVATE Qt6::Xml) target_link_libraries(DiagramDesigner PRIVATE Qt6::Network) -target_link_libraries(DiagramDesigner PRIVATE Qt6::Sql ${POSTGRESQL_LIBRARIES}) +target_link_libraries(DiagramDesigner PRIVATE Qt6::Sql ${PostgreSQL_LIBRARIES}) +message(STATUS "POSTGRESQL_LIBRARIES: ${PostgreSQL_LIBRARIES}") set_target_properties(DiagramDesigner PROPERTIES AUTOMOC ON AUTORCC ON diff --git a/common/include/global.h b/common/include/global.h index 38b1a36..e07903b 100644 --- a/common/include/global.h +++ b/common/include/global.h @@ -428,6 +428,15 @@ struct DiagramEditorWizardBusInfo //组态编辑母线信息 int nNum2 = 0; //2母 int connectType = 0; //接线方式,1为分段连接 bool bChanged = false; //是否改变 + + friend QDataStream &operator<<(QDataStream &out, const DiagramEditorWizardBusInfo &data) { + out << data.nIndex << data.dVoltage << data.nLineType << data.nNum1 << data.nNum2 << data.connectType << data.bChanged; + return out; + } + friend QDataStream &operator>>(QDataStream &in, DiagramEditorWizardBusInfo &data) { + in >> data.nIndex >> data.dVoltage >> data.nLineType >> data.nNum1 >> data.nNum2 >> data.connectType >> data.bChanged; + return in; + } }; enum class TransformerType //变压器类型 @@ -500,6 +509,15 @@ struct DiagramEditorComponentInfo //组态设备信息 else return false; } + + friend QDataStream &operator<<(QDataStream &out, const DiagramEditorComponentInfo &data) { + out << data.nCategory << data.sName << data.nType << data.sBindObj << data.nBindType << data.nBindPara << data.sBindParent << data.sUsedRoute << data.nUsedDirection << data.deltaPos << data.uid << data.nFlag << data.nRotate; + return out; + } + friend QDataStream &operator>>(QDataStream &in, DiagramEditorComponentInfo &data) { + in >> data.nCategory >> data.sName >> data.nType >> data.sBindObj >> data.nBindType >> data.nBindPara >> data.sBindParent >> data.sUsedRoute >> data.nUsedDirection >> data.deltaPos >> data.uid >> data.nFlag >> data.nRotate; + return in; + } }; inline uint qHash(const DiagramEditorComponentInfo &key, uint seed = 0) { @@ -513,6 +531,15 @@ struct DiagramEditorRouteInfo //间隔中单条线路信息 QList lstCompo; QList lstOrder; //线路顺序容器(计算用) QList lstReverse; //逆序容器(计算用) + + friend QDataStream &operator<<(QDataStream &out, const DiagramEditorRouteInfo &data) { + out << data.sRouteName << data.bMainRoute << data.lstCompo << data.lstOrder << data.lstReverse; + return out; + } + friend QDataStream &operator>>(QDataStream &in, DiagramEditorRouteInfo &data) { + in >> data.sRouteName >> data.bMainRoute >> data.lstCompo >> data.lstOrder >> data.lstReverse; + return in; + } }; struct DiagramEditorBayInfo //组态编辑间隔信息 @@ -523,6 +550,15 @@ struct DiagramEditorBayInfo //组态编辑间隔信息 QList lstTo; //结束 QMap mapRoute; //线路信息 QMap mapComponent; //设备信息 + + friend QDataStream &operator<<(QDataStream &out, const DiagramEditorBayInfo &data) { + out << data.name << data.nLayout << data.lstFrom << data.lstTo << data.mapRoute << data.mapComponent; + return out; + } + friend QDataStream &operator>>(QDataStream &in, DiagramEditorBayInfo &data) { + in >> data.name >> data.nLayout >> data.lstFrom >> data.lstTo >> data.mapRoute >> data.mapComponent; + return in; + } }; struct DiagramEditorTransNeutralInfo //组态编辑变压器中性点信息 @@ -531,6 +567,15 @@ struct DiagramEditorTransNeutralInfo //组态编辑变压器中性点信息 int nType = 0; //中性点类型 0高1中2低 QPointF delPoint; //相对变压器偏移量 QMap mapRoute; //中性点对应的线路结构 + + friend QDataStream &operator<<(QDataStream &out, const DiagramEditorTransNeutralInfo &data) { + out << data.name << data.nType << data.delPoint << data.mapRoute; + return out; + } + friend QDataStream &operator>>(QDataStream &in, DiagramEditorTransNeutralInfo &data) { + in >> data.name >> data.nType >> data.delPoint >> data.mapRoute; + return in; + } }; struct DiagramEditorTransInfo //组态编辑变压器信息 @@ -538,6 +583,15 @@ struct DiagramEditorTransInfo //组态编辑变压器信息 QString name; //变压器名 QMap mapNeutral; //中性点结构 QMap mapComponent; //设备信息 + + friend QDataStream &operator<<(QDataStream &out, const DiagramEditorTransInfo &data) { + out << data.name << data.mapNeutral << data.mapComponent; + return out; + } + friend QDataStream &operator>>(QDataStream &in, DiagramEditorTransInfo &data) { + in >> data.name >> data.mapNeutral >> data.mapComponent; + return in; + } }; enum class DiagramEditorStructType @@ -551,6 +605,15 @@ struct DiagramEditorConnectType //组态编辑连接信息 { QString sName; int nType = 0; //1母线,2间隔,3变压器 + + friend QDataStream &operator<<(QDataStream &out, const DiagramEditorConnectType &data) { + out << data.sName << data.nType; + return out; + } + friend QDataStream &operator>>(QDataStream &in, DiagramEditorConnectType &data) { + in >> data.sName >> data.nType; + return in; + } }; struct DiagramEditorBriefConnect //组态编辑时连接信息 @@ -570,6 +633,15 @@ struct DiagramEditorBriefConnect //组态编辑时连接信息 return false; } + friend QDataStream &operator<<(QDataStream &out, const DiagramEditorBriefConnect &data) { + out << data.uid << data.con1 << data.con2 << data.nPara; + return out; + } + friend QDataStream &operator>>(QDataStream &in, DiagramEditorBriefConnect &data) { + in >> data.uid >> data.con1 >> data.con2 >> data.nPara; + return in; + } + DiagramEditorConnectType getOpposite(const QString& s){ //获取另一端名称 if(con1.sName == s) return con2; @@ -579,6 +651,83 @@ struct DiagramEditorBriefConnect //组态编辑时连接信息 } }; +struct DiagramEditorBlockInfo //组态编辑block信息 +{ + QString sName; + QString sContainerId; //所属的容器id + int nType; //1母线,2间隔,3变压器 + int nContainerLevel; //所处容器的层级 0,1,2,3 + QUuid uid; + QList _lstCon; //连接信息 + QRectF recSize; //当前大小(根据内容确定) + QPointF sceneDelta; //block中心相对位移(计算布局位置 + bool bEditState; //详细编辑状态 + + //bus + float fVoltage; //母线电压 + int nBusType; //0无前缀,1:Ⅰ母,2Ⅱ母 + int nIndex; //第几段,1A,2B,3C,4D,5E,6F,7G,8H + //bay + BayType nBayType; + DiagramEditorBayInfo bayInfo; //间隔信息 + //transformer + TransformerType nTransType; + DiagramEditorTransInfo transInfo; + + friend QDataStream &operator<<(QDataStream &out, const DiagramEditorBlockInfo &data) { + out << data.sName << data.sContainerId << data.nType << data.nContainerLevel << data.uid << data._lstCon << data.recSize << data.sceneDelta + << data.bEditState << data.fVoltage << data.nBusType << data.nIndex << data.nBayType << data.bayInfo << data.nTransType << data.transInfo; + return out; + } + friend QDataStream &operator>>(QDataStream &in, DiagramEditorBlockInfo &data) { + in >> data.sName >> data.sContainerId >> data.nType >> data.nContainerLevel >> data.uid >> data._lstCon >> data.recSize >> data.sceneDelta + >> data.bEditState >> data.fVoltage >> data.nBusType >> data.nIndex >> data.nBayType >> data.bayInfo >> data.nTransType >> data.transInfo; + return in; + } +}; + + +struct DiagramEditorContainerInfo //组态编辑容器信息 +{ + QString sId; + double dMidUpY; //1母上边界 + double dMidDownY; //2母下边界 + double dStartX; //起始x + double dStartY; //起始y + double dWidth; //宽度 + double dHeight; + double dMaxUpH; //上方最大高度(1母线到上边界) + double dMaxDownH; //下方最大高度(2母线到下边界) + QMap> mapBlockInfo; + + friend QDataStream &operator<<(QDataStream &out, const DiagramEditorContainerInfo &data) { + out << data.sId << data.dMidUpY << data.dMidDownY << data.dStartX << data.dStartY << data.dWidth << data.dHeight << data.dMaxUpH << data.dMaxDownH << data.mapBlockInfo; + return out; + } + friend QDataStream &operator>>(QDataStream &in, DiagramEditorContainerInfo &data) { + in >> data.sId >> data.dMidUpY >> data.dMidDownY >> data.dStartX >> data.dStartY >> data.dWidth >> data.dHeight >> data.dMaxUpH >> data.dMaxDownH >> data.mapBlockInfo; + return in; + } +}; + +struct DiagramEditorProjectInfo //editor工程信息 +{ + QString sName; + QUuid uid; + QMap mapBus; + QMap> mapSturctContainer; + QMap mapConnect; + + friend QDataStream &operator<<(QDataStream &out, const DiagramEditorProjectInfo &data) { + out << data.sName << data.uid << data.mapBus << data.mapSturctContainer << data.mapConnect; + return out; + } + friend QDataStream &operator>>(QDataStream &in, DiagramEditorProjectInfo &data) { + in >> data.sName >> data.uid >> data.mapBus >> data.mapSturctContainer >> data.mapConnect; + return in; + } +}; + //==================组态图使用===================== enum HandleType { @@ -765,6 +914,16 @@ struct baseComponentInfo //基模图元数据 QString metaMmodel; QString projectModel; }; + +struct editorProjectInfo //editor工程数据 +{ + int id = 0; + QUuid uuid; + QString name; + QString tag; + QByteArray context; +}; + //================================================== struct componentInfo //工程模图元数据 diff --git a/diagramCavas/CMakeLists.txt b/diagramCavas/CMakeLists.txt index d68bad4..d4eb3c1 100644 --- a/diagramCavas/CMakeLists.txt +++ b/diagramCavas/CMakeLists.txt @@ -257,7 +257,7 @@ target_link_libraries(diagramCavas PUBLIC Qt${QT_VERSION_MAJOR}::Core target_link_libraries(diagramCavas PRIVATE Qt6::SvgWidgets) target_link_libraries(diagramCavas PRIVATE Qt6::Xml) target_link_libraries(diagramCavas PRIVATE Qt6::Network) -target_link_libraries(diagramCavas PRIVATE Qt6::Sql ${POSTGRESQL_LIBRARIES}) +target_link_libraries(diagramCavas PRIVATE Qt6::Sql ${PostgreSQL_LIBRARIES}) option(BUILD_SHARED_LIBS "Build as shared library" ON) diff --git a/diagramCavas/include/diagramCavas.h b/diagramCavas/include/diagramCavas.h index 9811d23..7974578 100644 --- a/diagramCavas/include/diagramCavas.h +++ b/diagramCavas/include/diagramCavas.h @@ -25,6 +25,7 @@ public: ~DiagramCavas(); DrawingPanel* getPanel(QString); + EditPanel* getEditPanel(QString); public: void initial(); public slots: @@ -33,6 +34,7 @@ public slots: void onSignal_addPage(); void onSignal_savePage(); void onSignal_loadPage(PowerEntity* p); + void onSignal_loadEdit(const QString&,QUuid); void runPage(const QString); //运行时 void onSignal_runPage(); void onSignal_deletePage(); @@ -52,9 +54,10 @@ public slots: void onCreateTestBaseModelDiagram(); //生成测试基模图 /******************************生成组态***********************************/ - void onSignal_createEditPanel(QString); + void onSignal_createEditPanel(QString,QUuid); + void onSignal_prepareSaveEdit(QString); EditPanel* onSignal_addEditPanel(QString); - void onSignal_addEditWizard(QString); + void onSignal_addEditWizard(QString,QUuid); void onSignal_wizardFinished(QString,QMap,QList); /*********************************间隔**************************************/ void onSignl_openCurrentBay(); @@ -62,9 +65,9 @@ private: void removePanel(PowerEntity*); private: QMap> m_mapDrawPanel; + QMap> m_mapEditPanel; int _pageIndex; QString _curPage; - DiagramEditorWizard* _pEditorWizard; }; #endif diff --git a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h index 443406e..3c9fec8 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h +++ b/diagramCavas/include/diagramEditor/diagramEditorBaseBlock.h @@ -33,7 +33,9 @@ public: virtual QPointF getSceneDelta() {return sceneDelta;} virtual void setEditState(bool b){bEditState = b;} virtual bool getEditState(){return bEditState;} + virtual DiagramEditorBlockInfo getBlockInfo(); //返回block中存储的信息 protected: + DiagramEditorStructContainer* _curContainer; //当前所处的容器 QString sName; int nType; //1母线,2间隔,3变压器 int nContainerLevel; //所处容器的层级 0,1,2,3 @@ -41,8 +43,18 @@ protected: QList _lstCon; //连接信息 QRectF recSize; //当前大小(根据内容确定) QPointF sceneDelta; //block中心相对位移(计算布局位置 - DiagramEditorStructContainer* _curContainer; //当前所处的容器 bool bEditState; //详细编辑状态 + + //bus + float fVoltage; //母线电压 + int nBusType; //0无前缀,1:Ⅰ母,2Ⅱ母 + int nIndex; //第几段,1A,2B,3C,4D,5E,6F,7G,8H + //bay + BayType nBayType; + DiagramEditorBayInfo bayInfo; //间隔信息 + //transformer + TransformerType nTransType; + DiagramEditorTransInfo transInfo; }; /***************************划分后的分段bus单元****************************/ @@ -59,10 +71,7 @@ public: virtual void setIndex(int n) {nIndex = n;} virtual int getIndex() {return nIndex;} virtual void setBusPro(QString sNa,int nTp,float fVol,int nBT,int nIdx) {sName = sNa;nType = nTp;fVoltage = fVol;nBusType = nBT;nIndex = nIdx;} -protected: - float fVoltage; //母线电压 - int nBusType; //0无前缀,1:Ⅰ母,2Ⅱ母 - int nIndex; //第几段,1A,2B,3C,4D,5E,6F,7G,8H + }; /***************************bay单元****************************/ @@ -76,9 +85,6 @@ public: virtual BayType getBayType() {return nBayType;} virtual void setBayInfo(DiagramEditorBayInfo info) {bayInfo = info;} virtual DiagramEditorBayInfo& getBayInfo(){return bayInfo;} -protected: - BayType nBayType; - DiagramEditorBayInfo bayInfo; //间隔信息 }; /***************************transformer单元****************************/ @@ -92,8 +98,5 @@ public: virtual TransformerType getTransType() {return nTransType;} virtual void setTransInfo(DiagramEditorTransInfo info) {transInfo = info;} virtual DiagramEditorTransInfo& getTranInfo() {return transInfo;} -protected: - TransformerType nTransType; - DiagramEditorTransInfo transInfo; }; #endif diff --git a/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h b/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h index 022cb94..5067747 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h +++ b/diagramCavas/include/diagramEditor/diagramEditorStructContainer.h @@ -36,9 +36,11 @@ public: double getMaxUpH() {return dMaxUpH;} void setMaxDownH(double d){dMaxDownH = d;} double getMaxDownH() {return dMaxDownH;} + QMap> getMapBlocksData(); //返回mapBlock中的数据 private: - QString sId; + QMap> _mapBlocks; //容器中包含的对象列表, pos当前容器中的位置:0上,1中上,2中下,3下 + QString sId; double dMidUpY; //1母上边界 double dMidDownY; //2母下边界 double dStartX; //起始x diff --git a/diagramCavas/include/diagramEditor/diagramEditorWizard.h b/diagramCavas/include/diagramEditor/diagramEditorWizard.h index cf449e1..5ac4e2c 100644 --- a/diagramCavas/include/diagramEditor/diagramEditorWizard.h +++ b/diagramCavas/include/diagramEditor/diagramEditorWizard.h @@ -61,6 +61,8 @@ public: QUuid addConnection(const QString& str1,const QString& str2,int nType1,int nType2,int nPara = 0); //插入连接 QMap& getConnection() {return _mapConnect;} void removeConnection(QUuid); + DiagramEditorProjectInfo getCurPara(); //获取当前的向导设置参数(同步数据到projectManager) + void setPara(DiagramEditorProjectInfo); //使用load数据初始化 private: void initial(); void reOrderBus(); //重置bus次序 diff --git a/diagramCavas/include/diagramEditor/editPanel.h b/diagramCavas/include/diagramEditor/editPanel.h index e530748..48d0bfe 100644 --- a/diagramCavas/include/diagramEditor/editPanel.h +++ b/diagramCavas/include/diagramEditor/editPanel.h @@ -22,6 +22,7 @@ class DiagramEditorTransDetailSettingDlg; class DiagramEditorModel; class DiagramEditorPreviewDlg; class ConfirmEditorDlg; +class DiagramCavas; class EditPanel : public QWidget { @@ -32,9 +33,9 @@ public: void initByWizardInfo(); void initBlockConnection(); //初始化block之间的连接信息 - void setOperateWizard(QPointer p) {_curWizard = p;} void showPreview(); //展示预览 void showConfirmDlg(); //展示确认对话框 + void showWizard(); DiagramEditorModel* getModel() {return _pModel;} EditScene* getScene() {return m_pEditScene;} @@ -42,6 +43,13 @@ public: void setProjectName(const QString& s){_projectName = s;}; QString getProjectName(){return _projectName;} + void setUuid(QUuid uid) {_uid = uid;} + QUuid getUuid() {return _uid;} + void setCavas(QPointer p){_pCavas = p;} + QPointer getCavas(){return _pCavas;} + + void prepareSaveEditor(); //准备保存 + void loadEditor(const QString&); public slots: void onWidthChanged(int width); void onContainerSizeChanged(EditContainerItem*); //容器大小改变时调整内部大小 @@ -64,11 +72,13 @@ private: int _maxHeight; QList _lstData; QMap> _mapStruct; - QPointer _curWizard; DiagramEditorModel* _pModel; DiagramEditorPreviewDlg* _pPreview; ConfirmEditorDlg* _confirmEditor; QString _projectName; + QUuid _uid; + DiagramEditorWizard* _pEditorWizard; + QPointer _pCavas; //顶层界面容器 }; #endif diff --git a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h index f5b0a7f..65a1ad9 100644 --- a/diagramCavas/include/graphicsDataModel/diagramEditorModel.h +++ b/diagramCavas/include/graphicsDataModel/diagramEditorModel.h @@ -36,8 +36,6 @@ public: void setPanel(EditPanel* p) {_pPanel = p;} EditPanel* getPanel(){return _pPanel;} void setWizard(QPointer p){_pWizard = p;} - void setCavas(QPointer p){_pCavas = p;} - QPointer getCavas(){return _pCavas;} QMap getPreviewItem(){return _previewItem;}; void generatePreview(); //生成预览 @@ -64,8 +62,14 @@ public: void clearCompoDir(QMap&,QMap&,int nSource); //清空component中的dir(updateTarget前调用) QList getRouteItemInfoList(QMap,QMap); //返回线路中包含的设备信息列表 + + QByteArray getWizardInfo(); //返回二进制wizard设置 + void setWizardInfo(const QByteArray&); //二进制设置wizard + private: void bulidAndLinkComponent(QList,QMap); //生成并连接线路上的设备 lst,mapComponents(从map中获取正确数据) + QByteArray serializeWizardData(const DiagramEditorProjectInfo &data); //序列化eidtor向导设置数据 + DiagramEditorProjectInfo deserializeWizardData(const QByteArray &byteArray); //反序列化eidtor向导设置 private: QMap _tempItem; //临时预览对象 QMap _previewItem; //预览对象 @@ -76,6 +80,5 @@ private: EditBaseScene* _pCurPreviewScene; //当前预览scene EditPanel* _pPanel; //主界面 QPointer _pWizard; //向导界面数据 - QPointer _pCavas; //顶层界面容器 }; diff --git a/diagramCavas/source/diagramCavas.cpp b/diagramCavas/source/diagramCavas.cpp index e0e83e1..ffad35b 100644 --- a/diagramCavas/source/diagramCavas.cpp +++ b/diagramCavas/source/diagramCavas.cpp @@ -13,14 +13,16 @@ #include "baseProperty.h" #include "diagramEditor/editPanel.h" #include "graphicsDataModel/diagramEditorModel.h" +#include "projectManager.h" #include "designerView.h" #include "basePropertyManager.h" +#include +#include DiagramCavas::DiagramCavas(QWidget *parent) : QMdiArea(parent) { _pageIndex = 0; - _pEditorWizard = nullptr; } DiagramCavas::~DiagramCavas() @@ -35,6 +37,13 @@ DrawingPanel* DiagramCavas::getPanel(QString sPage) return nullptr; } +EditPanel* DiagramCavas::getEditPanel(QString sPage) +{ + if(m_mapEditPanel.contains(sPage)) + return m_mapEditPanel[sPage].first; + return nullptr; +} + void DiagramCavas::initial() { //todo:读取数据并初始化 @@ -43,8 +52,6 @@ void DiagramCavas::initial() { 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) @@ -157,7 +164,6 @@ 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); @@ -168,6 +174,21 @@ void DiagramCavas::onSignal_loadPage(PowerEntity* p) } } +void DiagramCavas::onSignal_loadEdit(const QString& sProject,QUuid uid) +{ + if(!m_mapEditPanel.contains(sProject)) + { + //todo:加载数据 + onSignal_addEditWizard(sProject,uid); + m_mapEditPanel[sProject].first->loadEditor(sProject); + } + else //已存在 + { + //todo:新建或加载时删除old + m_mapEditPanel[sProject].first->show(); + } +} + void DiagramCavas::runPage(const QString sName) { QString pageName = sName+QString("_run"); @@ -365,39 +386,38 @@ void DiagramCavas::onCreateTestBaseModelDiagram() /*******************************************************/ -void DiagramCavas::onSignal_createEditPanel(QString sName) +void DiagramCavas::onSignal_createEditPanel(QString sName,QUuid uid) { - //onSignal_addEditPanel(sName); - onSignal_addEditWizard(sName); + onSignal_addEditWizard(sName,uid); +} + +void DiagramCavas::onSignal_prepareSaveEdit(QString sProject) +{ + EditPanel* pPanel = getEditPanel(sProject); + if(pPanel){ + pPanel->prepareSaveEditor(); + } } EditPanel* DiagramCavas::onSignal_addEditPanel(QString sName) { EditPanel* pPanel = new EditPanel(this); pPanel->setProjectName(sName); + _curPage = sName; pPanel->setWindowTitle(_curPage); + pPanel->setCavas(this); QMdiSubWindow* pSub = this->addSubWindow(pPanel); + m_mapEditPanel.insert(_curPage,qMakePair(pPanel,pSub)); pPanel->show(); return pPanel; } -void DiagramCavas::onSignal_addEditWizard(QString name) +void DiagramCavas::onSignal_addEditWizard(QString name,QUuid uid) { - if(_pEditorWizard == nullptr){ - _pEditorWizard = new DiagramEditorWizard(this); - connect(_pEditorWizard,&DiagramEditorWizard::wizardFinish,this,[&,name](){ - EditPanel* pPanel = onSignal_addEditPanel(name); - pPanel->setOperateWizard(_pEditorWizard); - auto pModel = pPanel->getModel(); - if(pModel){ - pModel->setWizard(_pEditorWizard); - pModel->setCavas(this); - } - pPanel->initByWizardInfo(); - }); - } - _pEditorWizard->show(); + EditPanel* pPanel = onSignal_addEditPanel(name); + pPanel->setUuid(uid); + pPanel->showWizard(); } void DiagramCavas::onSignal_wizardFinished(QString sName,QMap mapItem,QList mapBay) @@ -442,3 +462,4 @@ void DiagramCavas::onSignl_openCurrentBay() } } } + diff --git a/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp b/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp index f3edf3c..97318c8 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorBaseBlock.cpp @@ -1,4 +1,5 @@ #include "diagramEditor/diagramEditorBaseBlock.h" +#include "diagramEditor/diagramEditorStructContainer.h" DiagramEditorBaseBlock::DiagramEditorBaseBlock(QObject *parent) : QObject(parent) @@ -26,6 +27,32 @@ void DiagramEditorBaseBlock::removeConnect(QUuid uid) _lstCon.removeOne(uid); } +DiagramEditorBlockInfo DiagramEditorBaseBlock::getBlockInfo() +{ + DiagramEditorBlockInfo info; + info.sName = sName; + if(_curContainer) + info.sContainerId = _curContainer->getId(); + info.nType = nType; + info.nContainerLevel = nContainerLevel; + info.uid = uid; + info._lstCon = _lstCon; + info.recSize = recSize; + info.sceneDelta = sceneDelta; + info.bEditState = bEditState; + + info.fVoltage = fVoltage; + info.nBusType = nBusType; + info.nIndex = nIndex; + + info.nBayType = nBayType; + info.bayInfo = bayInfo; + + info.nTransType = nTransType; + info.transInfo = transInfo; + + return info; +} /***************************划分后的分段bus单元****************************/ DiagramEditorBusBlock::DiagramEditorBusBlock(QObject *parent) :DiagramEditorBaseBlock(parent) diff --git a/diagramCavas/source/diagramEditor/diagramEditorStructContainer.cpp b/diagramCavas/source/diagramEditor/diagramEditorStructContainer.cpp index 83d6864..47b3748 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorStructContainer.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorStructContainer.cpp @@ -21,3 +21,20 @@ bool DiagramEditorStructContainer::insertBlock(int nPos,DiagramEditorBaseBlock* _mapBlocks[nPos].append(p); return true; } + +QMap> DiagramEditorStructContainer::getMapBlocksData() +{ + QMap> map; + + for(auto iter = _mapBlocks.begin();iter != _mapBlocks.end();++iter){ + QList lstInfo; + for(auto pBlock:iter.value()){ + auto info = pBlock->getBlockInfo(); + lstInfo.append(info); + } + + map.insert(iter.key(),lstInfo); + } + + return map; +} diff --git a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp index 3d96c00..63cc552 100644 --- a/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp +++ b/diagramCavas/source/diagramEditor/diagramEditorWizard.cpp @@ -20,6 +20,7 @@ DiagramEditorWizard::DiagramEditorWizard(QWidget *parent) ui->setupUi(this); _busPageChanged = false; this->setWindowFlags(Qt::FramelessWindowHint | windowFlags()); + setStyleSheet("background-color: white;"); initial(); } @@ -302,6 +303,49 @@ void DiagramEditorWizard::removeConnection(QUuid uid) _mapConnect.remove(uid); } +DiagramEditorProjectInfo DiagramEditorWizard::getCurPara() +{ + DiagramEditorProjectInfo info; + + + QMap> mapLst; + for(auto iter = _mapSturctContainer.begin(); iter != _mapSturctContainer.end();++iter){ + QList lstInfo; + for(auto con:iter.value()){ + DiagramEditorContainerInfo conInfo; + conInfo.mapBlockInfo = con->getMapBlocksData(); + conInfo.sId = con->getId(); + conInfo.dMidUpY = con->getMidUpY(); + conInfo.dMidDownY = con->getMidDownY(); + conInfo.dStartX = con->getStartX(); + conInfo.dStartY = con->getStartY(); + conInfo.dWidth = con->getWidth(); + conInfo.dHeight = con->getHeight(); + conInfo.dMaxUpH = con->getMaxUpH(); + conInfo.dMaxDownH = con->getMaxDownH(); + lstInfo.append(conInfo); + } + mapLst.insert(iter.key(),lstInfo); + } + info.mapBus = _mapBus; + info.mapSturctContainer = mapLst; + info.mapConnect = _mapConnect; + return info; +} + +void DiagramEditorWizard::setPara(DiagramEditorProjectInfo info) +{ + _mapBus = info.mapBus; + + for(auto iter = info.mapSturctContainer.begin(); iter != info.mapSturctContainer.end();++iter){ + + QList lstCon; + for(auto &conInfo:iter.value()){ + + } + } +} + void DiagramEditorWizard::addTransformer(DiagramEditorWizardTransformerInfo info) { int row = ui->tableWidget_trans->rowCount(); diff --git a/diagramCavas/source/diagramEditor/editPanel.cpp b/diagramCavas/source/diagramEditor/editPanel.cpp index d56bd49..931c366 100644 --- a/diagramCavas/source/diagramEditor/editPanel.cpp +++ b/diagramCavas/source/diagramEditor/editPanel.cpp @@ -20,13 +20,14 @@ #include "graphicsDataModel/diagramEditorModel.h" #include "diagramEditor/diagramEditorPreviewDlg.h" #include "diagramEditor/confirmEditorDlg.h" +#include "projectManager.h" #include "diagramCavas.h" #include "global.h" #include EditPanel::EditPanel(QWidget *parent) : QWidget(parent) - ,_curWizard(nullptr) + ,_pEditorWizard(nullptr) ,_bayDetailSetting(nullptr) ,_transDetailSetting(nullptr) ,_pModel(nullptr) @@ -59,7 +60,7 @@ EditPanel::~EditPanel() void EditPanel::initByWizardInfo() { - auto& mapTotal = _curWizard->getContainerStruct(); + auto& mapTotal = _pEditorWizard->getContainerStruct(); for(auto iter = mapTotal.begin();iter != mapTotal.end();++iter){ if(iter.key() == g_transformerLevel) continue; @@ -225,16 +226,16 @@ void EditPanel::initByWizardInfo() void EditPanel::initBlockConnection() { - if(_curWizard){ - auto mapCon = _curWizard->getConnection(); + if(_pEditorWizard){ + auto mapCon = _pEditorWizard->getConnection(); //todo:添加过的不再添加 for(auto& con:mapCon){ int nPara = con.nPara; - auto item1 = _curWizard->getBlockByName_all(con.con1.sName); - auto item2 = _curWizard->getBlockByName_all(con.con2.sName); + auto item1 = _pEditorWizard->getBlockByName_all(con.con1.sName); + auto item2 = _pEditorWizard->getBlockByName_all(con.con2.sName); - auto con1 = _curWizard->getContainerByBlock_all(con.con1.sName); - auto con2 = _curWizard->getContainerByBlock_all(con.con2.sName); + auto con1 = _pEditorWizard->getContainerByBlock_all(con.con1.sName); + auto con2 = _pEditorWizard->getContainerByBlock_all(con.con2.sName); auto pItem1 = getItemByName(item1->getName()); auto pItem2 = getItemByName(item2->getName()); @@ -371,7 +372,7 @@ void EditPanel::showConfirmDlg() _confirmEditor->setModelDelegate(_pModel); connect(_confirmEditor,&ConfirmEditorDlg::onConfirmEditor,this,[&](QString sAuthor,QString sTime){ - auto pCavas = _pModel->getCavas(); + auto pCavas = getCavas(); if(pCavas){ //QList lstBocks; @@ -384,6 +385,12 @@ void EditPanel::showConfirmDlg() _confirmEditor->show(); } +void EditPanel::showWizard() +{ + if(_pEditorWizard) + _pEditorWizard->show(); +} + QList EditPanel::getBlockItems(EditorItemType typ) { QList lst; @@ -444,7 +451,7 @@ void EditPanel::onItemDbClicked(QPointer pBlock) if(_bayDetailSetting == nullptr){ _bayDetailSetting = new DiagramEditorBayDetailSettingDlg(this); _bayDetailSetting->setModelDelegate(_pModel); - _bayDetailSetting->setWizard(_curWizard); + _bayDetailSetting->setWizard(_pEditorWizard); } auto pBay = dynamic_cast(pBlock.data()); if(pBay) @@ -454,7 +461,7 @@ void EditPanel::onItemDbClicked(QPointer pBlock) if(_transDetailSetting == nullptr){ _transDetailSetting = new DiagramEditorTransDetailSettingDlg(this); _transDetailSetting->setModelDelegate(_pModel); - _transDetailSetting->setWizard(_curWizard); + _transDetailSetting->setWizard(_pEditorWizard); } auto pTrans = dynamic_cast(pBlock.data()); if(pTrans) @@ -473,6 +480,12 @@ void EditPanel::initial() _maxWidth = _mainWidget->rect().width(); _maxHeight = _mainWidget->rect().height(); m_pEditView->centerOn(0,0); + + _pEditorWizard = new DiagramEditorWizard(this); + connect(_pEditorWizard,&DiagramEditorWizard::wizardFinish,this,[&](){ + initByWizardInfo(); + }); + _pModel->setWizard(_pEditorWizard); } void EditPanel::calculateContainerWidth(EditContainerItem* pItem) @@ -544,3 +557,19 @@ EditBaseItem* EditPanel::getItemByName(const QString& sName) } return nullptr; } + +void EditPanel::prepareSaveEditor() +{ + if(_pModel){ + QByteArray btWizard = _pModel->getWizardInfo(); + ProjectManager::instance().saveEditorDataToDB(_uid,_projectName,_projectName,btWizard); + } +} + +void EditPanel::loadEditor(const QString& str) +{ + QByteArray byte = ProjectManager::instance().getEditorDataByName(str); + if(_pModel){ + _pModel->setWizardInfo(byte); + } +} diff --git a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp index d9b1ac6..c194350 100644 --- a/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp +++ b/diagramCavas/source/graphicsDataModel/diagramEditorModel.cpp @@ -17,6 +17,8 @@ #include "diagramEditor/editPanel.h" #include "diagramEditor/diagramEditorWizard.h" #include "diagramEditor/diagramEditorStructContainer.h" +#include +#include int g_nCompoWidth = 50; //元件默认宽度(计算布局使用) int g_nCompoHeight = 50; @@ -2303,3 +2305,34 @@ QList DiagramEditorModel::getRouteItemInfoList(QMap< } return lst; } + +QByteArray DiagramEditorModel::getWizardInfo() +{ + DiagramEditorProjectInfo wizaInfo = _pWizard->getCurPara(); + wizaInfo.sName = _pPanel->getProjectName(); + wizaInfo.uid = _pPanel->getUuid(); + QByteArray data = serializeWizardData(wizaInfo); + return data; +} + +void DiagramEditorModel::setWizardInfo(const QByteArray& btye) +{ + DiagramEditorProjectInfo info = deserializeWizardData(btye); + _pWizard->setPara(info); +} + +QByteArray DiagramEditorModel::serializeWizardData(const DiagramEditorProjectInfo &data) +{ + QByteArray byteArray; + QDataStream stream(&byteArray, QIODevice::WriteOnly); + stream << data; // 调用重载的操作符 + return byteArray; +} + +DiagramEditorProjectInfo DiagramEditorModel::deserializeWizardData(const QByteArray &byteArray) +{ + QDataStream stream(byteArray); + DiagramEditorProjectInfo data; + stream >> data; // 调用重载的操作符 + return data; +} diff --git a/diagramUtils/CMakeLists.txt b/diagramUtils/CMakeLists.txt index 1589853..c3974a2 100644 --- a/diagramUtils/CMakeLists.txt +++ b/diagramUtils/CMakeLists.txt @@ -6,6 +6,7 @@ set(DIAGRAMUTILS_HEADER_FILES include/componentIconManager.h include/basePropertyManager.h include/projectModelManager.h + include/projectManager.h ../common/include/global.h ../common/include/baseProperty.h ../common/include/compiler.hpp @@ -19,6 +20,7 @@ set(DIAGRAMUTILS_SOURCE_FILES source/dataManager.cpp source/basePropertyManager.cpp source/projectModelManager.cpp + source/projectManager.cpp source/componentIconManager.cpp ../common/source/global.cpp ../common/source/baseProperty.cpp @@ -44,7 +46,7 @@ target_link_libraries(diagramUtils PUBLIC Qt${QT_VERSION_MAJOR}::Core target_link_libraries(diagramUtils PRIVATE Qt6::Xml) target_link_libraries(diagramUtils PRIVATE Qt6::Network) -target_link_libraries(diagramUtils PRIVATE Qt6::Sql ${POSTGRESQL_LIBRARIES}) +target_link_libraries(diagramUtils PRIVATE Qt6::Sql ${PostgreSQL_LIBRARIES}) option(BUILD_SHARED_LIBS "Build as shared library" ON) diff --git a/diagramUtils/include/dataBase.h b/diagramUtils/include/dataBase.h index 6f0d578..0581530 100644 --- a/diagramUtils/include/dataBase.h +++ b/diagramUtils/include/dataBase.h @@ -132,6 +132,15 @@ public: PropertyValueInfo selectGroupPropertyByValue(const QString& tableName,QUuid uuid,PropertyValueInfo value); //通过已有结构更新数据 QList getMeasureAttributeTypes(); //获取所有量测属性 + +public: + /***********************************editor编辑器**********************************************/ + bool insertEditorProject(QUuid,QString,QString,QByteArray); + bool updateEditorProject(QString name,QByteArray context); + QByteArray getEditorProjectByName(QString name); + QList getAllEditorProject(); + bool deleteEditorProject(QString); + bool ifEditorProjectExist(QString name); private: QMap _attributeGroup; //属性组的组 QMap _dataType; //数据类型组 diff --git a/diagramUtils/include/projectManager.h b/diagramUtils/include/projectManager.h new file mode 100644 index 0000000..7c686f7 --- /dev/null +++ b/diagramUtils/include/projectManager.h @@ -0,0 +1,32 @@ +#ifndef PROJECTMANAGER_H +#define PROJECTMANAGER_H + +#include +#include "global.h" +#include "export.hpp" +/****工程管理类 + * 对工程进行管理 +*****/ + +class DIAGRAM_DESIGNER_PUBLIC ProjectManager : public QObject +{ + Q_OBJECT +public: + explicit ProjectManager(QObject *parent = nullptr); + ~ProjectManager(); + static ProjectManager& instance(); + + void saveEditorDataToDB(QUuid,const QString&,const QString&,QByteArray); + QByteArray getEditorDataByName(const QString&); + + void createEditor(const QString&); + void saveEditor(const QString&); +signals: + void createNewEditor(const QString& str,QUuid id); + void editorSaved(const QString& str,QUuid uid); + + void prepareSaveEditor(QString); +private: + QMap _wizardInfo; +}; +#endif // PROJECTMANAGER_H diff --git a/diagramUtils/source/dataBase.cpp b/diagramUtils/source/dataBase.cpp index 6763449..4ae9abf 100644 --- a/diagramUtils/source/dataBase.cpp +++ b/diagramUtils/source/dataBase.cpp @@ -2845,3 +2845,134 @@ QStringList DataBase::ifModelOccupy(const QString& sName) return lst; } } + +bool DataBase::insertEditorProject(QUuid uid,QString name,QString tag,QByteArray byte) +{ + QString strSQL = "INSERT INTO diagramui_editorprojects(global_uuid, name, tag, context) VALUES (?, ?, ?, ?)"; + + QVariantList params; + params.append(uid); + params.append(name); + params.append(tag); + params.append(byte); + try + { + executeSQL(strSQL,false,params); + return true; + } + catch (const std::exception& e) + { + LOG_ERROR("DB", QString("Insert diagramui_editorprojects fail")); + return false; + } +} + +bool DataBase::updateEditorProject(QString name,QByteArray context) +{ + QString strSQL = "UPDATE diagramui_editorprojects SET context = ? WHERE name = ?"; + QVariantList params; + params.append(context); + params.append(name); + + try + { + executeSQL(strSQL,false,params); + return true; + } + catch (const std::exception& e) + { + LOG_ERROR("DB", QString("Update diagramui_editorprojects %1 fail").arg(name)); + return false; + } +} + +QByteArray DataBase::getEditorProjectByName(QString name) +{ + QByteArray byte; + QString strSQL = "SELECT context FROM diagramui_editorprojects WHERE name = ?"; + QVariantList params; + params.append(name); + + try + { + QSqlQuery query = executeSQL(strSQL,false,params); + while (query.next()) + { + byte = query.value(0).toByteArray(); + } + query.clear(); + return byte; + } + catch (const std::exception& e) + { + return byte; + } +} + +QList DataBase::getAllEditorProject() +{ + QList lst; + QString strSQL = "SELECT id,global_uuid,name,tag,context FROM diagramui_editorprojects"; + + try + { + QSqlQuery query = executeSQL(strSQL); + while (query.next()) + { + editorProjectInfo info; + info.id = query.value(0).toInt(); + info.uuid = QUuid(query.value(1).toString()); + info.name = query.value(2).toString(); + info.tag = query.value(3).toString(); + info.context = query.value(4).toByteArray(); + + lst.append(info); + } + query.clear(); + return lst; + } + catch (const std::exception& e) + { + return lst; + } +} + +bool DataBase::deleteEditorProject(QString name) +{ + QString strSQL = "DELETE FROM diagramui_editorprojects WHERE name = ?"; + QVariantList params; + params.append(name); + + try + { + executeSQL(strSQL,false,params); + LOG_INFO("DB", QString("Delete diagramui_editorprojects %1 success").arg(name)); + return true; + } + catch (const std::exception& e) + { + LOG_INFO("DB", QString("Delete diagramui_editorprojects %1 fail").arg(name)); + return false; + } +} + +bool DataBase::ifEditorProjectExist(QString name) +{ + QString strSQL = "SELECT * FROM diagramui_editorprojects WHERE name = ?"; + QVariantList params; + params.append(name); + + try + { + QSqlQuery query = executeSQL(strSQL,false,params); + while (query.next()) + { + return true; + } + } + catch (const std::exception& e) + { + return false; + } + return false; +} diff --git a/diagramUtils/source/projectManager.cpp b/diagramUtils/source/projectManager.cpp new file mode 100644 index 0000000..c16a008 --- /dev/null +++ b/diagramUtils/source/projectManager.cpp @@ -0,0 +1,65 @@ +#include "projectManager.h" +#include "dataBase.h" +#include + +ProjectManager& ProjectManager::instance() +{ + //采用静态局部变量的方式,静态局部变量的初始化是在第一次访问时,以后的调用不会多次初始化,并且生命周期和程序一致 + static ProjectManager instance; + return instance; +} + +ProjectManager::ProjectManager(QObject *parent) + : QObject(parent) +{ + +} + +ProjectManager::~ProjectManager() +{ + +} + +void ProjectManager::saveEditorDataToDB(QUuid uid,const QString& name,const QString& tag,QByteArray byte) +{ + bool val = DataBase::GetInstance()->ifEditorProjectExist(name); + if(val) + { + bool res = DataBase::GetInstance()->updateEditorProject(name,byte); + if(res){ + emit editorSaved(name,uid); + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"更新成功")); + } + else + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"更新失败")); + } + else{ + bool res = DataBase::GetInstance()->insertEditorProject(uid,name,tag,byte); + if(res){ + emit editorSaved(name,uid); + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存成功")); + } + else + QMessageBox::information(NULL, QString("提示"), QString::fromWCharArray(L"保存失败")); + } +} + +QByteArray ProjectManager::getEditorDataByName(const QString& name) +{ + return DataBase::GetInstance()->getEditorProjectByName(name); +} + +void ProjectManager::createEditor(const QString& name) +{ + if(!_wizardInfo.contains(name)){ + QUuid uid = QUuid::createUuid(); + _wizardInfo[name].sName = name; + _wizardInfo[name].uid = uid; + emit createNewEditor(name,uid); + } +} + +void ProjectManager::saveEditor(const QString& name) +{ + emit prepareSaveEditor(name); +} diff --git a/include/createEditor.h b/include/createEditor.h index c2596f3..7f86f3d 100644 --- a/include/createEditor.h +++ b/include/createEditor.h @@ -16,8 +16,7 @@ public: void initial(); void showDlg(); -signals: - void createEditor(QString); + public slots: void onOkClicked(); void onCancelClicked(); diff --git a/include/diagramView.h b/include/diagramView.h index cd3b5a8..c9131c7 100644 --- a/include/diagramView.h +++ b/include/diagramView.h @@ -9,6 +9,8 @@ QT_BEGIN_NAMESPACE namespace Ui { class diagramView; } QT_END_NAMESPACE +class QTreeWidgetItem; + class DiagramView : public QDialog { Q_OBJECT @@ -24,16 +26,28 @@ signals: void diagramChange(DiagramInfo); void diagramDelete(DiagramInfo); void diagramSelected(DiagramInfo); + + void loadProject(); public slots: void onIndexRbtnClicked(const QPoint &pos); //索引列表右键菜单 void onItemChanged(QStandardItem *item); void onItemClicked(const QModelIndex &index); + + void onEditorRbtnClicked(const QPoint &pos); //editor右键菜单 + //**********editor************ + void onNewEditorCreated(const QString&,QUuid); + void onEditorSaved(const QString&,QUuid); + + void onNewEditorClicked(); + void onOpenEditorClicked(); + void onSaveEditorClicked(); private: Ui::diagramView *ui; QStandardItemModel* _pModel; int _count; private: QString generateName(); + int getItemLevel(QTreeWidgetItem *item); }; #endif diff --git a/include/loadPageDlg.h b/include/loadPageDlg.h index 848e7b4..becf123 100644 --- a/include/loadPageDlg.h +++ b/include/loadPageDlg.h @@ -19,7 +19,7 @@ public: void initial(); void updateList(); signals: - void selectedPage(const QString&); + void selectedProject(const QString&,QUuid); public slots: void onOkClicked(); void onCancelClicked(); diff --git a/source/createEditor.cpp b/source/createEditor.cpp index 7ed9732..a36e874 100644 --- a/source/createEditor.cpp +++ b/source/createEditor.cpp @@ -1,5 +1,6 @@ #include #include "createEditor.h" +#include "projectManager.h" #include "ui_createEditor.h" CreateEditor::CreateEditor(QWidget *parent) @@ -30,7 +31,7 @@ void CreateEditor::showDlg() void CreateEditor::onOkClicked() { - emit createEditor(ui->le_name->text()); + ProjectManager::instance().createEditor(ui->le_name->text()); hide(); } diff --git a/source/diagramView.cpp b/source/diagramView.cpp index 7473813..5fe1341 100644 --- a/source/diagramView.cpp +++ b/source/diagramView.cpp @@ -5,6 +5,7 @@ #include "ui_diagramView.h" #include "tools.h" #include "topologyManager.h" +#include "projectManager.h" #include "dataBase.h" DiagramView::DiagramView(QWidget *parent) @@ -15,6 +16,7 @@ DiagramView::DiagramView(QWidget *parent) ui->setupUi(this); _pModel = new QStandardItemModel(this); ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu); + ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu); _count = 0; } @@ -26,9 +28,17 @@ DiagramView::~DiagramView() 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); @@ -173,6 +183,84 @@ void DiagramView::onItemClicked(const QModelIndex &index) } } +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); @@ -186,3 +274,12 @@ QString DiagramView::generateName() return sName; } } + +int DiagramView::getItemLevel(QTreeWidgetItem *item) { + int level = 0; + while (item->parent()) { + level++; + item = item->parent(); + } + return level + 1; // 顶级节点为1级 +} diff --git a/source/loadPageDlg.cpp b/source/loadPageDlg.cpp index 95ba8f7..4855822 100644 --- a/source/loadPageDlg.cpp +++ b/source/loadPageDlg.cpp @@ -40,14 +40,16 @@ void LoadPageDlg::updateList() QStandardItem* itemRoot = m_standardItemModel->invisibleRootItem(); // 创建并添加Item的第一个子节点 - QStandardItem* itemPage = new QStandardItem(QStringLiteral("本站")); + QStandardItem* itemPage = new QStandardItem(QStringLiteral("项目列表")); itemRoot->appendRow(itemPage); QList pageList; - QList lst = DataBase::GetInstance()->getAllPage(); - for(auto info:lst) + auto lst = DataBase::GetInstance()->getAllEditorProject(); + for(auto &info:lst) { - pageList.append(new QStandardItem(info.name)); + QStandardItem* item = new QStandardItem(info.name); + item->setData(info.uuid); + pageList.append(item); } itemPage->appendRows(pageList); } @@ -60,7 +62,8 @@ void LoadPageDlg::onOkClicked() if(item) { _pageName = item->text(); - Q_EMIT selectedPage(_pageName); + QUuid uid = item->data().toUuid(); + Q_EMIT selectedProject(_pageName,uid); } hide(); diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index 1675343..7abb288 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -28,6 +28,8 @@ #include "diagramView.h" #include "createEditor.h" #include "projectModelManager.h" +#include "projectManager.h" +#include //using namespace ads; @@ -138,6 +140,8 @@ void CMainWindow::initializeAction() connect(m_pDiagramView,&DiagramView::diagramDelete,m_pDiagramCavas,&DiagramCavas::onSignal_deleteDiagram); connect(m_pDiagramView,&DiagramView::diagramSelected,m_pDiagramCavas,&DiagramCavas::onSignal_selectDiagram); + connect(m_pDiagramView,&DiagramView::loadProject,this,&CMainWindow::onSignal_loadPage); + connect(ui->actionNew,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onSignal_addPage); connect(ui->actionOpen,&QAction::triggered,this,&CMainWindow::onSignal_loadPage); connect(ui->actionSave,&QAction::triggered,m_pDiagramCavas,&DiagramCavas::onSignal_savePage); @@ -239,7 +243,7 @@ void CMainWindow::onSignal_loadPage() if(m_pLoadPageDlg == nullptr) { m_pLoadPageDlg = new LoadPageDlg(this); - //connect(m_pLoadPageDlg,&LoadPageDlg::selectedPage,m_pDiagramCavas,&DiagramCavas::onSignal_loadPage); + connect(m_pLoadPageDlg,&LoadPageDlg::selectedProject,m_pDiagramCavas,&DiagramCavas::onSignal_loadEdit); } m_pLoadPageDlg->updateList(); m_pLoadPageDlg->show(); @@ -249,8 +253,10 @@ void CMainWindow::onAction_createEditor() { if(m_pCreateEdiotr == nullptr){ m_pCreateEdiotr = new CreateEditor(this); - connect(m_pCreateEdiotr,&CreateEditor::createEditor,m_pDiagramCavas,&DiagramCavas::onSignal_createEditPanel); + connect(&ProjectManager::instance(),&ProjectManager::createNewEditor,m_pDiagramCavas,&DiagramCavas::onSignal_createEditPanel); + connect(&ProjectManager::instance(),&ProjectManager::prepareSaveEditor,m_pDiagramCavas,&DiagramCavas::onSignal_prepareSaveEdit); } + m_pCreateEdiotr->showDlg(); } diff --git a/ui/diagramView.ui b/ui/diagramView.ui index 4d7e168..6c2d7c4 100644 --- a/ui/diagramView.ui +++ b/ui/diagramView.ui @@ -6,7 +6,7 @@ 0 0 - 199 + 266 455 @@ -14,8 +14,77 @@ Dialog + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + - + + + + 12 + + + + 0 + + + + 基模组态 + + + + + + + + + + + 新建 + + + + + + + 打开 + + + + + + + 保存 + + + + + + + + + + 工程模组态 + + + + + + + +