24 #include <QGraphicsItem> 
   25 #include <QGraphicsSceneMoveEvent> 
   26 #include <QItemSelection> 
   31 const QRectF default_scene_rect(0, 0, 800, 600);
 
   32 const qreal min_distance_to_create_rect = 10;
 
   36     : QGraphicsScene(parent)
 
   40     , m_block_selection(false)
 
   44     setSceneRect(default_scene_rect);
 
   45     connect(
this, &MaskGraphicsScene::selectionChanged, 
this,
 
   64             disconnect(
m_maskModel, &SessionModel::modelAboutToBeReset, 
this,
 
   66             disconnect(
m_maskModel, &SessionModel::rowsInserted, 
this,
 
   68             disconnect(
m_maskModel, &SessionModel::rowsAboutToBeRemoved, 
this,
 
   70             disconnect(
m_maskModel, &SessionModel::rowsRemoved, 
this,
 
   72             disconnect(
m_maskModel, &SessionModel::modelReset, 
this,
 
   79         if (containerType != 
"MaskContainer" && containerType != 
"ProjectionContainer")
 
   81                 "MaskGraphicsScene::setMaskContext() -> Error. Not a container");
 
   86             connect(
m_maskModel, &SessionModel::modelAboutToBeReset, 
this,
 
   88             connect(
m_maskModel, &SessionModel::rowsInserted, 
this,
 
   90             connect(
m_maskModel, &SessionModel::rowsAboutToBeRemoved, 
this,
 
   92             connect(
m_maskModel, &SessionModel::rowsRemoved, 
this,
 
  106         disconnect(
m_maskModel, &SessionModel::modelAboutToBeReset, 
this,
 
  108         disconnect(
m_maskModel, &SessionModel::rowsInserted, 
this,
 
  110         disconnect(
m_maskModel, &SessionModel::rowsAboutToBeRemoved, 
this,
 
  112         disconnect(
m_maskModel, &SessionModel::rowsRemoved, 
this,
 
  162     for (
int irow = first; irow <= last; ++irow) {
 
  240     for (QGraphicsItem* graphicsItem : selectedItems()) {
 
  243             ASSERT(itemIndex.isValid());
 
  253     if (event->buttons() & Qt::RightButton) {
 
  277     QGraphicsScene::mousePressEvent(event);
 
  286     QGraphicsScene::mouseMoveEvent(event);
 
  304                     view->setSelected(
true);
 
  314         QGraphicsScene::mouseReleaseEvent(event);
 
  330         painter->setPen(QPen(Qt::black, 1, Qt::DashLine));
 
  334             const QRectF& plot_scene_rectangle = 
m_adaptor->viewportRectangle();
 
  338             painter->setPen(QPen(Qt::black, 1, Qt::DashLine));
 
  342                 painter->drawLine(QLineF(p1, p2));
 
  347                 painter->drawLine(QLineF(p1, p2));
 
  360     if (
dynamic_cast<IShape2DView*
>(itemAt(event->scenePos(), QTransform())))
 
  386             if (item->modelType() == 
"GroupProperty" || item->modelType() == 
"Property")
 
  392                     parentView->
addView(childView, i_row);
 
  436         if (it.key() == item) {
 
  438             view->setSelected(
false);
 
  452     if (!(event->buttons() & Qt::LeftButton))
 
  454     if (!
m_adaptor->viewportRectangle().contains(event->scenePos()))
 
  474             if (item->modelType() == 
"RegionOfInterest")
 
  505     if (QGraphicsItem* graphicsItem = itemAt(event->scenePos(), QTransform())) {
 
  524         if (item->modelType() == 
"MaskAllMask")
 
  534     for (QGraphicsItem* graphicsItem : this->items(event->scenePos()))
 
  535         if (graphicsItem->type() == viewType)
 
  561     Qt::MouseButtons acceptedButton = (value ? Qt::NoButton : Qt::LeftButton);
 
  563         view->setAcceptedMouseButtons(acceptedButton);
 
  573         if (it.key()->modelType() == 
"VerticalLineMask") {
 
  575         } 
else if (it.key()->modelType() == 
"HorizontalLineMask") {
 
  583     if (QGraphicsItem* graphicsItem = itemAt(event->scenePos(), QTransform()))
 
  584         graphicsItem->setSelected(
true);
 
  597     QPointF click_pos = 
event->buttonDownScenePos(Qt::LeftButton);
 
  598     QPointF mouse_pos = 
event->scenePos();
 
  599     QLineF line(mouse_pos, click_pos);
 
  601     if (!
m_currentItem && line.length() > min_distance_to_create_rect) {
 
  611     qreal xmin = std::min(click_pos.x(), mouse_pos.x());
 
  612     qreal xmax = std::max(click_pos.x(), mouse_pos.x());
 
  613     qreal ymin = std::min(click_pos.y(), mouse_pos.y());
 
  614     qreal ymax = std::max(click_pos.y(), mouse_pos.y());
 
  624                                     m_adaptor->fromSceneX(xmin + (xmax - xmin) / 2.));
 
  626                                     m_adaptor->fromSceneY(ymin + (ymax - ymin) / 2.));
 
  646                                  QItemSelectionModel::Select);
 
  652         if (polygon->closePolygonIfNecessary()) {
 
  659     QPointF click_pos = 
event->buttonDownScenePos(Qt::LeftButton);
 
  668     QPointF click_pos = 
event->buttonDownScenePos(Qt::LeftButton);
 
  736     if (itemToChange->
modelType() == 
"RegionOfInterest")
 
  743             if (currentItem->modelType() == itemToChange->
modelType()) {
 
  744                 QString itemName = currentItem->itemName();
 
  745                 if (itemName.startsWith(itemToChange->
itemName())) {
 
  746                     int item_index = itemName.remove(0, itemToChange->
itemName().size()).toInt();
 
  747                     if (item_index > glob_index)
 
  748                         glob_index = item_index;
 
#define ASSERT(condition)
 
Defines class ColorMapSceneAdaptor.
 
Defines class GUIHelpers functions.
 
Defines class IntensityDataItem.
 
Defines class MaskGraphicsProxy.
 
Defines class MaskGraphicsScene.
 
Defines MaskItems classes.
 
Defines class MaskViewFactory.
 
Defines PolygonView class.
 
Defines class SessionModel.
 
Performs conversion of MaskItems coordinates between ColorMap and GraphicsScene.
 
The ColorMap class presents 2D intensity data from IntensityDataItem as color map.
 
static const QString P_XRADIUS
 
static const QString P_YRADIUS
 
static const QString P_XCENTER
 
static const QString P_YCENTER
 
static const QString P_POSY
 
Main interface class for views representing MaskItems, Projections on graphics scene.
 
virtual void addView(IShape2DView *childView, int row=0)
 
QString activityToModelType() const
Returns model type corresponding to current activity.
 
bool isPolygonMode() const
 
int activityToRow() const
Returns model row corresponding to given activity.
 
bool isInZoomMode() const
 
void setDrawingInProgress(bool value)
 
void setActivityType(MaskEditorFlags::Activity value)
 
bool isVerticalLineMode() const
 
bool isRectangleShapeMode() const
 
bool isActivityRequiresDrawingCancel(MaskEditorFlags::Activity proposed_new_activity)
return true, if proposed activity requires the cancel of drawing i.e.
 
bool isMaskAllMode() const
 
bool isHorizontalLineMode() const
 
bool getMaskValue() const
 
bool isDrawingInProgress() const
 
void setMaskValue(MaskEditorFlags::MaskValue value)
 
Graphics proxy to place QWidget inside QGraphicsScene, used by MaskEditorCanvas.
 
void setIntensityItem(IntensityDataItem *item)
 
void setInZoomMode(bool value)
Sets widget to zoom mode, when signals (zoom wheel, mouse clicks) are send down to ColorMap plot.
 
void setSceneAdaptor(ISceneAdaptor *sceneAdaptor)
 
PolygonView * currentPolygon() const
Returns polygon which is currently under the drawing.
 
void mousePressEvent(QGraphicsSceneMouseEvent *event)
 
bool isAreaContains(QGraphicsSceneMouseEvent *event, MaskEditorHelper::EViewTypes viewType)
Return true if area beneath the mouse contains views of given type.
 
bool isValidMouseClick(QGraphicsSceneMouseEvent *event)
Returns true if left mouse bottom click was inside ColorMap viewport rectangle.
 
void setSelectionModel(QItemSelectionModel *model)
 
QPointF m_currentMousePosition
 
void updateScene()
Main method to update scene on various changes in the model.
 
MaskGraphicsScene(QObject *parent=0)
 
void processLineItem(QGraphicsSceneMouseEvent *event)
 
void processVerticalLineItem(const QPointF &pos)
 
SessionModel * m_maskModel
 
void setZValues()
Update Z-values of all IMaskView to reflect stacking order in SessionModel.
 
void setDrawingInProgress(bool value)
 
void processPolygonItem(QGraphicsSceneMouseEvent *event)
 
void processMaskAllItem(QGraphicsSceneMouseEvent *event)
 
void setInPanAndZoomMode(bool value)
Sets the state of all views in pan&zoom mode.
 
QItemSelectionModel * m_selectionModel
 
void processHorizontalLineItem(const QPointF &pos)
 
void drawForeground(QPainter *painter, const QRectF &rect)
Draws dashed line to the current mouse position in the case of ungoing line or polygon drawing.
 
void onMaskValueChanged(MaskEditorFlags::MaskValue value)
 
void updateViews(const QModelIndex &parentIndex={}, IShape2DView *parentView=0)
Recutsively runs through the model and creates corresponding views.
 
void deleteViews(const QModelIndex &itemIndex)
Recursive delete of all views corresponding to given index.
 
IntensityDataItem * m_intensityItem
 
void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
 
void processRectangleShapeItem(QGraphicsSceneMouseEvent *event)
Processes RectangleItem and EllipseItem drawing If the mouse move distance with left button down is l...
 
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
Finalizes item drawing or pass events to other items.
 
bool isDrawingInProgress() const
 
void removeItemViewFromScene(SessionItem *item)
Removes single view from scene.
 
void itemContextMenuRequest(const QPoint &point)
 
MaskGraphicsProxy * m_proxy
 
void setMaskContext(SessionModel *model, const QModelIndex &maskContainerIndex, IntensityDataItem *intensityItem)
 
void cancelCurrentDrawing()
 
void onSceneSelectionChanged()
Propagates selection from scene to model.
 
IShape2DView * addViewForItem(SessionItem *item)
Creates a view for given item.
 
bool isValidForMaskAllDrawing(QGraphicsSceneMouseEvent *event)
Returns true if MaskAllItem can be drawn. Only one item of such type is allowed.
 
bool isValidForRectangleShapeDrawing(QGraphicsSceneMouseEvent *event)
Returns true if mouse click is valid for rectangular/elliptic/ROI shapes.
 
void onRowsInserted(const QModelIndex &, int, int)
 
bool isValidForPolygonDrawing(QGraphicsSceneMouseEvent *event)
Returns true if mouse click is in context suitable for polygon drawing.
 
void setItemName(SessionItem *itemToChange)
Sets item name depending on alreay existent items.
 
MaskDrawingContext m_context
 
QModelIndex m_maskContainerIndex
 
bool isValidForLineDrawing(QGraphicsSceneMouseEvent *event)
Returns true if mouse click is in context suitable for line drawing.
 
QMap< SessionItem *, IShape2DView * > m_ItemToView
 
void onRowsRemoved(const QModelIndex &, int, int)
 
void makeViewAtMousePosSelected(QGraphicsSceneMouseEvent *event)
 
void updateProxyWidget()
Updates proxy widget for intensity data item.
 
void onSessionSelectionChanged(const QItemSelection &, const QItemSelection &)
Propagates selection from model to scene.
 
void onRowsAboutToBeRemoved(const QModelIndex &parent, int first, int last)
 
void updateCursors()
Change cursor to stress that hovered item is movable (when not in PanZoom mode)
 
SessionItem * m_currentItem
 
void contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
Creates item context menu if there is IMaskView beneath the mouse right click.
 
QSharedPointer< ISceneAdaptor > m_adaptor
 
void onActivityModeChanged(MaskEditorFlags::Activity value)
 
static const QString P_MASK_VALUE
 
static IShape2DView * createMaskView(SessionItem *item, ISceneAdaptor *adaptor=0)
 
static const QString P_POSX
 
static const QString P_POSY
 
This is a View of polygon mask (represented by PolygonItem) on GraphicsScene.
 
static const QString P_XUP
 
static const QString P_YLOW
 
static const QString P_YUP
 
static const QString P_XLOW
 
QString itemName() const
Get item name, return display name if no name is set.
 
void setItemName(const QString &name)
Set item name, add property if necessary.
 
void setItemValue(const QString &tag, const QVariant &variant)
Directly set value of item under given tag.
 
QString modelType() const
Get model type.
 
SessionItem * itemForIndex(const QModelIndex &index) const
 
T * insertItem(SessionItem *parent=nullptr, int row=-1, QString tag="")
 
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
 
virtual int rowCount(const QModelIndex &parent) const
 
virtual bool removeRows(int row, int count, const QModelIndex &parent)
 
SessionItem * insertNewItem(QString model_type, SessionItem *parent_item=nullptr, int row=-1, QString tag="")
 
QModelIndex indexOfItem(SessionItem *item) const
 
static const QString P_POSX