30 #include <QGraphicsView>
31 #include <QGraphicsSceneHoverEvent>
39 : QgsGraphicsViewMouseHandles( view )
44 connect( mLayout, &QGraphicsScene::selectionChanged,
this, &QgsLayoutMouseHandles::selectionChanged );
46 mHorizontalSnapLine = mView->createSnapLine();
47 mHorizontalSnapLine->hide();
48 layout->addItem( mHorizontalSnapLine );
49 mVerticalSnapLine = mView->createSnapLine();
50 mVerticalSnapLine->hide();
51 layout->addItem( mVerticalSnapLine );
54 void QgsLayoutMouseHandles::paint( QPainter *painter,
const QStyleOptionGraphicsItem *option, QWidget *widget )
56 paintInternal( painter, mLayout->renderContext().isPreviewRender(),
57 mLayout->renderContext().boundingBoxesVisible(),
true, option, widget );
60 void QgsLayoutMouseHandles::selectionChanged()
63 const QList<QGraphicsItem *> itemList = layout()->items();
64 for ( QGraphicsItem *graphicsItem : itemList )
70 if ( item->isSelected() )
90 void QgsLayoutMouseHandles::setViewportCursor( Qt::CursorShape cursor )
95 if ( qobject_cast< QgsLayoutViewToolSelect *>( mView->tool() ) )
97 mView->viewport()->setCursor( cursor );
101 QList<QGraphicsItem *> QgsLayoutMouseHandles::sceneItemsAtPoint( QPointF scenePoint )
103 QList< QGraphicsItem * > items = mLayout->items( scenePoint );
104 items.erase( std::remove_if( items.begin(), items.end(), []( QGraphicsItem * item )
106 return !dynamic_cast<QgsLayoutItem *>( item );
112 QList<QGraphicsItem *> QgsLayoutMouseHandles::selectedSceneItems(
bool includeLockedItems )
const
114 QList<QGraphicsItem *> res;
115 const QList<QgsLayoutItem *> layoutItems = mLayout->selectedLayoutItems( includeLockedItems );
116 res.reserve( layoutItems.size() );
122 bool QgsLayoutMouseHandles::itemIsLocked( QGraphicsItem *item )
130 bool QgsLayoutMouseHandles::itemIsGroupMember( QGraphicsItem *item )
133 return layoutItem->isGroupMember();
138 QRectF QgsLayoutMouseHandles::itemRect( QGraphicsItem *item )
const
141 return layoutItem->rectWithFrame();
146 QPointF QgsLayoutMouseHandles::snapPoint( QPointF originalPoint, QgsLayoutMouseHandles::SnapGuideMode mode,
bool snapHorizontal,
bool snapVertical )
148 bool snapped =
false;
150 const QList< QGraphicsItem * > selectedItems = selectedSceneItems();
151 QList< QGraphicsItem * > itemsToExclude;
152 expandItemList( selectedItems, itemsToExclude );
154 QList< QgsLayoutItem * > layoutItemsToExclude;
155 for ( QGraphicsItem *item : itemsToExclude )
156 layoutItemsToExclude << dynamic_cast< QgsLayoutItem * >( item );
159 QPointF snappedPoint;
163 snappedPoint = mLayout->snapper().snapRect( rect().translated( originalPoint ), mView->transform().m11(), snapped, snapHorizontal ? mHorizontalSnapLine :
nullptr,
164 snapVertical ? mVerticalSnapLine :
nullptr, &layoutItemsToExclude ).topLeft();
167 snappedPoint = mLayout->snapper().snapPoint( originalPoint, mView->transform().m11(), snapped, snapHorizontal ? mHorizontalSnapLine :
nullptr,
168 snapVertical ? mVerticalSnapLine :
nullptr, &layoutItemsToExclude );
172 return snapped ? snappedPoint : originalPoint;
175 void QgsLayoutMouseHandles::createItemCommand( QGraphicsItem *item )
177 mItemCommand.reset( qgis::down_cast< QgsLayoutItem * >( item )->createCommand( QString(), 0 ) );
178 mItemCommand->saveBeforeState();
181 void QgsLayoutMouseHandles::endItemCommand( QGraphicsItem * )
183 mItemCommand->saveAfterState();
184 mLayout->undoStack()->push( mItemCommand.release() );
187 void QgsLayoutMouseHandles::startMacroCommand(
const QString &text )
189 mLayout->undoStack()->beginMacro( text );
193 void QgsLayoutMouseHandles::endMacroCommand()
195 mLayout->undoStack()->endMacro();
198 void QgsLayoutMouseHandles::hideAlignItems()
200 mHorizontalSnapLine->hide();
201 mVerticalSnapLine->hide();
204 void QgsLayoutMouseHandles::expandItemList(
const QList<QGraphicsItem *> &items, QList<QGraphicsItem *> &collected )
const
206 for ( QGraphicsItem *item : items )
211 const QList<QgsLayoutItem *> groupItems =
static_cast< QgsLayoutItemGroup *
>( item )->items();
212 collected.reserve( collected.size() + groupItems.size() );
214 collected.append( groupItem );
223 void QgsLayoutMouseHandles::moveItem( QGraphicsItem *item,
double deltaX,
double deltaY )
225 qgis::down_cast< QgsLayoutItem * >( item )->
attemptMoveBy( deltaX, deltaY );
228 void QgsLayoutMouseHandles::setItemRect( QGraphicsItem *item, QRectF rect )
234 void QgsLayoutMouseHandles::showStatusMessage(
const QString &message )
239 mView->pushStatusMessage( message );
A container for grouping several QgsLayoutItems.
@ LayoutGroup
Grouped item.
Base class for graphical items within a QgsLayout.
void rotationChanged(double newRotation)
Emitted on item rotation change.
bool isLocked() const
Returns true if the item is locked, and cannot be interacted with using the mouse.
void sizePositionChanged()
Emitted when the item's size or position changes.
void lockChanged()
Emitted if the item's lock status changes.
void frameChanged()
Emitted if the item's frame style changes.
void attemptMoveBy(double deltaX, double deltaY)
Attempts to shift the item's position by a specified deltaX and deltaY, in layout units.
void attemptSetSceneRect(const QRectF &rect, bool includesFrame=false)
Attempts to update the item's position and size to match the passed rect 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.