27#include "moc_qgslayoutviewtoolselect.cpp"
29const double QgsLayoutViewToolSelect::sSearchToleranceInMillimeters = 2.0;
37 mRubberBand = std::make_unique<QgsLayoutViewRectangularRubberBand>(
view );
38 mRubberBand->setBrush( QBrush( QColor( 224, 178, 76, 63 ) ) );
39 mRubberBand->setPen( QPen( QBrush( QColor( 254, 58, 29, 100 ) ), 0, Qt::DotLine ) );
47 if ( mMouseHandles->scene() )
48 mMouseHandles->scene()->removeItem( mMouseHandles );
49 mMouseHandles->deleteLater();
55 if ( mMouseHandles->shouldBlockEvent( event ) )
60 if ( mMouseHandles->isVisible() )
75 if ( event->button() != Qt::LeftButton )
80 mRubberBand->finish();
91 if ( event->modifiers() & Qt::ControlModifier )
95 if ( !selectedItems.isEmpty() )
97 previousSelectedItem = selectedItems.at( 0 );
101 if ( previousSelectedItem )
126 selectedItem = group;
132 mMousePressStartPos =
event->pos();
133 mRubberBand->start( event->
layoutPoint(), Qt::KeyboardModifiers() );
137 if ( ( event->modifiers() & Qt::ShiftModifier ) && ( selectedItem->isSelected() ) )
144 if ( !selectedItems.isEmpty() )
155 if ( ( !selectedItem->isSelected() ) &&
156 !( event->modifiers() & Qt::ShiftModifier ) )
168 mMouseHandles->startMove(
view()->mapToScene( event->pos() ) );
178 mRubberBand->update( event->
layoutPoint(), Qt::KeyboardModifiers() );
182 if ( !mMouseHandles->isDragging() && !mMouseHandles->isResizing() )
186 view()->viewport()->setCursor( Qt::SizeAllCursor );
190 view()->viewport()->setCursor( Qt::ArrowCursor );
199 if ( event->button() != Qt::LeftButton && mMouseHandles->shouldBlockEvent( event ) )
205 if ( !mIsSelecting || event->button() != Qt::LeftButton )
211 mIsSelecting =
false;
212 bool wasClick = !
isClickAndDrag( mMousePressStartPos, event->pos() );
216 QRectF rect = mRubberBand->finish( event->
layoutPoint() );
218 bool subtractingSelection =
false;
219 if ( event->modifiers() & Qt::ShiftModifier )
223 else if ( event->modifiers() & Qt::ControlModifier )
226 subtractingSelection =
true;
235 Qt::ItemSelectionMode selectionMode = Qt::IntersectsItemShape;
236 if ( event->modifiers() & Qt::AltModifier )
239 selectionMode = Qt::ContainsItemShape;
243 QList<QGraphicsItem *> itemList;
247 itemList =
layout()->items( QRectF( rect.center().x() - tolerance, rect.center().y() - tolerance, 2 * tolerance, 2 * tolerance ), selectionMode );
250 itemList =
layout()->items( rect, selectionMode );
253 for ( QGraphicsItem *item : std::as_const( itemList ) )
258 focusedPaperItem = paperItem;
260 if ( layoutItem && !paperItem )
264 if ( subtractingSelection )
284 if ( !selectedItemList.isEmpty() )
288 else if ( focusedPaperItem )
296 mMouseHandles->selectionChanged();
301 if ( mMouseHandles->shouldBlockEvent( event ) )
314 if ( mMouseHandles->isDragging() || mMouseHandles->isResizing() )
328 mRubberBand->finish();
329 mIsSelecting =
false;
335QgsLayoutMouseHandles *QgsLayoutViewToolSelect::mouseHandles()
337 return mMouseHandles;
344 mMouseHandles->deleteLater();
347 mMouseHandles =
new QgsLayoutMouseHandles(
layout,
view() );
348 mMouseHandles->hide();
350 layout->addItem( mMouseHandles );
354 const double pixelsPerMm =
view()->physicalDpiX() / 25.4;
355 return sSearchToleranceInMillimeters * pixelsPerMm /
view()->transform().m11();
MouseHandlesAction
Action to be performed by the mouse handles.
A container for grouping several QgsLayoutItems.
Item representing the paper in a layout.
Base class for graphical items within a QgsLayout.
QgsLayoutItemGroup * parentGroup() const
Returns the item's parent group, if the item is part of a QgsLayoutItemGroup group.
virtual void setSelected(bool selected)
Sets whether the item should be selected.
bool isLocked() const
Returns true if the item is locked, and cannot be interacted with using the mouse.
A mouse event which is the result of a user interaction with a QgsLayoutView.
QPointF layoutPoint() const
Returns the event point location in layout coordinates.
A graphical widget to display and interact with QgsLayouts.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
QgsLayoutItem * layoutItemAt(QPointF position, bool ignoreLocked=false, double searchTolerance=0) const
Returns the topmost layout item at a specified position.
QList< QgsLayoutItem * > selectedLayoutItems(bool includeLockedItems=true)
Returns list of selected layout items.
void setSelectedItem(QgsLayoutItem *item)
Clears any selected items and sets item as the current selection.
@ ZMouseHandles
Z-value for mouse handles.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.