UiManager.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #pragma once
  2. #include "Common.h"
  3. #include "WindowAppUiView.h"
  4. // 为了处理 ValueControl 和 dll数值之间输入输出的单向同步关系增加的数据结构
  5. //// 存储控件链接的数值信息
  6. //typedef struct _tagLinkValue
  7. //{
  8. // INF_DIRECTION direction; // 数值的输入输出方向
  9. //
  10. // VALUE value; // 数值内容
  11. //
  12. //} LINK_VALUE;
  13. /// <summary>
  14. /// 管理所有UI设计页面以及对应控件的数据结构类
  15. /// 为了接收Event消息,从QObject集成
  16. /// </summary>
  17. class WindowAppUiView;
  18. class VControlObject;
  19. class UiManager : public QObject
  20. {
  21. Q_OBJECT
  22. public:
  23. UiManager();
  24. // 注册新的UI页面
  25. void registerNewUi(WindowAppUiView* pView);
  26. // 删除指定页面(此处需要检查是否删除的是主页)
  27. bool deleteUi(const QString& strName, bool bForce = false);
  28. // 注册新的控件
  29. void regiterNewControl(VControlObject* pNewControl, WindowAppUiView* pView);
  30. // 删除一个控件
  31. void deleteControl(QWidget* pDelControl);
  32. // 获取所有的Ui名称
  33. QStringList getAllUiNames();
  34. // 获取指定名字的页面
  35. WindowAppUiView* getPageByName(const QString& strName);
  36. // 检查各个页面中携带的属性是否正确有效
  37. bool checkAll();
  38. // 发布所有页面到Runtime执行
  39. bool publishAll();
  40. // 设定主页
  41. bool setMainPage(const QString& strName);
  42. // 获取主页
  43. WindowAppUiView* getMainPage();
  44. //// 获取所有页面列表(序列化时使用)
  45. //const QHash<QString, WindowAppUiView*>& getAllPages() const;
  46. // 序列化所有的WindowAppUiViewW*
  47. bool serialized(QDataStream& out);
  48. //// 反序列化所有的WindowAppUiViewW*
  49. //bool deserialized(QDataStream& in);
  50. // 重置所有UI页面以及数据结构(用于反序列化使用)
  51. void reset();
  52. // 2022-2-12 根据控件指针查找对应的WindowAppUiView指针
  53. WindowAppUiView* getViewByControl(VControlObject* pUiControl);
  54. // 刷新指定控件的选中效果(用于适配geometry的实时更新)
  55. void refreshControlDrawPoint(VControlObject* pUiControl);
  56. //===============================================================
  57. // 同步相关代码
  58. // 绑定dll中的控件与UI控件用于同步
  59. void bindDllControlWithUiControl(QWidget* pDllControl, VControlObject* pUiControl);
  60. // 2022-9-13,解除dll中的控件与UI控件的绑定
  61. void unbindDllControlWithUiControl(QWidget* pDllControl, VControlObject* pUiControl);
  62. // 绑定UI控件与Runtime控件用于同步
  63. void bindUiControlWithRtControl(QWidget* pUiControl, QWidget* pRtControl);
  64. // 2022-9-13,解除UI控件与Runtime控件的绑定
  65. void unbindUiControlWithRtControl(QWidget* pUiControl, QWidget* pRtControl);
  66. // 绑定数值变量与UI控件用于同步
  67. void bindValueWithUiControl(VARIABLE* val, QWidget* pUiControl);
  68. // 2022-9-13,解绑数值变量与UI控件(在控件变更了主索引绑定变量时,需要做解绑动作)
  69. void unbindValueWithUiControl(VARIABLE* val, QWidget* pUiControl);
  70. // 绑定DataLink中的信息用于后续同步(仅 UI->Dll)
  71. bool bindDataLinkSyncInformation(const DataLink& dataLink, VControlObject* pVControl);
  72. // 2022-9-13,解绑DataLine信息(在控件变更了主索引绑定变量时,需要做解绑动作)
  73. bool unbindDataLinkSyncInformation(const DataLink& dataLink, VControlObject* pVControl);
  74. // 绑定dll中的控件信息用于后续同步(控件类型)
  75. bool bindSyncByControl(TOOL* pTool, _INTERFACE* pDllInf, VControlObject* pVControl);
  76. // 2022-9-13 解绑dll中的控件信息(控件类型)
  77. bool unbindSyncByControl(TOOL* pTool, _INTERFACE* pDllInf, VControlObject* pVControl);
  78. // 绑定dll中的信息用于后续同步(数值类型)
  79. bool bindSyncByValue(TOOL* pTool, _INTERFACE* pDllInf, VControlObject* pVControl);
  80. // 2022-9-13 解绑dll中的信息(数值类型)
  81. bool unbindSyncByValue(TOOL* pTool, _INTERFACE* pDllInf, VControlObject* pVControl);
  82. // 绑定dll中的信息用于后续同步(复杂类型,暂未绑定,仅引用计数 + 1)
  83. bool bindSyncByComplex(TOOL* pTool, _INTERFACE* pDllInf);
  84. // 2022-9-13 解绑dll中的信息(复杂类型,暂未绑定,仅引用计数 - 1)
  85. bool unbindSyncByComplex(TOOL* pTool, _INTERFACE* pDllInf);
  86. // 还原反序列化中控件的DataLink关系(简单控件)
  87. bool restoreDataLinks(const CONTROL_PROPERTY& prop, VControlObject* pUiControl);
  88. // 还原反序列化中控件的DataLink关系(复杂控件)
  89. bool restoreDataLinks(const CONTROL_PROPERTY_EX& propex, VControlObject* pUiControl);
  90. // 用于Dll中的控件事件触发回调(dll中的控件向UI界面同步)
  91. void syncFromDll(QWidget* pWidget, UI_SYNC_MSG msg);
  92. // 用于UI界面向Dll中的控件同步
  93. void syncToDll(QWidget* pControl, UI_SYNC_MSG msg);
  94. // 用于Runtime界面向UI中的控件同步
  95. void syncFromRuntime(QWidget* pControl, UI_SYNC_MSG msg);
  96. // 用于UI向Runtime界面中的控件同步
  97. void syncToRuntime(QWidget* pControl, UI_SYNC_MSG msg, bool bFirst = false);
  98. //// 用于数值变更触发回调(只有ValueControl可以关联数值)
  99. //void syncFromValue(void* pValue, VALUE_TYPE type);
  100. // 用于数值变更触发回调(只有ValueControl可以关联数值)
  101. void syncFromValue(VARIABLE* pInf);
  102. // 用于UI变更向数值单向同步
  103. void syncToValue(QWidget* pControl);
  104. // 刚绑定时,从dll向UI做一次同步
  105. void syncFromDllFirst(QWidget* pDllControl, VControlObject* pUiControl);
  106. //// 刚绑定时,从value向UI做一次同步
  107. //void syncFromValueFirst(VALUE& value);
  108. // 2022-2-10 从DataLink中解析Tool信息
  109. void parsePouToolFromDataLink(
  110. const DataLink& dataLink,
  111. POU*& pPou,
  112. TOOL*& pTool,
  113. _INTERFACE*& pDllInf
  114. );
  115. // 2022-2-10 从DataLink中解析Interface信息
  116. void parseToolInfFromDataLink(
  117. const DataLink& dataLink,
  118. _INTERFACE*& pDllInf
  119. );
  120. protected:
  121. // 同步的模式(用于方便记录日志使用)
  122. enum class SYNC_MODE : short
  123. {
  124. FROM_DLL,
  125. TO_DLL,
  126. FROM_RUNTIME,
  127. TO_RUNTIME,
  128. FROM_VALUE,
  129. TO_VALUE
  130. };
  131. // 同步Edit控件
  132. bool syncEditControl(QLineEdit* pSrc, QLineEdit* pDst, SYNC_MODE mode, bool bFirst = false);
  133. // 同步Combo控件
  134. bool syncComboControl(QComboBox* pSrc, QComboBox* pDst, SYNC_MODE mode, bool bFirst = false);
  135. // 同步list控件
  136. bool syncListControl(QListWidget* pSrc, QListWidget* pDst, SYNC_MODE mode, bool bFirst = false);
  137. // 同步radio控件
  138. // 同步check控件
  139. // 同步Value Control(控件)
  140. bool syncValueControl(QLineEdit* pSrc, QLineEdit* pDst, SYNC_MODE mode);
  141. // 同步Value Control(数值)
  142. bool syncValueControl(QWidget* pValueControl, QString strNewValue, VALUE_TYPE type, SYNC_MODE mode);
  143. //// 删除所有UI
  144. //void deleteAllUIs();
  145. protected slots:
  146. // 接收来自其他控件和变量的同步Event
  147. virtual void customEvent(QEvent* event) override;
  148. protected:
  149. // 存储 页面名称 - 页面指针 对应关系
  150. QMap<QString, WindowAppUiView*> m_pAllPages;
  151. // 设置别名
  152. using UI_PAGES = QHash<QString, WindowAppUiView*>;
  153. // 主页
  154. WindowAppUiView* m_pMainPage;
  155. // 所有控件与对应的UI界面指针对应关系
  156. QHash<QWidget*, WindowAppUiView*> m_AllControls;
  157. //===============================================================
  158. // 同步相关代码
  159. // Dll中的控件 - UI中的控件对应关系
  160. QHash<QWidget*, QWidget*> m_DllToUiControls;
  161. // UI中的控件 - Dll中的控件的对应关系
  162. QHash<QWidget*, QWidget*> m_UiToDllControls;
  163. // UI中的控件 - Runtime中的控件对应关系
  164. QHash<QWidget*, QWidget*> m_UiToRtControls;
  165. // Runtime中的控件 - UI中的控件对应关系
  166. QHash<QWidget*, QWidget*> m_RtToUiControls;
  167. // Value数值 - UI中的控件对应关系(一对多)
  168. QMultiHash<VARIABLE*, QWidget*> m_ValueToUiControls;
  169. // UI中的控件 - Value数值对应关系
  170. QHash<QWidget*, VARIABLE*> m_UiControlToValues;
  171. // 硬件Value - UI中的控件对应关系(一对多)
  172. };