/** * @file GeneralWorkflowScene.h * @brief 工作流展示场景 * @date 2014-08-11 */ #ifndef PAI_FRAME_WORKFLOWWIDGET_GENERALWORKFLOWSCENE_H #define PAI_FRAME_WORKFLOWWIDGET_GENERALWORKFLOWSCENE_H #include "Turtle.h" #include #include namespace pai { namespace workflow { class CModuleInformation; class CModuleConnection; } namespace gui { class PaiJobErrorInfoItem; class PaiJobSummaryItem; } namespace objectmodel { class PaiObject; class PaiWorkflowDataModel; class PaiJob; } namespace graphics2d { class ModuleGraphicsItem; class PaiModuleStyle; class ModuleToolBarGraphicsItem; class ModulePortInfoGraphicsItem; class ModuleConnectGraphicsItem; class WorkflowWidget; class ModuleMonitorGraphicsItem; } } namespace pai { namespace graphics2d { /** * @class GeneralWorkflowScene * @brief 工作流展示的场景,负责工作流展示 */ class PAI_WORKFLOWWIDGET_EXPORT GeneralWorkflowScene : public QGraphicsScene { Q_OBJECT public: /** * @brief 场景构造函数 * @param[in] x 场景左上角x轴开始坐标 * @param[in] y 场景左上角y轴开始坐标 * @param[in] width 场景宽度 * @param[in] height 场景高度 */ GeneralWorkflowScene(qreal x, qreal y, qreal width, qreal height, QObject *pParant = NULL); /** * @brief 场景析构函数 */ virtual ~GeneralWorkflowScene(); /** * @brief 添加一个工作流到绘图场景区域 * @param[in] pWorkflow 工作流对象 * @param[in] jobRelated true 只读工作流 * false 可编辑工作流 */ virtual void AddWorkflow(pai::objectmodel::PaiWorkflowDataModel *pWorkflow, bool jobRelated = false); /** * @brief 显示每个模块的作业进度信息 * @param[in] pJob作业对象 * @param[in] jobType true 表示日志上的工作流 * false 表示作业上的工作流 */ void AddJob(pai::objectmodel::PaiJob *pJob, bool jobType); /** * @brief 根据指定ID找到对应的模块 * @param[in] stepID 模块ID * @return 模块指针 */ pai::graphics2d::ModuleGraphicsItem* FindModule(int stepID); /** * @brief 设置模块详细进度信息 */ void SetJobPrgsInfo(); /** * @brief 清除场景中的连线和模块 */ virtual void Clear(); /** * @brief 更新场景大小 */ void ExpandSceneRect(); /** * @brief 设置场景只读,只读时不显示模块的操作菜单。 * @param[in] readyOnly 只读 */ void SetScenceReadOnly(bool readyOnly); /** * @brief 根据给定位置和扩展距离,自动扩展场景 * @param[in] point 给定的点 * @param[in] xExtra 基于point横向要扩大的值 * @param[in] yExtra 基于point纵向要扩大的值 */ void ExpandSceneRectIfNeeded(const QPointF &point, qreal xExtra, qreal yExtra); /** * @brief 根据某个模块的位置和大小来决定是否需要扩展场景 * @param[in] stepID 模块的stepID */ void ExpandSceneRectIfNeeded(int stepID); /** *@brief 设置场景视口 *@param[in] pWorkflowWidget 视口指针 */ void SetWorkflowWidget(WorkflowWidget *pWorkflowWidget); /** *@brief 设置给定视口是否可以框选 *@param[in] pWorkflowView 视口 *@param[in] enable 是否可框选 */ virtual void EnableMultiSelect(QGraphicsView *pWorkflowView, bool enable); /** * @brief 设置A1区“Error Info条”显示使能 * @param[in] flag true显示,false不显示 */ void EnableErrorInfoItem(bool flag); /** * @brief 把焦点设置到视口 */ void SetFocusViewport(); /** * @brief 对指定模块以外的其他模块的相反方向端口进行高亮或者取消高亮 * @param[in] stepID 通常是第一个选中端口的模块图元的stepID * @param[in] light 真代表进行端口高亮,假代表取消端口高亮 */ void HilightOtherItems(int stepID, bool light); /** * @brief 显示错误页签当前错误信息 * @param[in] pJob 出错的Job */ void ShowCurrentErrorInfo(pai::objectmodel::PaiJob *pJob); protected: /** * @brief 重写鼠标按压事件 */ virtual void mousePressEvent(QGraphicsSceneMouseEvent *pEvent); /** * @brief 根据指定链接找到对应的连接图元 * @param[in] pConnection 指定链接 * @return 连线item */ QGraphicsItem* FindConnection(pai::workflow::CModuleConnection *pConnection); /** * @brief 添加一个Module到绘图场景区域 * @param[in] pModule 模块的参数信息 * @param[in] pStyle 模块图元的绘图信息 * @param[in] jobRelated 是否作业对应的工作流 * @return 被添加模块 */ virtual pai::graphics2d::ModuleGraphicsItem* AddModule(pai::workflow::CModuleInformation *pModule, pai::graphics2d::PaiModuleStyle *pStyle, bool jobRelated = false); /** * @brief 添加一个Monitor Module到绘图场景区域 * @param[in] pModule 模块的参数信息 * @param[in] pStyle 模块图元的绘图信息 * @param[in] jobRelated 是否作业对应的工作流 * @return 被添加模块 */ virtual ModuleMonitorGraphicsItem* AddMonitorModule(pai::workflow::CModuleInformation *pModule, PaiModuleStyle *pStyle, bool jobRelated = false); /** * @brief 添加一个连线到绘图场景区域 * @param[in] pConnect 模块连线的参数信息 */ virtual void AddConnection(pai::workflow::CModuleConnection *pConnect); /** * @brief 对指定模块以外的其他模块的相反方向端口进行高亮或者取消高亮 * @param[in] pStartItem 通常是第一个选中端口的模块图元 * @param[in] light 真代表进行端口高亮,假代表取消端口高亮 */ void HilightOtherItems(ModuleGraphicsItem *pStartItem, bool light); /** * @brief 获取唯一被选中的模块 * @return 场景中唯一被选中的模块 */ pai::graphics2d::ModuleGraphicsItem* GetSingleSelectedItem() const; /** * @brief 获取非使能模块 * @return 所有非使能模块 */ QList< QGraphicsItem* > GetDisabledItems() const; /** * @brief 设置工作流 * @param[in] pWorkflow 当前工作流 */ void SetWorkflow(pai::objectmodel::PaiWorkflowDataModel *pWorkflow); /** * @brief 获取当前场景的工作流 * @return 工作流对象 */ pai::objectmodel::PaiWorkflowDataModel* GetWorkflow() const; /** * @brief 获取模块工具栏 * @return 模块工具栏对象指针 */ ModuleToolBarGraphicsItem* GetModuleToolBar() const; /** * @brief 是否只读 * @return true 只读 * false 可编辑 */ bool IsReadOnly() const; protected slots: /** * @brief 响应changed信号,更新所有连线的位置。 * @param[in] region 场景中有改变的区域 */ void UpdateScene(const QList< QRectF > & region); /** * @brief 响应UpdateSceneRect信号,调整工作流场景大小。 */ void SceneRectAutoAdaptive(); /** * @brief 响应SetPosition信号,调整模块的位置。 * @param[in] point 模块中心点的位置。 * @param[in] pItem 被调整的模块。 */ void SetModulePosition(const QPointF& point, pai::graphics2d::ModuleGraphicsItem *pItem); /** * @brief 设置作业错误信息 * @param[in] pJob 出错的Job * @param[in] error 错误信息 */ void SetJobErrorInfo(pai::objectmodel::PaiJob *pJob, const QString& error); protected: pai::objectmodel::PaiWorkflowDataModel *m_pWorkflow; ///< 当前场景展示的工作流 bool m_ScenceReadOnly; ///< 当前工作流是否处于只读状态private: ModuleToolBarGraphicsItem *m_pModuleToolBarItem; ///< 模块右侧工具栏 QRectF m_OriginalSceneRect; ///< 工作流场景的原始大小 pai::gui::PaiJobErrorInfoItem *m_pJobErrorInfoItem; ///< 日志场景错误Item pai::objectmodel::PaiJob *m_pJob; ///< 但钱工作流对应作业指针 pai::gui::PaiJobSummaryItem *m_pSummaryItem; ///< 日志界面summary item WorkflowWidget *m_pWorkflowWidget; ///< 展示场景的widget QMultiMap< pai::objectmodel::PaiJob *, QString > m_MultiMapErrorInfo; ///< 作业指针, 错误信息 bool m_IsChangeTableWidget; ///< 判断是否切换了table 页签 bool m_IsAddErrorInfo; ///< 判断是否已经添加过错误信息 bool m_ErrorInfoItem; ///< A1区“Error Info条”显示使能标志 bool m_JobType; ///< true:日志类型,false: 作业 signals: /** * @brief 鼠标点击场景时,发送的信息 * param[in] pModule 模块信息 */ void ClickScene(pai::workflow::CModuleInformation *pModule); /** * @brief 当场景中的模块被删除或添加时候发送此消息 */ void UpdateSceneRect(); }; } } #endif ///< PAI_FRAME_WORKFLOWWIDGET_GENERALWORKFLOWSCENE_H