#include "VPCommand.h"
#include "Pou.h"
#include "WindowAppPouScene.h"
#include "WindowAppBlockBase.h"
#include "WindowAppUiScene.h"
#include "VControlObject.h"
#include "UiManager.h"
#include "SelectWidget.h"
//=====================================================
//
// Pou中添加工具的操作
//
//=====================================================
///
/// 生成Pou中的工具添加命令,并保存相关信息(注意Tool需要复制一份出来,要做深度拷贝)
///
///
///
///
PouToolAddCommand::PouToolAddCommand(WindowAppPouScene* pScene, const STATIC_TOOL* toolInfo, QPointF toolPos)
{
this->m_pPouScene = pScene;
this->m_toolInfo = *toolInfo;
this->m_toolPos = toolPos;
vDebug() << " New tool add cmd: Tool[" << toolInfo->strName << "].";
}
///
/// 执行Pou添加工具命令
///
void PouToolAddCommand::redo()
{
// 调用PouScene的接口添加工具
WindowAppBlockBase* pNewBlock = m_pPouScene->addToolItem(&m_toolInfo, m_toolPos);
//QFuture future = QtConcurrent::run(m_pPouScene, &WindowAppPouScene::addToolItem, &m_toolInfo, m_toolPos);
//future.waitForFinished();
// vDebug() << " PouToolAddCommand - Redo: add Tool[" << m_toolInfo.strName << "] finished.";
//WindowAppBlockBase* pNewBlock = future.result();
// 保存实例名用于后续使用
this->m_strToolInstName = pNewBlock->m_toolInfo->strInstanceName;
vDebug() << " PouToolAddCommand - Redo: add Tool[" << m_toolInfo.strName << "].";
}
///
/// 撤销(删除此Tool)
///
void PouToolAddCommand::undo()
{
// 根据名字获取对应的功能块(因为这个功能块可能是删除之后重建的,所以每次都需要获取最新的功能块指针)
WindowAppBlockBase* pBlock = m_pPouScene->m_Pou.GetToolItem(m_strToolInstName);
if (pBlock != nullptr)
{
// 删除此功能块
m_pPouScene->delToolItem(pBlock);
}
vDebug() << " PouToolAddCommand - Undo: del Tool[" << m_strToolInstName << "].";
}
//=====================================================
//
// Pou中删除工具的操作
//
//=====================================================
///
/// 生成Pou中的工具删除命令,并保存相关信息(从TOOL取出基本信息进行保存)
///
///
///
///
PouToolDelCommand::PouToolDelCommand(WindowAppPouScene* pScene, const TOOL* tool, QPointF toolPos)
{
this->m_pPouScene = pScene;
this->m_toolInfo = STATIC_TOOL(tool);
this->m_toolPos = toolPos;
this->m_strToolInstName = tool->strInstanceName;
vDebug() << " New tool del cmd: Tool[" << tool->strInstanceName << "].";
}
///
/// 执行本命令(删除此Tool)
///
void PouToolDelCommand::redo()
{
// 根据名字获取对应的功能块(因为这个功能块可能是删除之后重建的,所以每次都需要获取最新的功能块指针)
WindowAppBlockBase* pBlock = m_pPouScene->m_Pou.GetToolItem(m_strToolInstName);
if (pBlock != nullptr)
{
m_pPouScene->delToolItem(pBlock);
}
vDebug() << " PouToolDelCommand - Redo: del Tool[" << m_strToolInstName << "].";
}
///
/// 撤销(重新添加Tool)
///
void PouToolDelCommand::undo()
{
// 调用PouScene的接口添加工具
WindowAppBlockBase* pNewBlock = m_pPouScene->addToolItem(&m_toolInfo, m_toolPos);
// 保存实例名用于后续使用(此处理应不会变化)
this->m_strToolInstName = pNewBlock->m_toolInfo->strInstanceName;
vDebug() << " PouToolDelCommand - Undo: add Tool[" << this->m_strToolInstName << "].";
}
//=====================================================
//
// Pou中移动工具的操作
//
//=====================================================
///
/// 生成Pou中的工具移动命令,并保存相关信息
///
///
///
///
PouToolMoveCommand::PouToolMoveCommand(POU* pou, const QString& strToolInstName, const QPointF& oldPos, const QPointF& newPos)
{
this->m_Pou = pou;
this->m_strToolInstName = strToolInstName;
this->m_oldPos = oldPos;
this->m_newPos = newPos;
vDebug() << " New tool move cmd: Tool[" << strToolInstName << "] from " << oldPos << " to " << newPos;
}
///
/// 执行本命令
///
void PouToolMoveCommand::redo()
{
// 根据名字获取对应的功能块(因为这个功能块可能是删除之后重建的,所以每次都需要获取最新的功能块指针)
WindowAppBlockBase* pBlock = m_Pou->GetToolItem(m_strToolInstName);
// 移动到新位置
pBlock->setPos(m_newPos);
vDebug() << " PouToolMoveCommand - Redo: Move Tool[" << m_strToolInstName << "] from " << m_oldPos << " to " << m_newPos;
}
///
/// 撤销(移动到旧位置)
///
void PouToolMoveCommand::undo()
{
// 根据名字获取对应的功能块(因为这个功能块可能是删除之后重建的,所以每次都需要获取最新的功能块指针)
WindowAppBlockBase* pBlock = m_Pou->GetToolItem(m_strToolInstName);
// 移动到旧
pBlock->setPos(m_oldPos);
vDebug() << " PouToolMoveCommand - Undo: Move Tool[" << m_strToolInstName << "] from " << m_newPos << " to " << m_oldPos;
}
//=====================================================
//
// UI中添加控件的操作
//
//=====================================================
///
/// 生成UI中的控件添加命令,并保存相关信息
///
///
///
///
UiControlAddCommand::UiControlAddCommand(WindowAppUiScene* pScene, VALUE_TYPE controlType, QPoint pos)
{
this->m_pUiScene = pScene;
this->m_controlType = controlType;
this->m_pos = pos;
this->m_strControlID.clear();
vDebug() << " New control add cmd: Index[" << controlType << "] at " << pos;
}
///
/// 执行UI添加控件命令
///
void UiControlAddCommand::redo()
{
// 在UiScene中生成控件(如果之前已经有分配的ID了,则沿用之前的ID)
VControlObject* pNewControl = m_pUiScene->newControl(this->m_controlType, this->m_pos, this->m_strControlID);
if (pNewControl == nullptr)
{
return;
}
// 保存生成控件的ID号,用于后续Undo(此处应该只有首次会变,后续应该一直沿用不会变化)
this->m_strControlID = pNewControl->m_strID;
vDebug() << " UiControlAddCommand - Redo: add Control[" << this->m_strControlID << "] at " << m_pos;
}
///
/// 撤销(删除此控件)
///
void UiControlAddCommand::undo()
{
// 根据ID号删除指定的控件
m_pUiScene->deleteControlByID(m_strControlID);
vDebug() << " UiControlAddCommand - Undo: del Control[" << this->m_strControlID << "].";
}
//=====================================================
//
// UI中删除控件的操作
//
//=====================================================
///
/// 生成UI中的控件删除命令,并保存相关信息
///
///
///
///
UiControlDelCommand::UiControlDelCommand(WindowAppUiScene* pScene, VALUE_TYPE controlType, const QString strID, QPoint pos, QSize size)
{
this->m_pUiScene = pScene;
this->m_controlType = controlType;
this->m_strControlID = strID;
this->m_pos = pos;
this->m_size = size;
vDebug() << " New control del cmd: ID[" << this->m_strControlID << "] at " << pos;
}
///
/// 执行UI删除控件命令
///
void UiControlDelCommand::redo()
{
// 根据ID号删除指定的控件
m_pUiScene->deleteControlByID(m_strControlID);
vDebug() << " UiControlDelCommand - Redo: del Control[" << this->m_strControlID << "].";
}
///
/// 撤销(重新添加此控件)
///
void UiControlDelCommand::undo()
{
// 在UiScene中生成控件(如果之前已经有分配的ID了,则沿用之前的ID)
VControlObject* pNewControl = m_pUiScene->newControl(this->m_controlType, this->m_pos, this->m_strControlID, m_size);
if (pNewControl == nullptr)
{
return;
}
// 保存生成控件的ID号,用于后续Undo(此处理应不会变化)
this->m_strControlID = pNewControl->m_strID;
vDebug() << " UiControlDelCommand - Undo: add Control[" << this->m_strControlID << "] at " << m_pos;
}
//=====================================================
//
// UI中缩放控件的操作
//
//=====================================================
///
/// 生成UI中的控件缩放命令,并保存相关信息
///
///
///
///
///
UiControlZoomCommand::UiControlZoomCommand(
WindowAppUiScene* pUiScene,
const QString strID,
const QRect& oldGeometry,
const QRect& newGeometry
)
{
this->m_pUiScene = pUiScene;
this->m_strControlID = strID;
this->m_oldGeometry = oldGeometry;
this->m_newGeometry = newGeometry;
vDebug() << " New control zoom cmd: Control[" << m_strControlID << "] from " << oldGeometry << " to " << newGeometry;
}
///
/// 执行UI缩放控件命令(缩放到新尺寸)
///
void UiControlZoomCommand::redo()
{
// 根据ID获取对应的控件Widget(因为这个控件可能是删除之后重建的,所以每次都需要获取最新的控件指针)
SelectWidget* pControlWidget = m_pUiScene->getSelectWidgetByID(m_strControlID);
if (pControlWidget == nullptr)
{
vDebug() << "[Error] UiControlZoomCommand - Redo: - pControlWidget is nullptr.";
return;
}
// 缩放到新尺寸
pControlWidget->updateGeometry(this->m_newGeometry);
vDebug() << " UiControlMoveCommand - Redo: Zoom Control[" << m_strControlID << "] from " << this->m_oldGeometry << " to " << this->m_newGeometry;
}
///
/// 撤销(还原到旧尺寸)
///
void UiControlZoomCommand::undo()
{
// 根据ID获取对应的控件Widget(因为这个控件可能是删除之后重建的,所以每次都需要获取最新的控件指针)
SelectWidget* pControlWidget = m_pUiScene->getSelectWidgetByID(m_strControlID);
if (pControlWidget == nullptr)
{
vDebug() << "[Error] UiControlZoomCommand - Undo: - pControlWidget is nullptr.";
return;
}
// 缩放到旧尺寸
pControlWidget->updateGeometry(this->m_oldGeometry);
vDebug() << " UiControlMoveCommand - Undo: Zoom Control[" << m_strControlID << "] from " << this->m_newGeometry << " to " << this->m_oldGeometry;
}
//=====================================================
//
// UI中移动控件的操作
//
//=====================================================
///
/// 生成UI中的控件移动命令,并保存相关信息
///
///
///
///
///
UiControlMoveCommand::UiControlMoveCommand(
WindowAppUiScene* pUiScene,
const QString strID,
const QPoint& oldPos,
const QPoint& newPos
)
{
this->m_pUiScene = pUiScene;
this->m_strControlID = strID;
this->m_oldPos = oldPos;
this->m_newPos = newPos;
vDebug() << " New control move cmd: Control[" << m_strControlID << "] from " << oldPos << " to " << newPos;
}
///
/// 执行UI移动控件命令(移动到新位置)
///
void UiControlMoveCommand::redo()
{
// 根据ID获取对应的控件Widget(因为这个控件可能是删除之后重建的,所以每次都需要获取最新的控件指针)
SelectWidget* pControlWidget = m_pUiScene->getSelectWidgetByID(m_strControlID);
if (pControlWidget == nullptr)
{
vDebug() << "[Error] UiControlMoveCommand - Redo: - pControlWidget is nullptr.";
return;
}
// 移动到新位置
pControlWidget->updatePos(m_newPos);
vDebug() << " UiControlMoveCommand - Redo: Move Control[" << m_strControlID << "] from " << m_oldPos << " to " << m_newPos;
}
///
/// 撤销(移动到旧位置)
///
void UiControlMoveCommand::undo()
{
// 根据ID获取对应的控件Widget(因为这个控件可能是删除之后重建的,所以每次都需要获取最新的控件指针)
SelectWidget* pControlWidget = m_pUiScene->getSelectWidgetByID(m_strControlID);
if (pControlWidget == nullptr)
{
vDebug() << "[Error] UiControlMoveCommand - Undo: - pControlWidget is nullptr.";
return;
}
// 移动到旧位置
pControlWidget->updatePos(m_oldPos);
vDebug() << " UiControlMoveCommand - Undo: Move Control[" << m_strControlID << "] from " << m_newPos << " to " << m_oldPos;
}