28#include "moc_qgsmodelviewtoolselect.cpp"
35 mRubberBand = std::make_unique<QgsModelViewRectangularRubberBand>(
view );
36 mRubberBand->setBrush( QBrush( QColor( 224, 178, 76, 63 ) ) );
37 mRubberBand->setPen( QPen( QBrush( QColor( 254, 58, 29, 100 ) ), 0, Qt::DotLine ) );
39 mLinkTool = std::make_unique<QgsModelViewToolLink>(
view );
47 if ( mMouseHandles->scene() )
48 mMouseHandles->scene()->removeItem( mMouseHandles );
55 if ( mMouseHandles->shouldBlockEvent( event ) )
61 if ( mMouseHandles->isVisible() )
74 if ( event->button() != Qt::LeftButton )
81 QgsModelComponentGraphicItem *selectedItem =
nullptr;
90 mMousePressStartPos =
event->pos();
91 mRubberBand->start( event->
modelPoint(), Qt::KeyboardModifiers() );
95 if ( ( event->modifiers() & Qt::ShiftModifier ) && ( selectedItem->isSelected() ) )
98 selectedItem->setSelected(
false );
101 const QList<QgsModelComponentGraphicItem *> selectedItems =
scene()->selectedComponentItems();
102 if ( !selectedItems.isEmpty() )
113 if ( ( !selectedItem->isSelected() ) &&
114 !( event->modifiers() & Qt::ShiftModifier ) )
116 scene()->setSelectedItem( selectedItem );
120 selectedItem->setSelected(
true );
125 if ( !( event->modifiers() & Qt::ShiftModifier ) )
129 const QList<QGraphicsItem *> items =
scene()->items( event->
modelPoint() );
130 for ( QGraphicsItem *item : items )
132 if ( QgsModelDesignerSocketGraphicItem *socket =
dynamic_cast<QgsModelDesignerSocketGraphicItem *
>( item ) )
135 mLinkTool->setFromSocket( socket );
136 view()->setTool( mLinkTool.get() );
138 else if ( QgsModelDesignerFlatButtonGraphicItem *button =
dynamic_cast<QgsModelDesignerFlatButtonGraphicItem *
>( item ) )
141 if ( mMouseHandles->sceneBoundingRect().contains( event->
modelPoint() ) )
143 button->modelPressEvent( event );
159 mRubberBand->update( event->
modelPoint(), Qt::KeyboardModifiers() );
166 for ( QGraphicsItem *item : items )
168 if ( mHoverEnteredItems.contains( item ) )
170 if ( QgsModelComponentGraphicItem *component =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
172 component->modelHoverMoveEvent( event );
177 mHoverEnteredItems.append( item );
178 if ( QgsModelComponentGraphicItem *component =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
180 component->modelHoverEnterEvent( event );
182 else if ( QgsModelDesignerFlatButtonGraphicItem *button =
dynamic_cast<QgsModelDesignerFlatButtonGraphicItem *
>( item ) )
185 if ( mMouseHandles->sceneBoundingRect().contains( event->
modelPoint() ) )
186 button->modelHoverEnterEvent( event );
190 const QList<QGraphicsItem *> prevHovered = mHoverEnteredItems;
191 for ( QGraphicsItem *item : prevHovered )
193 if ( !items.contains( item ) )
195 mHoverEnteredItems.removeAll( item );
196 if ( QgsModelComponentGraphicItem *component =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
198 component->modelHoverLeaveEvent( event );
200 else if ( QgsModelDesignerFlatButtonGraphicItem *button =
dynamic_cast<QgsModelDesignerFlatButtonGraphicItem *
>( item ) )
203 if ( mMouseHandles->sceneBoundingRect().contains( event->
modelPoint() ) )
204 button->modelHoverLeaveEvent( event );
220 for ( QGraphicsItem *item : items )
222 if ( QgsModelComponentGraphicItem *component =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
224 scene()->setSelectedItem( component );
225 component->modelDoubleClickEvent( event );
234 if ( event->button() != Qt::LeftButton && mMouseHandles->shouldBlockEvent( event ) )
240 if ( !mIsSelecting || event->button() != Qt::LeftButton )
246 mIsSelecting =
false;
247 bool wasClick = !
isClickAndDrag( mMousePressStartPos, event->pos() );
251 QRectF rect = mRubberBand->finish( event->
modelPoint() );
253 bool subtractingSelection =
false;
254 if ( event->modifiers() & Qt::ShiftModifier )
258 else if ( event->modifiers() & Qt::ControlModifier )
261 subtractingSelection =
true;
270 Qt::ItemSelectionMode selectionMode = Qt::IntersectsItemShape;
271 if ( event->modifiers() & Qt::AltModifier )
274 selectionMode = Qt::ContainsItemShape;
278 QList<QGraphicsItem *> itemList;
280 itemList =
scene()->items( rect.center(), selectionMode );
282 itemList =
scene()->items( rect, selectionMode );
283 for ( QGraphicsItem *item : std::as_const( itemList ) )
285 if ( QgsModelComponentGraphicItem *componentItem =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
287 if ( subtractingSelection )
289 componentItem->setSelected(
false );
293 componentItem->setSelected(
true );
304 const QList<QgsModelComponentGraphicItem *> selectedItemList =
scene()->selectedComponentItems();
305 if ( !selectedItemList.isEmpty() )
313 mMouseHandles->selectionChanged();
318 if ( mMouseHandles->shouldBlockEvent( event ) )
331 if ( mMouseHandles->isDragging() || mMouseHandles->isResizing() )
345 mRubberBand->finish();
346 mIsSelecting =
false;
353 return !mIsSelecting;
358 return mMouseHandles;
365 mMouseHandles->deleteLater();
368 mMouseHandles =
new QgsModelViewMouseHandles(
view() );
369 mMouseHandles->hide();
370 mMouseHandles->setZValue( QgsModelGraphicsScene::MouseHandles );
371 scene->addItem( mMouseHandles );
376 mHoverEnteredItems.clear();
MouseHandlesAction
Action to be performed by the mouse handles.
A mouse event which is the result of a user interaction with a QgsModelGraphicsView.
QPointF modelPoint() const
Returns the event point location in model coordinates.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.