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(
dynamic_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 dynamic_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 );