123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- #pragma once
- #include "Common.h"
- #include "WindowAppUiView.h"
- // 为了处理 ValueControl 和 dll数值之间输入输出的单向同步关系增加的数据结构
- //// 存储控件链接的数值信息
- //typedef struct _tagLinkValue
- //{
- // INF_DIRECTION direction; // 数值的输入输出方向
- //
- // VALUE value; // 数值内容
- //
- //} LINK_VALUE;
- /// <summary>
- /// 管理所有UI设计页面以及对应控件的数据结构类
- /// 为了接收Event消息,从QObject集成
- /// </summary>
- 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<QString, WindowAppUiView*>& 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<QString, WindowAppUiView*> m_pAllPages;
- // 设置别名
- using UI_PAGES = QHash<QString, WindowAppUiView*>;
- // 主页
- WindowAppUiView* m_pMainPage;
- // 所有控件与对应的UI界面指针对应关系
- QHash<QWidget*, WindowAppUiView*> m_AllControls;
- //===============================================================
- // 同步相关代码
- // Dll中的控件 - UI中的控件对应关系
- QHash<QWidget*, QWidget*> m_DllToUiControls;
- // UI中的控件 - Dll中的控件的对应关系
- QHash<QWidget*, QWidget*> m_UiToDllControls;
- // UI中的控件 - Runtime中的控件对应关系
- QHash<QWidget*, QWidget*> m_UiToRtControls;
- // Runtime中的控件 - UI中的控件对应关系
- QHash<QWidget*, QWidget*> m_RtToUiControls;
- // Value数值 - UI中的控件对应关系(一对多)
- QMultiHash<VARIABLE*, QWidget*> m_ValueToUiControls;
- // UI中的控件 - Value数值对应关系
- QHash<QWidget*, VARIABLE*> m_UiControlToValues;
- // 硬件Value - UI中的控件对应关系(一对多)
- };
|