VPCommand.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. #pragma once
  2. #include <QStack>
  3. #include "../common/DataStructure.h"
  4. class POU;
  5. class WindowAppPouScene;
  6. class WindowAppBlockBase;
  7. class WindowAppUiScene;
  8. class WindowAppUiView;
  9. //===========================================================
  10. // 按照Command设计模式设计的用于执行系统中Undo和Redo操作的类
  11. // 目前可用于Pou和UI界面的部分操作
  12. /// <summary>
  13. /// 定义系统操作的虚基类
  14. /// </summary>
  15. class VPCommand
  16. {
  17. public:
  18. // 执行本命令(接口)
  19. virtual void redo() = 0;
  20. // 撤销(接口)
  21. virtual void undo() = 0;
  22. };
  23. //=======================================================================================
  24. //
  25. // VPCommand - POU的功能块操作相关
  26. //
  27. //=======================================================================================
  28. /// <summary>
  29. /// Pou中添加工具的操作
  30. /// </summary>
  31. class PouToolAddCommand : public VPCommand
  32. {
  33. public:
  34. // 生成Pou中的工具添加命令,并保存相关信息(注意Tool需要复制一份出来,做深度拷贝)
  35. PouToolAddCommand(WindowAppPouScene* pScene, const STATIC_TOOL* toolInfo, QPointF toolPos);
  36. // 执行Pou添加工具命令
  37. virtual void redo();
  38. // 撤销(删除此Tool)
  39. virtual void undo();
  40. protected:
  41. // 添加的工具所在的PouSence指针
  42. WindowAppPouScene* m_pPouScene;
  43. // 本次添加的工具信息(STATIC_TOOl原始信息)
  44. STATIC_TOOL m_toolInfo;
  45. // 工具的实例名
  46. QString m_strToolInstName;
  47. // 本次添加的工具所在的位置
  48. QPointF m_toolPos;
  49. };
  50. /// <summary>
  51. /// Pou中删除工具的操作
  52. /// </summary>
  53. class PouToolDelCommand : public VPCommand
  54. {
  55. public:
  56. // 生成Pou中的工具删除命令,并保存相关信息(从TOOL取出基本信息进行保存)
  57. PouToolDelCommand(WindowAppPouScene* pScene, const TOOL* tool, QPointF toolPos);
  58. // 执行本命令(删除此Tool)
  59. virtual void redo();
  60. // 撤销(重新添加Tool)
  61. virtual void undo();
  62. protected:
  63. // 添加的工具所在的PouSence指针
  64. WindowAppPouScene* m_pPouScene;
  65. // 本次删除的工具信息(仅保留STATIC_TOOl原始信息用于重新创建工具,其余的丢弃)
  66. STATIC_TOOL m_toolInfo;
  67. // 工具的实例名
  68. QString m_strToolInstName;
  69. // 本次删除的工具所在的位置
  70. QPointF m_toolPos;
  71. };
  72. /// <summary>
  73. /// Pou中移动工具的操作
  74. /// </summary>
  75. class PouToolMoveCommand : public VPCommand
  76. {
  77. public:
  78. // 这里需要保存Pou指针以及对应的功能块的实例名,因为工具是有可能被删除之后重建的
  79. PouToolMoveCommand(POU* pou, const QString& strToolInstName, const QPointF& oldPos, const QPointF& newPos);
  80. // 执行本命令
  81. virtual void redo();
  82. // 撤销(移动到旧位置)
  83. virtual void undo();
  84. protected:
  85. // 本操作对应的Pou(用于执行移动)
  86. POU* m_Pou;
  87. // 工具的实例名
  88. QString m_strToolInstName;
  89. // 旧位置
  90. QPointF m_oldPos;
  91. // 新位置
  92. QPointF m_newPos;
  93. };
  94. //=======================================================================================
  95. //
  96. // VPCommand - UI中的控件操作相关
  97. //
  98. //=======================================================================================
  99. /// <summary>
  100. /// UI中添加控件的操作
  101. /// </summary>
  102. class UiControlAddCommand : public VPCommand
  103. {
  104. public:
  105. // 生成UI中的控件添加命令,并保存相关信息
  106. UiControlAddCommand(WindowAppUiScene* pUiScene, VALUE_TYPE controlType, QPoint pos);
  107. // 执行UI添加控件命令
  108. virtual void redo();
  109. // 撤销(删除此控件)
  110. virtual void undo();
  111. protected:
  112. // UI的Scene指针
  113. WindowAppUiScene* m_pUiScene;
  114. // 本次操作的控件ID号
  115. QString m_strControlID;
  116. // 本次操作的控件类型
  117. VALUE_TYPE m_controlType;
  118. // 控件所在的位置
  119. QPoint m_pos;
  120. };
  121. /// <summary>
  122. /// UI中删除控件的操作
  123. /// </summary>
  124. class UiControlDelCommand : public VPCommand
  125. {
  126. public:
  127. // 生成UI中的控件删除命令,并保存相关信息
  128. // NOTICE:(此处需要保存控件尺寸信息,否则下次恢复删除的时候无法直接恢复原始尺寸)
  129. UiControlDelCommand(WindowAppUiScene* pScene, VALUE_TYPE controlType, const QString strID, QPoint pos, QSize size);
  130. // 执行UI删除控件命令
  131. virtual void redo();
  132. // 撤销(重新添加此控件)
  133. virtual void undo();
  134. protected:
  135. // UI的Scene指针
  136. WindowAppUiScene* m_pUiScene;
  137. // 本次操作的控件ID号
  138. QString m_strControlID;
  139. // 本次操作的控件类型
  140. VALUE_TYPE m_controlType;
  141. // 控件所在的位置
  142. QPoint m_pos;
  143. // 控件的原始尺寸
  144. QSize m_size;
  145. };
  146. /// <summary>
  147. /// UI中缩放控件的操作
  148. /// </summary>
  149. class UiControlZoomCommand : public VPCommand
  150. {
  151. public:
  152. // 生成UI中的控件缩放命令,并保存相关信息
  153. UiControlZoomCommand(WindowAppUiScene* pUiScene, const QString strID, const QRect& oldGeometry, const QRect& newGeometry);
  154. // 执行UI缩放控件命令(缩放到新尺寸)
  155. virtual void redo();
  156. // 撤销(还原到旧尺寸)
  157. virtual void undo();
  158. protected:
  159. // UI的Scene指针
  160. WindowAppUiScene* m_pUiScene;
  161. // 本次操作的控件ID号
  162. QString m_strControlID;
  163. // 旧尺寸
  164. QRect m_oldGeometry;
  165. // 新尺寸
  166. QRect m_newGeometry;
  167. };
  168. /// <summary>
  169. /// UI中移动控件的操作
  170. /// </summary>
  171. class UiControlMoveCommand : public VPCommand
  172. {
  173. public:
  174. // 生成UI中的控件移动命令,并保存相关信息
  175. UiControlMoveCommand(WindowAppUiScene* pUiScene, const QString strID, const QPoint& oldPos, const QPoint& newPos);
  176. // 执行UI移动控件命令(移动到新位置)
  177. virtual void redo();
  178. // 撤销(移动到旧位置)
  179. virtual void undo();
  180. protected:
  181. // UI的Scene指针
  182. WindowAppUiScene* m_pUiScene;
  183. // 本次操作的控件ID号
  184. QString m_strControlID;
  185. // 旧位置
  186. QPoint m_oldPos;
  187. // 新位置
  188. QPoint m_newPos;
  189. };
  190. //=======================================================================================
  191. //
  192. // VPCommandManager
  193. //
  194. //=======================================================================================
  195. /// <summary>
  196. /// 管理Undo和Redo堆栈的管理器
  197. /// </summary>
  198. class VPCommandManager
  199. {
  200. public:
  201. // 执行指定命令,并将命令入栈
  202. // bLogOnly参数的含义是只入栈,但不执行(因为在外部已经执行过了)
  203. void executeCommand(VPCommand* command, bool bLogOnly = false)
  204. {
  205. if (!bLogOnly)
  206. {
  207. command->redo();
  208. }
  209. undoCommands.push(command);
  210. // 如果有新的命令被执行了,则直接清空所有Redo堆栈
  211. if (!redoCommands.isEmpty())
  212. {
  213. redoCommands.clear();
  214. }
  215. }
  216. // 执行Undo,将命令从undo栈弹出,加入Redo栈
  217. void undo()
  218. {
  219. if (!undoCommands.isEmpty())
  220. {
  221. VPCommand* command = undoCommands.pop();
  222. command->undo();
  223. redoCommands.push(command);
  224. }
  225. }
  226. // 执行Redo,将命令从redo栈弹出,然后重新执行一次
  227. void redo()
  228. {
  229. if (!redoCommands.isEmpty())
  230. {
  231. VPCommand* command = redoCommands.pop();
  232. command->redo();
  233. undoCommands.push(command);
  234. }
  235. }
  236. // 是否可以执行Undo(用于显示菜单状态)
  237. bool canUndo()
  238. {
  239. return !(undoCommands.isEmpty());
  240. }
  241. // 是否可以执行Redo(用于显示菜单状态)
  242. bool canRedo()
  243. {
  244. return !(redoCommands.isEmpty());
  245. }
  246. private:
  247. // Undo堆栈
  248. QStack<VPCommand*> undoCommands;
  249. // Redo堆栈
  250. QStack<VPCommand*> redoCommands;
  251. };