17#include "moc_qgsmodelviewtoolselect.cpp"
32 mRubberBand->setBrush( QBrush( QColor( 224, 178, 76, 63 ) ) );
33 mRubberBand->setPen( QPen( QBrush( QColor( 254, 58, 29, 100 ) ), 0, Qt::DotLine ) );
43 if ( mMouseHandles->scene() )
44 mMouseHandles->scene()->removeItem( mMouseHandles );
51 if ( mMouseHandles->shouldBlockEvent( event ) )
57 if ( mMouseHandles->isVisible() )
72 if ( event->button() != Qt::LeftButton )
79 QgsModelComponentGraphicItem *selectedItem =
nullptr;
88 mMousePressStartPos =
event->pos();
89 mRubberBand->start( event->
modelPoint(), Qt::KeyboardModifiers() );
93 if ( ( event->modifiers() & Qt::ShiftModifier ) && ( selectedItem->isSelected() ) )
96 selectedItem->setSelected(
false );
99 const QList<QgsModelComponentGraphicItem *> selectedItems =
scene()->selectedComponentItems();
100 if ( !selectedItems.isEmpty() )
111 if ( ( !selectedItem->isSelected() ) &&
112 !( event->modifiers() & Qt::ShiftModifier ) )
114 scene()->setSelectedItem( selectedItem );
118 selectedItem->setSelected(
true );
123 if ( !( event->modifiers() & Qt::ShiftModifier ) )
128 for ( QGraphicsItem *item : items )
130 if ( QgsModelDesignerSocketGraphicItem *socket =
dynamic_cast<QgsModelDesignerSocketGraphicItem *
>( item ) )
133 mLinkTool->setFromSocket( socket );
134 view()->setTool( mLinkTool.get() );
136 else if ( QgsModelDesignerFlatButtonGraphicItem *button =
dynamic_cast<QgsModelDesignerFlatButtonGraphicItem *
>( item ) )
139 if ( mMouseHandles->sceneBoundingRect().contains( event->
modelPoint() ) )
141 button->modelPressEvent( event );
157 mRubberBand->update( event->
modelPoint(), Qt::KeyboardModifiers() );
164 for ( QGraphicsItem *item : items )
166 if ( mHoverEnteredItems.contains( item ) )
168 if ( QgsModelComponentGraphicItem *component =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
170 component->modelHoverMoveEvent( event );
175 mHoverEnteredItems.append( item );
176 if ( QgsModelComponentGraphicItem *component =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
178 component->modelHoverEnterEvent( event );
180 else if ( QgsModelDesignerFlatButtonGraphicItem *button =
dynamic_cast<QgsModelDesignerFlatButtonGraphicItem *
>( item ) )
183 if ( mMouseHandles->sceneBoundingRect().contains( event->
modelPoint() ) )
184 button->modelHoverEnterEvent( event );
188 const QList<QGraphicsItem *> prevHovered = mHoverEnteredItems;
189 for ( QGraphicsItem *item : prevHovered )
191 if ( !items.contains( item ) )
193 mHoverEnteredItems.removeAll( item );
194 if ( QgsModelComponentGraphicItem *component =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
196 component->modelHoverLeaveEvent( event );
198 else if ( QgsModelDesignerFlatButtonGraphicItem *button =
dynamic_cast<QgsModelDesignerFlatButtonGraphicItem *
>( item ) )
201 if ( mMouseHandles->sceneBoundingRect().contains( event->
modelPoint() ) )
202 button->modelHoverLeaveEvent( event );
218 for ( QGraphicsItem *item : items )
220 if ( QgsModelComponentGraphicItem *component =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
222 scene()->setSelectedItem( component );
223 component->modelDoubleClickEvent( event );
232 if ( event->button() != Qt::LeftButton && mMouseHandles->shouldBlockEvent( event ) )
238 if ( !mIsSelecting || event->button() != Qt::LeftButton )
244 mIsSelecting =
false;
245 bool wasClick = !
isClickAndDrag( mMousePressStartPos, event->pos() );
249 QRectF rect = mRubberBand->finish( event->
modelPoint() );
251 bool subtractingSelection =
false;
252 if ( event->modifiers() & Qt::ShiftModifier )
256 else if ( event->modifiers() & Qt::ControlModifier )
259 subtractingSelection =
true;
268 Qt::ItemSelectionMode selectionMode = Qt::IntersectsItemShape;
269 if ( event->modifiers() & Qt::AltModifier )
272 selectionMode = Qt::ContainsItemShape;
276 QList<QGraphicsItem *> itemList;
278 itemList =
scene()->items( rect.center(), selectionMode );
280 itemList =
scene()->items( rect, selectionMode );
281 for ( QGraphicsItem *item : std::as_const( itemList ) )
283 if ( QgsModelComponentGraphicItem *componentItem =
dynamic_cast<QgsModelComponentGraphicItem *
>( item ) )
285 if ( subtractingSelection )
287 componentItem->setSelected(
false );
291 componentItem->setSelected(
true );
302 const QList<QgsModelComponentGraphicItem *> selectedItemList =
scene()->selectedComponentItems();
303 if ( !selectedItemList.isEmpty() )
311 mMouseHandles->selectionChanged();
316 if ( mMouseHandles->shouldBlockEvent( event ) )
329 if ( mMouseHandles->isDragging() || mMouseHandles->isResizing() )
343 mRubberBand->finish();
344 mIsSelecting =
false;
351 return !mIsSelecting;
356 return mMouseHandles;
363 mMouseHandles->deleteLater();
366 mMouseHandles =
new QgsModelViewMouseHandles(
view() );
367 mMouseHandles->hide();
368 mMouseHandles->setZValue( QgsModelGraphicsScene::MouseHandles );
369 scene->addItem( mMouseHandles );
374 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.
A rectangular rubber band for use within QgsModelGraphicsView widgets.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.