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() )
76 if ( event->button() != Qt::LeftButton )
83 QgsModelComponentGraphicItem *selectedItem =
nullptr;
92 mMousePressStartPos =
event->pos();
93 mRubberBand->start( event->
modelPoint(), Qt::KeyboardModifiers() );
97 if ( ( event->modifiers() & Qt::ShiftModifier ) && ( selectedItem->isSelected() ) )
100 selectedItem->setSelected(
false );
103 const QList<QgsModelComponentGraphicItem *> selectedItems =
scene()->selectedComponentItems();
104 if ( !selectedItems.isEmpty() )
115 if ( ( !selectedItem->isSelected() ) &&
116 !( event->modifiers() & Qt::ShiftModifier ) )
118 scene()->setSelectedItem( selectedItem );
122 selectedItem->setSelected(
true );
127 if ( !( event->modifiers() & Qt::ShiftModifier ) )
131 const QList<QGraphicsItem *> items =
scene()->items( event->
modelPoint() );
132 for ( QGraphicsItem *item : items )
134 if ( QgsModelDesignerSocketGraphicItem *socket =
dynamic_cast<QgsModelDesignerSocketGraphicItem *
>( item ) )
137 mLinkTool->setFromSocket( socket );
138 view()->setTool( mLinkTool.get() );
140 else if ( QgsModelDesignerFlatButtonGraphicItem *button =
dynamic_cast<QgsModelDesignerFlatButtonGraphicItem *
>( item ) )
143 if ( mMouseHandles->sceneBoundingRect().contains( event->
modelPoint() ) )
145 button->modelPressEvent( event );
161 mRubberBand->update( event->
modelPoint(), Qt::KeyboardModifiers() );
168 for ( QGraphicsItem *item : items )
170 if ( mHoverEnteredItems.contains( item ) )
172 if ( QgsModelComponentGraphicItem *component =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
174 component->modelHoverMoveEvent( event );
179 mHoverEnteredItems.append( item );
180 if ( QgsModelComponentGraphicItem *component =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
182 component->modelHoverEnterEvent( event );
184 else if ( QgsModelDesignerFlatButtonGraphicItem *button =
dynamic_cast<QgsModelDesignerFlatButtonGraphicItem *
>( item ) )
187 if ( mMouseHandles->sceneBoundingRect().contains( event->
modelPoint() ) )
188 button->modelHoverEnterEvent( event );
192 const QList<QGraphicsItem *> prevHovered = mHoverEnteredItems;
193 for ( QGraphicsItem *item : prevHovered )
195 if ( !items.contains( item ) )
197 mHoverEnteredItems.removeAll( item );
198 if ( QgsModelComponentGraphicItem *component =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
200 component->modelHoverLeaveEvent( event );
202 else if ( QgsModelDesignerFlatButtonGraphicItem *button =
dynamic_cast<QgsModelDesignerFlatButtonGraphicItem *
>( item ) )
205 if ( mMouseHandles->sceneBoundingRect().contains( event->
modelPoint() ) )
206 button->modelHoverLeaveEvent( event );
222 for ( QGraphicsItem *item : items )
224 if ( QgsModelComponentGraphicItem *component =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
226 scene()->setSelectedItem( component );
227 component->modelDoubleClickEvent( event );
236 if ( event->button() != Qt::LeftButton && mMouseHandles->shouldBlockEvent( event ) )
242 if ( !mIsSelecting || event->button() != Qt::LeftButton )
248 mIsSelecting =
false;
249 bool wasClick = !
isClickAndDrag( mMousePressStartPos, event->pos() );
253 QRectF rect = mRubberBand->finish( event->
modelPoint() );
255 bool subtractingSelection =
false;
256 if ( event->modifiers() & Qt::ShiftModifier )
260 else if ( event->modifiers() & Qt::ControlModifier )
263 subtractingSelection =
true;
272 Qt::ItemSelectionMode selectionMode = Qt::IntersectsItemShape;
273 if ( event->modifiers() & Qt::AltModifier )
276 selectionMode = Qt::ContainsItemShape;
280 QList<QGraphicsItem *> itemList;
282 itemList =
scene()->items( rect.center(), selectionMode );
284 itemList =
scene()->items( rect, selectionMode );
285 for ( QGraphicsItem *item : std::as_const( itemList ) )
287 if ( QgsModelComponentGraphicItem *componentItem =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
289 if ( subtractingSelection )
291 componentItem->setSelected(
false );
295 componentItem->setSelected(
true );
306 const QList<QgsModelComponentGraphicItem *> selectedItemList =
scene()->selectedComponentItems();
307 if ( !selectedItemList.isEmpty() )
315 mMouseHandles->selectionChanged();
320 if ( mMouseHandles->shouldBlockEvent( event ) )
333 if ( mMouseHandles->isDragging() || mMouseHandles->isResizing() )
347 mRubberBand->finish();
348 mIsSelecting =
false;
355 return !mIsSelecting;
360 return mMouseHandles;
367 mMouseHandles->deleteLater();
370 mMouseHandles =
new QgsModelViewMouseHandles(
view() );
371 mMouseHandles->hide();
372 mMouseHandles->setZValue( QgsModelGraphicsScene::MouseHandles );
373 scene->addItem( mMouseHandles );
378 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.