206 lines
8.2 KiB
C++
206 lines
8.2 KiB
C++
/*
|
||
* @file AddModuleCmd.h
|
||
* @brief AddModuleCmd是为工作流编辑界面模块添加模块的命令
|
||
* @date: 2012-10-10
|
||
* @author: limengzhuo
|
||
*/
|
||
|
||
#ifndef PAI_FRAME_WORKFLOWVIEW_ADDMODULECMD_H
|
||
#define PAI_FRAME_WORKFLOWVIEW_ADDMODULECMD_H
|
||
|
||
#include <QGraphicsItem>
|
||
#include <QPoint>
|
||
#include <QList>
|
||
#include <QUndoCommand>
|
||
#include "ModuleInformation.h"
|
||
namespace pai
|
||
{
|
||
class AddLineCmd;
|
||
class BreakLineCmd;
|
||
namespace objectmodel
|
||
{
|
||
class PaiWorkflowDataModel;
|
||
}
|
||
namespace graphics2d
|
||
{
|
||
class WorkflowSceneManager;
|
||
class ModuleGraphicsItem;
|
||
class ModuleConnectGraphicsItem;
|
||
}
|
||
|
||
/**
|
||
* @class AddModuleCmd
|
||
* @brief AddModuleCmd是为工作流编辑界面模块添加模块的命令
|
||
*/
|
||
class AddModuleCmd :public QUndoCommand
|
||
{
|
||
public:
|
||
/**
|
||
* @brief 构造函数
|
||
* @param[in] pSceneManager 添加模块的场景
|
||
* @param[in] pWorkflow 添加模块工作流
|
||
* @param[in] moduleName 添加模块的名字
|
||
* @param[in] parent 父亲
|
||
*/
|
||
AddModuleCmd(pai::graphics2d::WorkflowSceneManager *pSceneManager,
|
||
pai::objectmodel::PaiWorkflowDataModel *pWorkflow,
|
||
QString moduleName,
|
||
QUndoCommand *parent = 0);
|
||
|
||
/**
|
||
* @brief 构造函数
|
||
* @param[in] pSceneManager 添加模块的场景
|
||
* @param[in] pWorkflow 添加模块工作流
|
||
* @param[in] moduleName 添加模块的名字
|
||
* @param[in] pSelectedItem 场景中被选中模块
|
||
* @param[in] before 添加到被选中模块之前或者之后
|
||
* @param[in] parent 父亲
|
||
*/
|
||
AddModuleCmd(pai::graphics2d::WorkflowSceneManager *pSceneManager,
|
||
pai::objectmodel::PaiWorkflowDataModel *pWorkflow,
|
||
QString moduleName,
|
||
pai::graphics2d::ModuleGraphicsItem *pSelectedItem,
|
||
bool before,
|
||
QUndoCommand *parent = 0);
|
||
|
||
/**
|
||
* @brief 构造函数
|
||
* @param[in] pSceneManager 添加模块的场景
|
||
* @param[in] pWorkflow 添加模块工作流
|
||
* @param[in] moduleName 添加模块的名字
|
||
* @param[in] pos 添加模块的位置
|
||
* @param[in] parent 父亲
|
||
*/
|
||
AddModuleCmd(pai::graphics2d::WorkflowSceneManager *pSceneManager,
|
||
pai::objectmodel::PaiWorkflowDataModel *pWorkflow,
|
||
QString moduleName,
|
||
QPointF pos,
|
||
QUndoCommand *parent = 0);
|
||
|
||
/**
|
||
* @brief 析构函数
|
||
*/
|
||
virtual ~AddModuleCmd();
|
||
|
||
/**
|
||
* @brief 撤销添加的模块
|
||
*/
|
||
void undo();
|
||
|
||
/**
|
||
* @brief 添加模块操作
|
||
*/
|
||
void redo();
|
||
|
||
private:
|
||
/**
|
||
* @brief 添加连线
|
||
*/
|
||
bool AddLine(pai::graphics2d::ModuleGraphicsItem *pBeginModule,
|
||
pai::graphics2d::ModuleGraphicsItem *pEndModule);
|
||
|
||
/*
|
||
* @brief 根据被添加模块和被选中模块调整场景中所有模块的位置
|
||
* @param[in] pAddedModule
|
||
* @param[in] pSelectedModule
|
||
*/
|
||
|
||
void LayoutAllModules(pai::graphics2d::ModuleGraphicsItem *pAddedModule,
|
||
pai::graphics2d::ModuleGraphicsItem *pSelectedModule);
|
||
|
||
/**
|
||
* @brief 根据被添加模块调整开始和结束模块位置
|
||
* @param[in] pRelativeItem 场景中存在的位置固定模块
|
||
* @param[in] pMovedItem 将要被移动的模块
|
||
* @param[in] step 移动的像素
|
||
*/
|
||
void MoveAddedModulePosition(pai::graphics2d::ModuleGraphicsItem *pRelativeItem,
|
||
pai::graphics2d::ModuleGraphicsItem *pAddedItem,
|
||
qreal step);
|
||
|
||
/**
|
||
* @brief 添加模块
|
||
*/
|
||
void AddModule();
|
||
|
||
|
||
/**
|
||
* @brief 删除模块
|
||
*/
|
||
void DeleteModule();
|
||
|
||
/**
|
||
* @brief 拖拽添加模块时删除原有连线及添加模块连接线
|
||
* @param[in] pModuleItem 被添加的模块
|
||
* @param[in] item 与被添加模块碰撞的连线
|
||
* @param[in] startModuleItem 碰撞连线的开始模块
|
||
* @param[in] endModuleItem 碰撞连线的结束模块
|
||
* @param[in] startPortIndex 碰撞连线的开始端口
|
||
* @param[in] endPortIndex 碰撞连线的结束端口
|
||
*/
|
||
void DeleteConnectLineAndAddNew(pai::graphics2d::ModuleGraphicsItem* pModuleItem,
|
||
pai::graphics2d::ModuleConnectGraphicsItem *pItem,
|
||
pai::graphics2d::ModuleGraphicsItem *pStartModuleItem,
|
||
pai::graphics2d::ModuleGraphicsItem *pEndModuleItem);
|
||
/**
|
||
* @brief 处理模块时处理位置
|
||
* @param[in] pModuleItem 被添加的模块
|
||
* @param[in] startModuleItem 开始模块
|
||
* @param[in] endModuleItem 结束模块
|
||
*/
|
||
void MoveGraphicItems(pai::graphics2d::ModuleGraphicsItem *pModuleItem,
|
||
pai::graphics2d::ModuleGraphicsItem *pStartModuleItem,
|
||
pai::graphics2d::ModuleGraphicsItem *pEndModuleItem);
|
||
|
||
/**
|
||
* @brief 处理碰撞的连线图元
|
||
* @param[in] pModuleItem 被添加的模块
|
||
*/
|
||
void HandleCollidingItems(pai::graphics2d::ModuleGraphicsItem *pModuleItem);
|
||
|
||
/**
|
||
* @brief 处理最低端的模块图元
|
||
* @param[in] pModuleItem 被添加的模块
|
||
* @param[in] pMostBottomItem 场景中最底端模块
|
||
*/
|
||
void HandleMostBottomItem(pai::graphics2d::ModuleGraphicsItem *pModuleItem,
|
||
pai::graphics2d::ModuleGraphicsItem *pMostBottomItem);
|
||
|
||
/**
|
||
* @brief 设置模块位置
|
||
* @param[in] pModuleItem 模块
|
||
* @param[in] pos 模块位置
|
||
*/
|
||
void SetPosition(pai::graphics2d::ModuleGraphicsItem *pModuleItem, QPointF pos);
|
||
|
||
/**
|
||
* @brief 获取最低端的模块图元
|
||
* @return 最底端模块
|
||
*/
|
||
pai::graphics2d::ModuleGraphicsItem* GetMostBottomItem(QGraphicsItem *pModuleItem);
|
||
|
||
private:
|
||
static const int nDefaultIntervalY = 26; //模块间的高度距离
|
||
|
||
enum AddModuleType
|
||
{
|
||
AddModuleType_General = 0, //模块树双击模块添加或者模块树右键菜单项add添加(在没有选中任何模块的情况下)
|
||
AddModuleType_After = 1, //模块树右键菜单项addAfter添加(选中模块的情况下双击模块树上模块)
|
||
AddModuleType_Before = 2, //模块树右键菜单项addBefore添加
|
||
AddModuleType_Drop = 3, //模块树拖拽模块添加(双击场景添加模块)
|
||
};
|
||
AddModuleType m_type; //模块添加的类型,是普通的添加,还是从模块树上拖拽过来的,还是在选中模块之前或之后添加
|
||
QPointF m_eventPos; //拖拽时候的drop位置
|
||
pai::objectmodel::PaiWorkflowDataModel* m_pWorkflow; //工作流模型
|
||
pai::graphics2d::WorkflowSceneManager* m_pScene; //场景
|
||
int m_addedModuleStepId; //添加的模块的Id
|
||
bool m_bModuleSelected; //redo 时模块是否需要被选中
|
||
bool m_bFirstRedo; //是否第一次redo 操作
|
||
int m_selectedModuleStepId; //选中模块之前或之后添加时候,备选中的模块图元
|
||
QString m_moduleClassName; //要添加的模块的类名
|
||
QList<pai::AddLineCmd *> m_AddLineLst; //添加连线命令管理链表
|
||
QList<pai::BreakLineCmd *> m_BreakLineLst; //断开连线命令管理链表
|
||
};
|
||
}
|
||
#endif /* PAI_FRAME_WORKFLOWVIEW_ADDMODULECMD_H */
|