#pragma once #include #include "../common/DataStructure.h" class POU; class WindowAppPouScene; class WindowAppBlockBase; class WindowAppUiScene; class WindowAppUiView; //=========================================================== // 按照Command设计模式设计的用于执行系统中Undo和Redo操作的类 // 目前可用于Pou和UI界面的部分操作 /// /// 定义系统操作的虚基类 /// class VPCommand { public: // 执行本命令(接口) virtual void redo() = 0; // 撤销(接口) virtual void undo() = 0; }; //======================================================================================= // // VPCommand - POU的功能块操作相关 // //======================================================================================= /// /// Pou中添加工具的操作 /// 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; }; /// /// Pou中删除工具的操作 /// 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; }; /// /// Pou中移动工具的操作 /// 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中的控件操作相关 // //======================================================================================= /// /// UI中添加控件的操作 /// 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; }; /// /// UI中删除控件的操作 /// 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; }; /// /// UI中缩放控件的操作 /// 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; }; /// /// UI中移动控件的操作 /// 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 // //======================================================================================= /// /// 管理Undo和Redo堆栈的管理器 /// 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 undoCommands; // Redo堆栈 QStack redoCommands; };