306 lines
10 KiB
C++
306 lines
10 KiB
C++
/**
|
||
* @file GeneralWorkflowScene.h
|
||
* @brief 工作流展示场景
|
||
* @date 2014-08-11
|
||
*/
|
||
#ifndef PAI_FRAME_WORKFLOWWIDGET_GENERALWORKFLOWSCENE_H
|
||
#define PAI_FRAME_WORKFLOWWIDGET_GENERALWORKFLOWSCENE_H
|
||
|
||
#include "Turtle.h"
|
||
#include <QMap>
|
||
#include <QGraphicsScene>
|
||
|
||
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
|