#pragma once #include "Common.h" #include "WindowAppUiView.h" // 为了处理 ValueControl 和 dll数值之间输入输出的单向同步关系增加的数据结构 //// 存储控件链接的数值信息 //typedef struct _tagLinkValue //{ // INF_DIRECTION direction; // 数值的输入输出方向 // // VALUE value; // 数值内容 // //} LINK_VALUE; /// /// 管理所有UI设计页面以及对应控件的数据结构类 /// 为了接收Event消息,从QObject集成 /// class WindowAppUiView; class VControlObject; class UiManager : public QObject { Q_OBJECT public: UiManager(); // 注册新的UI页面 void registerNewUi(WindowAppUiView* pView); // 删除指定页面(此处需要检查是否删除的是主页) bool deleteUi(const QString& strName, bool bForce = false); // 注册新的控件 void regiterNewControl(VControlObject* pNewControl, WindowAppUiView* pView); // 删除一个控件 void deleteControl(QWidget* pDelControl); // 获取所有的Ui名称 QStringList getAllUiNames(); // 获取指定名字的页面 WindowAppUiView* getPageByName(const QString& strName); // 检查各个页面中携带的属性是否正确有效 bool checkAll(); // 发布所有页面到Runtime执行 bool publishAll(); // 设定主页 bool setMainPage(const QString& strName); // 获取主页 WindowAppUiView* getMainPage(); //// 获取所有页面列表(序列化时使用) //const QHash& getAllPages() const; // 序列化所有的WindowAppUiViewW* bool serialized(QDataStream& out); //// 反序列化所有的WindowAppUiViewW* //bool deserialized(QDataStream& in); // 重置所有UI页面以及数据结构(用于反序列化使用) void reset(); // 2022-2-12 根据控件指针查找对应的WindowAppUiView指针 WindowAppUiView* getViewByControl(VControlObject* pUiControl); // 刷新指定控件的选中效果(用于适配geometry的实时更新) void refreshControlDrawPoint(VControlObject* pUiControl); //=============================================================== // 同步相关代码 // 绑定dll中的控件与UI控件用于同步 void bindDllControlWithUiControl(QWidget* pDllControl, VControlObject* pUiControl); // 2022-9-13,解除dll中的控件与UI控件的绑定 void unbindDllControlWithUiControl(QWidget* pDllControl, VControlObject* pUiControl); // 绑定UI控件与Runtime控件用于同步 void bindUiControlWithRtControl(QWidget* pUiControl, QWidget* pRtControl); // 2022-9-13,解除UI控件与Runtime控件的绑定 void unbindUiControlWithRtControl(QWidget* pUiControl, QWidget* pRtControl); // 绑定数值变量与UI控件用于同步 void bindValueWithUiControl(VARIABLE* val, QWidget* pUiControl); // 2022-9-13,解绑数值变量与UI控件(在控件变更了主索引绑定变量时,需要做解绑动作) void unbindValueWithUiControl(VARIABLE* val, QWidget* pUiControl); // 绑定DataLink中的信息用于后续同步(仅 UI->Dll) bool bindDataLinkSyncInformation(const DataLink& dataLink, VControlObject* pVControl); // 2022-9-13,解绑DataLine信息(在控件变更了主索引绑定变量时,需要做解绑动作) bool unbindDataLinkSyncInformation(const DataLink& dataLink, VControlObject* pVControl); // 绑定dll中的控件信息用于后续同步(控件类型) bool bindSyncByControl(TOOL* pTool, _INTERFACE* pDllInf, VControlObject* pVControl); // 2022-9-13 解绑dll中的控件信息(控件类型) bool unbindSyncByControl(TOOL* pTool, _INTERFACE* pDllInf, VControlObject* pVControl); // 绑定dll中的信息用于后续同步(数值类型) bool bindSyncByValue(TOOL* pTool, _INTERFACE* pDllInf, VControlObject* pVControl); // 2022-9-13 解绑dll中的信息(数值类型) bool unbindSyncByValue(TOOL* pTool, _INTERFACE* pDllInf, VControlObject* pVControl); // 绑定dll中的信息用于后续同步(复杂类型,暂未绑定,仅引用计数 + 1) bool bindSyncByComplex(TOOL* pTool, _INTERFACE* pDllInf); // 2022-9-13 解绑dll中的信息(复杂类型,暂未绑定,仅引用计数 - 1) bool unbindSyncByComplex(TOOL* pTool, _INTERFACE* pDllInf); // 还原反序列化中控件的DataLink关系(简单控件) bool restoreDataLinks(const CONTROL_PROPERTY& prop, VControlObject* pUiControl); // 还原反序列化中控件的DataLink关系(复杂控件) bool restoreDataLinks(const CONTROL_PROPERTY_EX& propex, VControlObject* pUiControl); // 用于Dll中的控件事件触发回调(dll中的控件向UI界面同步) void syncFromDll(QWidget* pWidget, UI_SYNC_MSG msg); // 用于UI界面向Dll中的控件同步 void syncToDll(QWidget* pControl, UI_SYNC_MSG msg); // 用于Runtime界面向UI中的控件同步 void syncFromRuntime(QWidget* pControl, UI_SYNC_MSG msg); // 用于UI向Runtime界面中的控件同步 void syncToRuntime(QWidget* pControl, UI_SYNC_MSG msg, bool bFirst = false); //// 用于数值变更触发回调(只有ValueControl可以关联数值) //void syncFromValue(void* pValue, VALUE_TYPE type); // 用于数值变更触发回调(只有ValueControl可以关联数值) void syncFromValue(VARIABLE* pInf); // 用于UI变更向数值单向同步 void syncToValue(QWidget* pControl); // 刚绑定时,从dll向UI做一次同步 void syncFromDllFirst(QWidget* pDllControl, VControlObject* pUiControl); //// 刚绑定时,从value向UI做一次同步 //void syncFromValueFirst(VALUE& value); // 2022-2-10 从DataLink中解析Tool信息 void parsePouToolFromDataLink( const DataLink& dataLink, POU*& pPou, TOOL*& pTool, _INTERFACE*& pDllInf ); // 2022-2-10 从DataLink中解析Interface信息 void parseToolInfFromDataLink( const DataLink& dataLink, _INTERFACE*& pDllInf ); protected: // 同步的模式(用于方便记录日志使用) enum class SYNC_MODE : short { FROM_DLL, TO_DLL, FROM_RUNTIME, TO_RUNTIME, FROM_VALUE, TO_VALUE }; // 同步Edit控件 bool syncEditControl(QLineEdit* pSrc, QLineEdit* pDst, SYNC_MODE mode, bool bFirst = false); // 同步Combo控件 bool syncComboControl(QComboBox* pSrc, QComboBox* pDst, SYNC_MODE mode, bool bFirst = false); // 同步list控件 bool syncListControl(QListWidget* pSrc, QListWidget* pDst, SYNC_MODE mode, bool bFirst = false); // 同步radio控件 // 同步check控件 // 同步Value Control(控件) bool syncValueControl(QLineEdit* pSrc, QLineEdit* pDst, SYNC_MODE mode); // 同步Value Control(数值) bool syncValueControl(QWidget* pValueControl, QString strNewValue, VALUE_TYPE type, SYNC_MODE mode); //// 删除所有UI //void deleteAllUIs(); protected slots: // 接收来自其他控件和变量的同步Event virtual void customEvent(QEvent* event) override; protected: // 存储 页面名称 - 页面指针 对应关系 QMap m_pAllPages; // 设置别名 using UI_PAGES = QHash; // 主页 WindowAppUiView* m_pMainPage; // 所有控件与对应的UI界面指针对应关系 QHash m_AllControls; //=============================================================== // 同步相关代码 // Dll中的控件 - UI中的控件对应关系 QHash m_DllToUiControls; // UI中的控件 - Dll中的控件的对应关系 QHash m_UiToDllControls; // UI中的控件 - Runtime中的控件对应关系 QHash m_UiToRtControls; // Runtime中的控件 - UI中的控件对应关系 QHash m_RtToUiControls; // Value数值 - UI中的控件对应关系(一对多) QMultiHash m_ValueToUiControls; // UI中的控件 - Value数值对应关系 QHash m_UiControlToValues; // 硬件Value - UI中的控件对应关系(一对多) };