21 #include <QGraphicsView>
22 #include <QGraphicsSceneHoverEvent>
29 QgsGraphicsViewMouseHandles::QgsGraphicsViewMouseHandles( QGraphicsView *view )
31 , QGraphicsRectItem( nullptr )
35 setAcceptHoverEvents(
true );
38 void QgsGraphicsViewMouseHandles::paintInternal( QPainter *painter,
bool showHandles,
bool showStaticBoundingBoxes,
bool showTemporaryBoundingBoxes,
const QStyleOptionGraphicsItem *, QWidget * )
45 if ( showStaticBoundingBoxes )
48 double rectHandlerSize = rectHandlerBorderTolerance();
49 drawHandles( painter, rectHandlerSize );
52 if ( showTemporaryBoundingBoxes && ( mIsResizing || mIsDragging || showStaticBoundingBoxes ) )
55 drawSelectedItemBounds( painter );
59 QRectF QgsGraphicsViewMouseHandles::storedItemRect( QGraphicsItem *item )
const
61 return itemRect( item );
64 void QgsGraphicsViewMouseHandles::previewItemMove( QGraphicsItem *,
double,
double )
69 QRectF QgsGraphicsViewMouseHandles::previewSetItemRect( QGraphicsItem *, QRectF )
74 void QgsGraphicsViewMouseHandles::startMacroCommand(
const QString & )
79 void QgsGraphicsViewMouseHandles::endMacroCommand()
84 void QgsGraphicsViewMouseHandles::endItemCommand( QGraphicsItem * )
89 void QgsGraphicsViewMouseHandles::createItemCommand( QGraphicsItem * )
94 QPointF QgsGraphicsViewMouseHandles::snapPoint( QPointF originalPoint, QgsGraphicsViewMouseHandles::SnapGuideMode,
bool,
bool )
99 void QgsGraphicsViewMouseHandles::expandItemList(
const QList<QGraphicsItem *> &items, QList<QGraphicsItem *> &collected )
const
104 void QgsGraphicsViewMouseHandles::drawHandles( QPainter *painter,
double rectHandlerSize )
107 QPen handlePen = QPen( QColor( 55, 140, 195, 255 ) );
108 handlePen.setWidth( 0 );
109 painter->setPen( handlePen );
112 painter->setBrush( Qt::NoBrush );
113 painter->drawRect( QRectF( 0, 0, rect().width(), rect().height() ) );
116 painter->setBrush( QColor( 255, 255, 255, 255 ) );
118 painter->drawRect( QRectF( 0, 0, rectHandlerSize, rectHandlerSize ) );
120 painter->drawRect( QRectF( ( rect().width() - rectHandlerSize ) / 2, 0, rectHandlerSize, rectHandlerSize ) );
122 painter->drawRect( QRectF( rect().width() - rectHandlerSize, 0, rectHandlerSize, rectHandlerSize ) );
124 painter->drawRect( QRectF( 0, ( rect().height() - rectHandlerSize ) / 2, rectHandlerSize, rectHandlerSize ) );
126 painter->drawRect( QRectF( rect().width() - rectHandlerSize, ( rect().height() - rectHandlerSize ) / 2, rectHandlerSize, rectHandlerSize ) );
128 painter->drawRect( QRectF( 0, rect().height() - rectHandlerSize, rectHandlerSize, rectHandlerSize ) );
130 painter->drawRect( QRectF( ( rect().width() - rectHandlerSize ) / 2, rect().height() - rectHandlerSize, rectHandlerSize, rectHandlerSize ) );
132 painter->drawRect( QRectF( rect().width() - rectHandlerSize, rect().height() - rectHandlerSize, rectHandlerSize, rectHandlerSize ) );
135 void QgsGraphicsViewMouseHandles::drawSelectedItemBounds( QPainter *painter )
138 const QList<QGraphicsItem *> selectedItems = selectedSceneItems(
false );
139 if ( selectedItems.isEmpty() )
146 painter->setCompositionMode( QPainter::CompositionMode_Difference );
149 QPen selectedItemPen = QPen( QColor( 144, 144, 144, 255 ) );
150 selectedItemPen.setStyle( Qt::DashLine );
151 selectedItemPen.setWidth( 0 );
152 painter->setPen( selectedItemPen );
153 painter->setBrush( Qt::NoBrush );
155 QList< QGraphicsItem * > itemsToDraw;
156 expandItemList( selectedItems, itemsToDraw );
158 for ( QGraphicsItem *item : std::as_const( itemsToDraw ) )
161 QPolygonF itemBounds;
162 if ( isDragging() && !itemIsLocked( item ) )
166 QPolygonF itemSceneBounds = item->mapToScene( itemRect( item ) );
169 itemSceneBounds.translate( transform().dx(), transform().dy() );
171 itemBounds = mapFromScene( itemSceneBounds );
173 else if ( isResizing() && !itemIsLocked( item ) )
176 if ( selectedItems.size() > 1 )
179 QRectF thisItemRect = mapRectFromItem( item, itemRect( item ) );
181 relativeResizeRect( thisItemRect, QRectF( -mResizeMoveX, -mResizeMoveY, mBeginHandleWidth, mBeginHandleHeight ), mResizeRect );
182 itemBounds = QPolygonF( thisItemRect );
193 itemBounds = mapRectFromItem( item, itemRect( item ) );
199 path.addPolygon( itemBounds );
200 painter->drawPath( path );
204 double QgsGraphicsViewMouseHandles::rectHandlerBorderTolerance()
211 double viewScaleFactor = mView->transform().m11();
214 double rectHandlerSize = mHandleSize / viewScaleFactor;
217 if ( rectHandlerSize > ( rect().width() / 3 ) )
219 rectHandlerSize = rect().width() / 3;
221 if ( rectHandlerSize > ( rect().height() / 3 ) )
223 rectHandlerSize = rect().height() / 3;
225 return rectHandlerSize;
228 Qt::CursorShape QgsGraphicsViewMouseHandles::cursorForPosition( QPointF itemCoordPos )
230 QgsGraphicsViewMouseHandles::MouseAction mouseAction = mouseActionForPosition( itemCoordPos );
231 switch ( mouseAction )
234 return Qt::ForbiddenCursor;
236 return Qt::SizeAllCursor;
240 if ( ( rotation() <= 22.5 || rotation() >= 337.5 ) || ( rotation() >= 157.5 && rotation() <= 202.5 ) )
242 return Qt::SizeVerCursor;
244 else if ( ( rotation() >= 22.5 && rotation() <= 67.5 ) || ( rotation() >= 202.5 && rotation() <= 247.5 ) )
246 return Qt::SizeBDiagCursor;
248 else if ( ( rotation() >= 67.5 && rotation() <= 112.5 ) || ( rotation() >= 247.5 && rotation() <= 292.5 ) )
250 return Qt::SizeHorCursor;
254 return Qt::SizeFDiagCursor;
259 if ( ( rotation() <= 22.5 || rotation() >= 337.5 ) || ( rotation() >= 157.5 && rotation() <= 202.5 ) )
261 return Qt::SizeHorCursor;
263 else if ( ( rotation() >= 22.5 && rotation() <= 67.5 ) || ( rotation() >= 202.5 && rotation() <= 247.5 ) )
265 return Qt::SizeFDiagCursor;
267 else if ( ( rotation() >= 67.5 && rotation() <= 112.5 ) || ( rotation() >= 247.5 && rotation() <= 292.5 ) )
269 return Qt::SizeVerCursor;
273 return Qt::SizeBDiagCursor;
277 case ResizeRightDown:
279 if ( ( rotation() <= 22.5 || rotation() >= 337.5 ) || ( rotation() >= 157.5 && rotation() <= 202.5 ) )
281 return Qt::SizeFDiagCursor;
283 else if ( ( rotation() >= 22.5 && rotation() <= 67.5 ) || ( rotation() >= 202.5 && rotation() <= 247.5 ) )
285 return Qt::SizeVerCursor;
287 else if ( ( rotation() >= 67.5 && rotation() <= 112.5 ) || ( rotation() >= 247.5 && rotation() <= 292.5 ) )
289 return Qt::SizeBDiagCursor;
293 return Qt::SizeHorCursor;
298 if ( ( rotation() <= 22.5 || rotation() >= 337.5 ) || ( rotation() >= 157.5 && rotation() <= 202.5 ) )
300 return Qt::SizeBDiagCursor;
302 else if ( ( rotation() >= 22.5 && rotation() <= 67.5 ) || ( rotation() >= 202.5 && rotation() <= 247.5 ) )
304 return Qt::SizeHorCursor;
306 else if ( ( rotation() >= 67.5 && rotation() <= 112.5 ) || ( rotation() >= 247.5 && rotation() <= 292.5 ) )
308 return Qt::SizeFDiagCursor;
312 return Qt::SizeVerCursor;
315 return Qt::ArrowCursor;
318 return Qt::ArrowCursor;
321 QgsGraphicsViewMouseHandles::MouseAction QgsGraphicsViewMouseHandles::mouseActionForPosition( QPointF itemCoordPos )
323 bool nearLeftBorder =
false;
324 bool nearRightBorder =
false;
325 bool nearLowerBorder =
false;
326 bool nearUpperBorder =
false;
328 bool withinWidth =
false;
329 bool withinHeight =
false;
330 if ( itemCoordPos.x() >= 0 && itemCoordPos.x() <= rect().width() )
334 if ( itemCoordPos.y() >= 0 && itemCoordPos.y() <= rect().height() )
339 double borderTolerance = rectHandlerBorderTolerance();
341 if ( itemCoordPos.x() >= 0 && itemCoordPos.x() < borderTolerance )
343 nearLeftBorder =
true;
345 if ( itemCoordPos.y() >= 0 && itemCoordPos.y() < borderTolerance )
347 nearUpperBorder =
true;
349 if ( itemCoordPos.x() <= rect().width() && itemCoordPos.x() > ( rect().width() - borderTolerance ) )
351 nearRightBorder =
true;
353 if ( itemCoordPos.y() <= rect().height() && itemCoordPos.y() > ( rect().height() - borderTolerance ) )
355 nearLowerBorder =
true;
358 if ( nearLeftBorder && nearUpperBorder )
360 return QgsGraphicsViewMouseHandles::ResizeLeftUp;
362 else if ( nearLeftBorder && nearLowerBorder )
364 return QgsGraphicsViewMouseHandles::ResizeLeftDown;
366 else if ( nearRightBorder && nearUpperBorder )
368 return QgsGraphicsViewMouseHandles::ResizeRightUp;
370 else if ( nearRightBorder && nearLowerBorder )
372 return QgsGraphicsViewMouseHandles::ResizeRightDown;
374 else if ( nearLeftBorder && withinHeight )
376 return QgsGraphicsViewMouseHandles::ResizeLeft;
378 else if ( nearRightBorder && withinHeight )
380 return QgsGraphicsViewMouseHandles::ResizeRight;
382 else if ( nearUpperBorder && withinWidth )
384 return QgsGraphicsViewMouseHandles::ResizeUp;
386 else if ( nearLowerBorder && withinWidth )
388 return QgsGraphicsViewMouseHandles::ResizeDown;
392 QPointF scenePoint = mapToScene( itemCoordPos );
393 const QList<QGraphicsItem *> itemsAtCursorPos = sceneItemsAtPoint( scenePoint );
394 if ( itemsAtCursorPos.isEmpty() )
397 return QgsGraphicsViewMouseHandles::SelectItem;
399 for ( QGraphicsItem *graphicsItem : itemsAtCursorPos )
401 if ( graphicsItem && graphicsItem->isSelected() )
404 return QgsGraphicsViewMouseHandles::MoveItem;
409 return QgsGraphicsViewMouseHandles::SelectItem;
412 QgsGraphicsViewMouseHandles::MouseAction QgsGraphicsViewMouseHandles::mouseActionForScenePos( QPointF sceneCoordPos )
415 QPointF itemPos = mapFromScene( sceneCoordPos );
416 return mouseActionForPosition( itemPos );
419 bool QgsGraphicsViewMouseHandles::shouldBlockEvent( QInputEvent * )
const
421 return mIsDragging || mIsResizing;
424 void QgsGraphicsViewMouseHandles::selectedItemSizeChanged()
426 if ( !isDragging() && !isResizing() )
433 void QgsGraphicsViewMouseHandles::selectedItemRotationChanged()
435 if ( !isDragging() && !isResizing() )
442 void QgsGraphicsViewMouseHandles::hoverMoveEvent( QGraphicsSceneHoverEvent *event )
444 setViewportCursor( cursorForPosition( event->pos() ) );
447 void QgsGraphicsViewMouseHandles::hoverLeaveEvent( QGraphicsSceneHoverEvent *event )
450 setViewportCursor( Qt::ArrowCursor );
453 void QgsGraphicsViewMouseHandles::mousePressEvent( QGraphicsSceneMouseEvent *event )
455 if ( event->button() != Qt::LeftButton )
462 mMouseMoveStartPos =
event->lastScenePos();
463 mLastMouseEventPos =
event->lastScenePos();
465 mBeginMouseEventPos =
event->lastScenePos();
466 mBeginHandlePos = scenePos();
467 mBeginHandleWidth = rect().width();
468 mBeginHandleHeight = rect().height();
470 mCurrentMouseMoveAction = mouseActionForPosition( event->pos() );
474 if ( mCurrentMouseMoveAction == MoveItem )
479 else if ( mCurrentMouseMoveAction != SelectItem &&
480 mCurrentMouseMoveAction != NoAction )
484 mResizeRect = QRectF( 0, 0, mBeginHandleWidth, mBeginHandleHeight );
487 mCursorOffset = calcCursorEdgeOffset( mMouseMoveStartPos );
492 void QgsGraphicsViewMouseHandles::resetStatusBar()
494 const QList<QGraphicsItem *> selectedItems = selectedSceneItems(
false );
495 int selectedCount = selectedItems.size();
496 if ( selectedCount > 1 )
499 showStatusMessage( tr(
"%1 items selected" ).arg( selectedCount ) );
501 else if ( selectedCount == 1 )
504 showStatusMessage( tr(
"1 item selected" ) );
509 showStatusMessage( QString() );
513 void QgsGraphicsViewMouseHandles::mouseMoveEvent( QGraphicsSceneMouseEvent *event )
520 dragMouseMove( event->lastScenePos(), event->modifiers() & Qt::ShiftModifier, event->modifiers() & Qt::ControlModifier );
522 else if ( isResizing() )
527 resizeMouseMove( event->lastScenePos(), event->modifiers() & Qt::ShiftModifier, event->modifiers() & Qt::AltModifier );
530 mLastMouseEventPos =
event->lastScenePos();
533 void QgsGraphicsViewMouseHandles::mouseReleaseEvent( QGraphicsSceneMouseEvent *event )
535 if ( event->button() != Qt::LeftButton )
541 QPointF mouseMoveStopPoint =
event->lastScenePos();
542 double diffX = mouseMoveStopPoint.x() - mMouseMoveStartPos.x();
543 double diffY = mouseMoveStopPoint.y() - mMouseMoveStartPos.y();
546 if ( std::fabs( diffX ) < std::numeric_limits<double>::min() && std::fabs( diffY ) < std::numeric_limits<double>::min() )
555 if ( mCurrentMouseMoveAction == MoveItem )
558 startMacroCommand( tr(
"Move Items" ) );
560 QPointF mEndHandleMovePos = scenePos();
562 double deltaX = mEndHandleMovePos.x() - mBeginHandlePos.x();
563 double deltaY = mEndHandleMovePos.y() - mBeginHandlePos.y();
566 const QList<QGraphicsItem *> selectedItems = selectedSceneItems(
false );
567 for ( QGraphicsItem *item : selectedItems )
569 if ( itemIsLocked( item ) || ( item->flags() & QGraphicsItem::ItemIsSelectable ) == 0 || itemIsGroupMember( item ) )
575 createItemCommand( item );
576 moveItem( item, deltaX, deltaY );
577 endItemCommand( item );
581 else if ( mCurrentMouseMoveAction != NoAction )
584 startMacroCommand( tr(
"Resize Items" ) );
587 const QList<QGraphicsItem *> selectedItems = selectedSceneItems(
false );
588 for ( QGraphicsItem *item : selectedItems )
590 if ( itemIsLocked( item ) || ( item->flags() & QGraphicsItem::ItemIsSelectable ) == 0 )
595 createItemCommand( item );
598 if ( selectedItems.size() == 1 )
601 thisItemRect = mResizeRect;
606 thisItemRect = mapRectFromItem( item, itemRect( item ) );
607 relativeResizeRect( thisItemRect, QRectF( -mResizeMoveX, -mResizeMoveY, mBeginHandleWidth, mBeginHandleHeight ), mResizeRect );
610 thisItemRect = thisItemRect.normalized();
611 QPointF newPos = mapToScene( thisItemRect.topLeft() );
612 thisItemRect.moveTopLeft( newPos );
613 setItemRect( item, thisItemRect );
615 endItemCommand( item );
631 mCurrentMouseMoveAction = MoveItem;
632 setViewportCursor( Qt::ArrowCursor );
640 bool QgsGraphicsViewMouseHandles::selectionRotation(
double &rotation )
const
643 QList<QGraphicsItem *> selectedItems = selectedSceneItems(
false );
644 auto itemIter = selectedItems.constBegin();
647 double firstItemRotation = ( *itemIter )->rotation();
650 for ( ++itemIter; itemIter != selectedItems.constEnd(); ++itemIter )
652 if ( !
qgsDoubleNear( ( *itemIter )->rotation(), firstItemRotation ) )
660 rotation = firstItemRotation;
664 void QgsGraphicsViewMouseHandles::updateHandles()
669 QList<QGraphicsItem *> selectedItems = selectedSceneItems(
false );
670 if ( !selectedItems.isEmpty() )
676 if ( selectionRotation( rotation ) )
679 setRotation( rotation );
688 QRectF newHandleBounds = selectionBounds();
691 setRect( 0, 0, newHandleBounds.width(), newHandleBounds.height() );
692 setPos( mapToScene( newHandleBounds.topLeft() ) );
705 void QgsGraphicsViewMouseHandles::dragMouseMove( QPointF currentPosition,
bool lockMovement,
bool preventSnap )
713 double moveX = currentPosition.x() - mBeginMouseEventPos.x();
714 double moveY = currentPosition.y() - mBeginMouseEventPos.y();
717 QPointF upperLeftPoint( mBeginHandlePos.x() + moveX, mBeginHandlePos.y() + moveY );
719 QPointF snappedLeftPoint;
725 snappedLeftPoint = snapPoint( upperLeftPoint, Item );
730 snappedLeftPoint = upperLeftPoint;
735 double moveRectX = snappedLeftPoint.x() - mBeginHandlePos.x();
736 double moveRectY = snappedLeftPoint.y() - mBeginHandlePos.y();
742 if ( std::fabs( moveRectX ) <= std::fabs( moveRectY ) )
753 QTransform moveTransform;
754 moveTransform.translate( moveRectX, moveRectY );
755 setTransform( moveTransform );
757 const QList<QGraphicsItem *> selectedItems = selectedSceneItems(
false );
758 for ( QGraphicsItem *item : selectedItems )
760 previewItemMove( item, moveRectX, moveRectY );
763 showStatusMessage( tr(
"dx: %1 mm dy: %2 mm" ).arg( moveRectX ).arg( moveRectY ) );
766 void QgsGraphicsViewMouseHandles::resizeMouseMove( QPointF currentPosition,
bool lockRatio,
bool fromCenter )
773 double mx = 0.0, my = 0.0, rx = 0.0, ry = 0.0;
775 QPointF beginMousePos;
776 QPointF finalPosition;
781 bool snapVertical = mCurrentMouseMoveAction == ResizeLeft ||
782 mCurrentMouseMoveAction == ResizeRight ||
783 mCurrentMouseMoveAction == ResizeLeftUp ||
784 mCurrentMouseMoveAction == ResizeRightUp ||
785 mCurrentMouseMoveAction == ResizeLeftDown ||
786 mCurrentMouseMoveAction == ResizeRightDown;
788 bool snapHorizontal = mCurrentMouseMoveAction == ResizeUp ||
789 mCurrentMouseMoveAction == ResizeDown ||
790 mCurrentMouseMoveAction == ResizeLeftUp ||
791 mCurrentMouseMoveAction == ResizeRightUp ||
792 mCurrentMouseMoveAction == ResizeLeftDown ||
793 mCurrentMouseMoveAction == ResizeRightDown;
797 beginMousePos = mapFromScene( QPointF( mBeginMouseEventPos.x() - mCursorOffset.width(), mBeginMouseEventPos.y() - mCursorOffset.height() ) );
798 QPointF snappedPosition = snapPoint( QPointF( currentPosition.x() - mCursorOffset.width(), currentPosition.y() - mCursorOffset.height() ), Point, snapHorizontal, snapVertical );
799 finalPosition = mapFromScene( snappedPosition );
804 beginMousePos = mapFromScene( mBeginMouseEventPos );
805 finalPosition = mapFromScene( currentPosition );
808 double diffX = finalPosition.x() - beginMousePos.x();
809 double diffY = finalPosition.y() - beginMousePos.y();
812 if ( lockRatio && !
qgsDoubleNear( mBeginHandleHeight, 0.0 ) )
814 ratio = mBeginHandleWidth / mBeginHandleHeight;
817 switch ( mCurrentMouseMoveAction )
824 diffX = ( ( mBeginHandleHeight - diffY ) * ratio ) - mBeginHandleWidth;
844 diffX = ( ( mBeginHandleHeight + diffY ) * ratio ) - mBeginHandleWidth;
865 diffY = ( ( mBeginHandleWidth - diffX ) / ratio ) - mBeginHandleHeight;
884 diffY = ( ( mBeginHandleWidth + diffX ) / ratio ) - mBeginHandleHeight;
905 if ( ( mBeginHandleWidth - diffX ) / ( mBeginHandleHeight - diffY ) > ratio )
907 diffX = mBeginHandleWidth - ( ( mBeginHandleHeight - diffY ) * ratio );
911 diffY = mBeginHandleHeight - ( ( mBeginHandleWidth - diffX ) / ratio );
914 mx = diffX, my = diffY;
920 case ResizeRightDown:
925 if ( ( mBeginHandleWidth + diffX ) / ( mBeginHandleHeight + diffY ) > ratio )
927 diffX = ( ( mBeginHandleHeight + diffY ) * ratio ) - mBeginHandleWidth;
931 diffY = ( ( mBeginHandleWidth + diffX ) / ratio ) - mBeginHandleHeight;
936 rx = diffX, ry = diffY;
945 if ( ( mBeginHandleWidth + diffX ) / ( mBeginHandleHeight - diffY ) > ratio )
947 diffX = ( ( mBeginHandleHeight - diffY ) * ratio ) - mBeginHandleWidth;
951 diffY = mBeginHandleHeight - ( ( mBeginHandleWidth + diffX ) / ratio );
955 my = diffY, rx = diffX, ry = -diffY;
964 if ( ( mBeginHandleWidth - diffX ) / ( mBeginHandleHeight + diffY ) > ratio )
966 diffX = mBeginHandleWidth - ( ( mBeginHandleHeight + diffY ) * ratio );
970 diffY = ( ( mBeginHandleWidth - diffX ) / ratio ) - mBeginHandleHeight;
997 mResizeMoveX = mBeginHandleWidth + rx > 0 ? mx : mx + mBeginHandleWidth + rx;
998 mResizeMoveY = mBeginHandleHeight + ry > 0 ? my : my + mBeginHandleHeight + ry;
1001 QLineF translateLine = QLineF( 0, 0, mResizeMoveX, mResizeMoveY );
1002 translateLine.setAngle( translateLine.angle() - rotation() );
1003 QPointF sceneTranslate = translateLine.p2();
1006 QTransform itemTransform;
1007 itemTransform.translate( sceneTranslate.x(), sceneTranslate.y() );
1008 setTransform( itemTransform );
1011 if ( mBeginHandleWidth + rx >= 0 && mBeginHandleHeight + ry >= 0 )
1013 mResizeRect = QRectF( 0, 0, mBeginHandleWidth + rx, mBeginHandleHeight + ry );
1015 else if ( mBeginHandleHeight + ry >= 0 )
1017 mResizeRect = QRectF( QPointF( -( mBeginHandleWidth + rx ), 0 ), QPointF( 0, mBeginHandleHeight + ry ) );
1019 else if ( mBeginHandleWidth + rx >= 0 )
1021 mResizeRect = QRectF( QPointF( 0, -( mBeginHandleHeight + ry ) ), QPointF( mBeginHandleWidth + rx, 0 ) );
1025 mResizeRect = QRectF( QPointF( -( mBeginHandleWidth + rx ), -( mBeginHandleHeight + ry ) ), QPointF( 0, 0 ) );
1028 const QList<QGraphicsItem *> selectedItems = selectedSceneItems(
false );
1029 QRectF newHandleBounds;
1030 for ( QGraphicsItem *item : selectedItems )
1033 QRectF thisItemRect = mapRectFromScene( storedItemRect( item ) );
1035 relativeResizeRect( thisItemRect, QRectF( -mResizeMoveX, -mResizeMoveY, mBeginHandleWidth, mBeginHandleHeight ), mResizeRect );
1037 thisItemRect = mapRectFromScene( previewSetItemRect( item, mapRectToScene( thisItemRect ) ) );
1038 newHandleBounds = newHandleBounds.isValid() ? newHandleBounds.united( thisItemRect ) : thisItemRect;
1041 setRect( newHandleBounds.isValid() ? newHandleBounds : QRectF( 0, 0, std::fabs( mBeginHandleWidth + rx ), std::fabs( mBeginHandleHeight + ry ) ) );
1044 showStatusMessage( tr(
"width: %1 mm height: %2 mm" ).arg( rect().width() ).arg( rect().height() ) );
1048 void QgsGraphicsViewMouseHandles::setHandleSize(
double size )
1053 void QgsGraphicsViewMouseHandles::mouseDoubleClickEvent( QGraphicsSceneMouseEvent *event )
1058 QSizeF QgsGraphicsViewMouseHandles::calcCursorEdgeOffset( QPointF cursorPos )
1061 QPointF sceneMousePos = mapFromScene( cursorPos );
1063 switch ( mCurrentMouseMoveAction )
1066 case QgsGraphicsViewMouseHandles::ResizeUp:
1067 return QSizeF( 0, sceneMousePos.y() );
1069 case QgsGraphicsViewMouseHandles::ResizeDown:
1070 return QSizeF( 0, sceneMousePos.y() - rect().height() );
1073 case QgsGraphicsViewMouseHandles::ResizeLeft:
1074 return QSizeF( sceneMousePos.x(), 0 );
1076 case QgsGraphicsViewMouseHandles::ResizeRight:
1077 return QSizeF( sceneMousePos.x() - rect().width(), 0 );
1080 case QgsGraphicsViewMouseHandles::ResizeLeftUp:
1081 return QSizeF( sceneMousePos.x(), sceneMousePos.y() );
1083 case QgsGraphicsViewMouseHandles::ResizeRightDown:
1084 return QSizeF( sceneMousePos.x() - rect().width(), sceneMousePos.y() - rect().height() );
1086 case QgsGraphicsViewMouseHandles::ResizeRightUp:
1087 return QSizeF( sceneMousePos.x() - rect().width(), sceneMousePos.y() );
1089 case QgsGraphicsViewMouseHandles::ResizeLeftDown:
1090 return QSizeF( sceneMousePos.x(), sceneMousePos.y() - rect().height() );
1101 QRectF QgsGraphicsViewMouseHandles::selectionBounds()
const
1104 const QList<QGraphicsItem *> selectedItems = selectedSceneItems(
false );
1105 auto itemIter = selectedItems.constBegin();
1108 QRectF bounds = mapFromItem( ( *itemIter ), itemRect( *itemIter ) ).boundingRect();
1111 for ( ++itemIter; itemIter != selectedItems.constEnd(); ++itemIter )
1113 bounds = bounds.united( mapFromItem( ( *itemIter ), itemRect( *itemIter ) ).boundingRect() );
1119 void QgsGraphicsViewMouseHandles::relativeResizeRect( QRectF &rectToResize,
const QRectF &boundsBefore,
const QRectF &boundsAfter )
1122 double left = relativePosition( rectToResize.left(), boundsBefore.left(), boundsBefore.right(), boundsAfter.left(), boundsAfter.right() );
1123 double right = relativePosition( rectToResize.right(), boundsBefore.left(), boundsBefore.right(), boundsAfter.left(), boundsAfter.right() );
1124 double top = relativePosition( rectToResize.top(), boundsBefore.top(), boundsBefore.bottom(), boundsAfter.top(), boundsAfter.bottom() );
1125 double bottom = relativePosition( rectToResize.bottom(), boundsBefore.top(), boundsBefore.bottom(), boundsAfter.top(), boundsAfter.bottom() );
1127 rectToResize.setRect( left, top, right - left, bottom - top );
1130 double QgsGraphicsViewMouseHandles::relativePosition(
double position,
double beforeMin,
double beforeMax,
double afterMin,
double afterMax )
1133 double m = ( afterMax - afterMin ) / ( beforeMax - beforeMin );
1134 double c = afterMin - ( beforeMin * m );
1137 return m * position +
c;
Scoped object for saving and restoring a QPainter object's state.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)