/* * @file AddModuleCmd.h * @brief AddModuleCmd是为工作流编辑界面模块添加模块的命令 * @date: 2012-10-10 * @author: limengzhuo */ #ifndef PAI_FRAME_WORKFLOWVIEW_ADDMODULECMD_H #define PAI_FRAME_WORKFLOWVIEW_ADDMODULECMD_H #include #include #include #include #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 m_AddLineLst; //添加连线命令管理链表 QList m_BreakLineLst; //断开连线命令管理链表 }; } #endif /* PAI_FRAME_WORKFLOWVIEW_ADDMODULECMD_H */