17#ifndef QGSGRAPHICSVIEWMOUSEHANDLES_H
18#define QGSGRAPHICSVIEWMOUSEHANDLES_H
27#include <QGraphicsRectItem>
48class GUI_EXPORT QgsGraphicsViewMouseHandles :
public QObject,
public QGraphicsRectItem
71 QgsGraphicsViewMouseHandles( QGraphicsView *view );
77 bool isDragging()
const {
return mIsDragging; }
80 bool isResizing()
const {
return mIsResizing; }
87 bool isRotating()
const {
return mIsRotating; }
89 bool shouldBlockEvent( QInputEvent *event )
const;
92 void startMove( QPointF sceneCoordPos );
101 bool isRotationEnabled()
const {
return mRotationEnabled; }
111 void setRotationEnabled(
bool enable );
120 void setCadMouseDigitizingModeEnabled(
bool enable );
125 void selectedItemSizeChanged();
128 void selectedItemRotationChanged();
131 void paintInternal( QPainter *painter,
bool showHandles,
bool showStaticBoundingBoxes,
bool showTemporaryBoundingBoxes,
const QStyleOptionGraphicsItem *option, QWidget *widget =
nullptr );
134 virtual void setViewportCursor( Qt::CursorShape cursor ) = 0;
136 virtual QList<QGraphicsItem *> sceneItemsAtPoint( QPointF scenePoint ) = 0;
137 virtual QList<QGraphicsItem *> selectedSceneItems(
bool includeLockedItems =
true )
const = 0;
138 virtual bool itemIsLocked( QGraphicsItem *item )
143 virtual bool itemIsGroupMember( QGraphicsItem *item )
148 virtual QRectF itemRect( QGraphicsItem *item )
const = 0;
149 virtual QRectF storedItemRect( QGraphicsItem *item )
const;
150 virtual void moveItem( QGraphicsItem *item,
double deltaX,
double deltaY ) = 0;
151 virtual void rotateItem( QGraphicsItem *item,
double deltaDegree,
double deltaCenterX,
double deltaCenterY );
152 virtual void previewItemMove( QGraphicsItem *item,
double deltaX,
double deltaY );
153 virtual void setItemRect( QGraphicsItem *item, QRectF rect ) = 0;
163 virtual QRectF previewSetItemRect( QGraphicsItem *item, QRectF rect );
165 virtual void startMacroCommand(
const QString &text );
166 virtual void endMacroCommand();
167 virtual void createItemCommand( QGraphicsItem *item );
168 virtual void endItemCommand( QGraphicsItem *item );
169 virtual void showStatusMessage(
const QString &message ) { Q_UNUSED( message ) }
170 virtual void hideAlignItems() {}
172 virtual QPointF snapPoint( QPointF originalPoint, SnapGuideMode mode,
bool snapHorizontal =
true,
bool snapVertical =
true );
175 virtual void expandItemList(
const QList<QGraphicsItem *> &items, QList<QGraphicsItem *> &collected )
const;
177 void mouseDoubleClickEvent( QGraphicsSceneMouseEvent *event )
override;
178 void hoverMoveEvent( QGraphicsSceneHoverEvent *event )
override;
179 void hoverLeaveEvent( QGraphicsSceneHoverEvent *event )
override;
180 void mousePressEvent( QGraphicsSceneMouseEvent *event )
override;
181 void mouseMoveEvent( QGraphicsSceneMouseEvent *event )
override;
182 void mouseReleaseEvent( QGraphicsSceneMouseEvent *event )
override;
185 void resetStatusBar();
188 bool selectionRotation(
double &rotation )
const;
191 void updateHandles();
194 void dragMouseMove( QPointF currentPosition,
bool lockMovement,
bool preventSnap );
197 void resizeMouseMove( QPointF currentPosition,
bool lockAspect,
bool fromCenter );
200 void rotateMouseMove( QPointF currentPosition,
bool snapToCommonAngles );
202 void setHandleSize(
double size );
208 QSizeF calcCursorEdgeOffset( QPointF cursorPos );
211 QRectF selectionBounds()
const;
221 static void relativeResizeRect( QRectF &rectToResize,
const QRectF &boundsBefore,
const QRectF &boundsAfter );
232 static double relativePosition(
double position,
double beforeMin,
double beforeMax,
double afterMin,
double afterMax );
235 QGraphicsView *mView =
nullptr;
237 double mHandleSize = 10;
238 double mRotationHandleSize = 20;
239 QPainterPath mRotationHandlePath;
241 QSizeF mCursorOffset;
242 double mResizeMoveX = 0;
243 double mResizeMoveY = 0;
246 double mBeginHandleWidth = 0;
247 double mBeginHandleHeight = 0;
251 bool mCadMouseDigitizingMode =
false;
253 bool mRotationEnabled =
false;
255 QPointF mRotationCenter;
257 double mRotationBegin = 0.0;
259 double mRotationCurrent = 0.0;
261 double mRotationDelta = 0.0;
264 QPointF mMouseMoveStartPos;
267 bool mDoubleClickInProgress =
false;
271 bool mIsDragging =
false;
273 bool mIsDragStarting =
false;
275 bool mIsResizing =
false;
277 bool mIsRotating =
false;
280 QPointF mBeginMouseEventPos;
283 QPointF mBeginHandlePos;
286 void drawHandles( QPainter *painter,
double rectHandlerSize );
289 void drawSelectedItemBounds( QPainter *painter );
295 double rectHandlerBorderTolerance()
const;
298 Qt::CursorShape cursorForPosition( QPointF itemCoordPos );
300 friend class QgsMapToolSelectAnnotation;
MouseHandlesAction
Action to be performed by the mouse handles.