123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340 |
- #pragma once
- #include <QStack>
- #include "../common/DataStructure.h"
- class POU;
- class WindowAppPouScene;
- class WindowAppBlockBase;
- class WindowAppUiScene;
- class WindowAppUiView;
- //===========================================================
- // 按照Command设计模式设计的用于执行系统中Undo和Redo操作的类
- // 目前可用于Pou和UI界面的部分操作
- /// <summary>
- /// 定义系统操作的虚基类
- /// </summary>
- class VPCommand
- {
- public:
- // 执行本命令(接口)
- virtual void redo() = 0;
- // 撤销(接口)
- virtual void undo() = 0;
- };
- //=======================================================================================
- //
- // VPCommand - POU的功能块操作相关
- //
- //=======================================================================================
- /// <summary>
- /// Pou中添加工具的操作
- /// </summary>
- class PouToolAddCommand : public VPCommand
- {
- public:
- // 生成Pou中的工具添加命令,并保存相关信息(注意Tool需要复制一份出来,做深度拷贝)
- PouToolAddCommand(WindowAppPouScene* pScene, const STATIC_TOOL* toolInfo, QPointF toolPos);
- // 执行Pou添加工具命令
- virtual void redo();
- // 撤销(删除此Tool)
- virtual void undo();
- protected:
- // 添加的工具所在的PouSence指针
- WindowAppPouScene* m_pPouScene;
- // 本次添加的工具信息(STATIC_TOOl原始信息)
- STATIC_TOOL m_toolInfo;
- // 工具的实例名
- QString m_strToolInstName;
- // 本次添加的工具所在的位置
- QPointF m_toolPos;
- };
- /// <summary>
- /// Pou中删除工具的操作
- /// </summary>
- class PouToolDelCommand : public VPCommand
- {
- public:
- // 生成Pou中的工具删除命令,并保存相关信息(从TOOL取出基本信息进行保存)
- PouToolDelCommand(WindowAppPouScene* pScene, const TOOL* tool, QPointF toolPos);
- // 执行本命令(删除此Tool)
- virtual void redo();
- // 撤销(重新添加Tool)
- virtual void undo();
- protected:
- // 添加的工具所在的PouSence指针
- WindowAppPouScene* m_pPouScene;
- // 本次删除的工具信息(仅保留STATIC_TOOl原始信息用于重新创建工具,其余的丢弃)
- STATIC_TOOL m_toolInfo;
- // 工具的实例名
- QString m_strToolInstName;
- // 本次删除的工具所在的位置
- QPointF m_toolPos;
- };
- /// <summary>
- /// Pou中移动工具的操作
- /// </summary>
- class PouToolMoveCommand : public VPCommand
- {
- public:
- // 这里需要保存Pou指针以及对应的功能块的实例名,因为工具是有可能被删除之后重建的
- PouToolMoveCommand(POU* pou, const QString& strToolInstName, const QPointF& oldPos, const QPointF& newPos);
- // 执行本命令
- virtual void redo();
- // 撤销(移动到旧位置)
- virtual void undo();
-
- protected:
- // 本操作对应的Pou(用于执行移动)
- POU* m_Pou;
- // 工具的实例名
- QString m_strToolInstName;
- // 旧位置
- QPointF m_oldPos;
- // 新位置
- QPointF m_newPos;
- };
- //=======================================================================================
- //
- // VPCommand - UI中的控件操作相关
- //
- //=======================================================================================
- /// <summary>
- /// UI中添加控件的操作
- /// </summary>
- class UiControlAddCommand : public VPCommand
- {
- public:
- // 生成UI中的控件添加命令,并保存相关信息
- UiControlAddCommand(WindowAppUiScene* pUiScene, VALUE_TYPE controlType, QPoint pos);
- // 执行UI添加控件命令
- virtual void redo();
- // 撤销(删除此控件)
- virtual void undo();
- protected:
- // UI的Scene指针
- WindowAppUiScene* m_pUiScene;
- // 本次操作的控件ID号
- QString m_strControlID;
- // 本次操作的控件类型
- VALUE_TYPE m_controlType;
- // 控件所在的位置
- QPoint m_pos;
- };
- /// <summary>
- /// UI中删除控件的操作
- /// </summary>
- class UiControlDelCommand : public VPCommand
- {
- public:
- // 生成UI中的控件删除命令,并保存相关信息
- // NOTICE:(此处需要保存控件尺寸信息,否则下次恢复删除的时候无法直接恢复原始尺寸)
- UiControlDelCommand(WindowAppUiScene* pScene, VALUE_TYPE controlType, const QString strID, QPoint pos, QSize size);
- // 执行UI删除控件命令
- virtual void redo();
- // 撤销(重新添加此控件)
- virtual void undo();
- protected:
- // UI的Scene指针
- WindowAppUiScene* m_pUiScene;
- // 本次操作的控件ID号
- QString m_strControlID;
- // 本次操作的控件类型
- VALUE_TYPE m_controlType;
- // 控件所在的位置
- QPoint m_pos;
- // 控件的原始尺寸
- QSize m_size;
- };
- /// <summary>
- /// UI中缩放控件的操作
- /// </summary>
- class UiControlZoomCommand : public VPCommand
- {
- public:
- // 生成UI中的控件缩放命令,并保存相关信息
- UiControlZoomCommand(WindowAppUiScene* pUiScene, const QString strID, const QRect& oldGeometry, const QRect& newGeometry);
- // 执行UI缩放控件命令(缩放到新尺寸)
- virtual void redo();
- // 撤销(还原到旧尺寸)
- virtual void undo();
- protected:
- // UI的Scene指针
- WindowAppUiScene* m_pUiScene;
- // 本次操作的控件ID号
- QString m_strControlID;
- // 旧尺寸
- QRect m_oldGeometry;
- // 新尺寸
- QRect m_newGeometry;
- };
- /// <summary>
- /// UI中移动控件的操作
- /// </summary>
- class UiControlMoveCommand : public VPCommand
- {
- public:
- // 生成UI中的控件移动命令,并保存相关信息
- UiControlMoveCommand(WindowAppUiScene* pUiScene, const QString strID, const QPoint& oldPos, const QPoint& newPos);
- // 执行UI移动控件命令(移动到新位置)
- virtual void redo();
- // 撤销(移动到旧位置)
- virtual void undo();
- protected:
- // UI的Scene指针
- WindowAppUiScene* m_pUiScene;
- // 本次操作的控件ID号
- QString m_strControlID;
- // 旧位置
- QPoint m_oldPos;
- // 新位置
- QPoint m_newPos;
- };
- //=======================================================================================
- //
- // VPCommandManager
- //
- //=======================================================================================
- /// <summary>
- /// 管理Undo和Redo堆栈的管理器
- /// </summary>
- class VPCommandManager
- {
- public:
- // 执行指定命令,并将命令入栈
- // bLogOnly参数的含义是只入栈,但不执行(因为在外部已经执行过了)
- void executeCommand(VPCommand* command, bool bLogOnly = false)
- {
- if (!bLogOnly)
- {
- command->redo();
- }
-
- undoCommands.push(command);
- // 如果有新的命令被执行了,则直接清空所有Redo堆栈
- if (!redoCommands.isEmpty())
- {
- redoCommands.clear();
- }
- }
- // 执行Undo,将命令从undo栈弹出,加入Redo栈
- void undo()
- {
- if (!undoCommands.isEmpty())
- {
- VPCommand* command = undoCommands.pop();
- command->undo();
- redoCommands.push(command);
- }
- }
- // 执行Redo,将命令从redo栈弹出,然后重新执行一次
- void redo()
- {
- if (!redoCommands.isEmpty())
- {
- VPCommand* command = redoCommands.pop();
- command->redo();
- undoCommands.push(command);
- }
- }
- // 是否可以执行Undo(用于显示菜单状态)
- bool canUndo()
- {
- return !(undoCommands.isEmpty());
- }
- // 是否可以执行Redo(用于显示菜单状态)
- bool canRedo()
- {
- return !(redoCommands.isEmpty());
- }
- private:
- // Undo堆栈
- QStack<VPCommand*> undoCommands;
- // Redo堆栈
- QStack<VPCommand*> redoCommands;
- };
|