33 , mAnnotation( annotation )
35 setFlag( QGraphicsItem::ItemIsSelectable,
true );
41 connect( mAnnotation, &
QgsAnnotation::moved,
this, &QgsMapCanvasAnnotationItem::setFeatureForMapPosition );
50 connect( mAnnotation, &QgsAnnotation::destroyed,
this, &QgsMapCanvasAnnotationItem::deleteLater );
53 setFeatureForMapPosition();
89 void QgsMapCanvasAnnotationItem::updateBoundingRect()
91 prepareGeometryChange();
94 double fillSymbolBleed = mAnnotation && mAnnotation->
fillSymbol() ?
97 const double mmToPixelScale =
mMapCanvas->logicalDpiX() / 25.4;
101 mBoundingRect = QRectF( - fillSymbolBleed, -fillSymbolBleed,
102 mmToPixelScale * mAnnotation->
frameSizeMm().width() + fillSymbolBleed * 2,
103 mmToPixelScale * mAnnotation->
frameSizeMm().height() + fillSymbolBleed * 2 );
107 double halfSymbolSize = 0.0;
110 halfSymbolSize = scaledSymbolSize() / 2.0;
116 QSizeF frameSize = mAnnotation ? QSizeF( mAnnotation->
frameSizeMm().width() * mmToPixelScale,
117 mAnnotation->
frameSizeMm().height() * mmToPixelScale ) : QSizeF( 0.0, 0.0 );
119 double xMinPos = std::min( -halfSymbolSize, offset.x() - fillSymbolBleed );
120 double xMaxPos = std::max( halfSymbolSize, offset.x() + frameSize.width() + fillSymbolBleed );
121 double yMinPos = std::min( -halfSymbolSize, offset.y() - fillSymbolBleed );
122 double yMaxPos = std::max( halfSymbolSize, offset.y() + frameSize.height() + fillSymbolBleed );
123 mBoundingRect = QRectF( xMinPos, yMinPos, xMaxPos - xMinPos, yMaxPos - yMinPos );
127 void QgsMapCanvasAnnotationItem::onCanvasLayersChanged()
133 else if ( !mAnnotation->
mapLayer() )
143 void QgsMapCanvasAnnotationItem::setFeatureForMapPosition()
159 mapPosition = ct.transform( mapPosition );
165 QgsRectangle searchRect( mapPosition.
x() - halfIdentifyWidth, mapPosition.
y() - halfIdentifyWidth,
166 mapPosition.
x() + halfIdentifyWidth, mapPosition.
y() + halfIdentifyWidth );
177 void QgsMapCanvasAnnotationItem::drawSelectionBoxes( QPainter *p )
const
184 double handlerSize = 10;
185 p->setPen( Qt::NoPen );
186 p->setBrush( QColor( 200, 200, 210, 120 ) );
187 p->drawRect( QRectF( mBoundingRect.left(), mBoundingRect.top(), handlerSize, handlerSize ) );
188 p->drawRect( QRectF( mBoundingRect.right() - handlerSize, mBoundingRect.top(), handlerSize, handlerSize ) );
189 p->drawRect( QRectF( mBoundingRect.right() - handlerSize, mBoundingRect.bottom() - handlerSize, handlerSize, handlerSize ) );
190 p->drawRect( QRectF( mBoundingRect.left(), mBoundingRect.bottom() - handlerSize, handlerSize, handlerSize ) );
195 QPointF itemPos = mapFromScene( pos );
197 int cursorSensitivity = 7;
200 std::fabs( itemPos.x() ) < cursorSensitivity && std::fabs( itemPos.y() ) < cursorSensitivity )
205 const double mmToPixelScale =
mMapCanvas->logicalDpiX() / 25.4;
208 QSizeF frameSize = mAnnotation ? mAnnotation->
frameSizeMm() * mmToPixelScale : QSizeF( 0, 0 );
210 bool left, right, up, down;
211 left = std::fabs( itemPos.x() - offset.x() ) < cursorSensitivity;
212 right = std::fabs( itemPos.x() - ( offset.x() + frameSize.width() ) ) < cursorSensitivity;
213 up = std::fabs( itemPos.y() - offset.y() ) < cursorSensitivity;
214 down = std::fabs( itemPos.y() - ( offset.y() + frameSize.height() ) ) < cursorSensitivity;
220 else if ( right && up )
224 else if ( left && down )
228 else if ( right && down )
250 if ( itemPos.x() >= offset.x() && itemPos.x() <= ( offset.x() + frameSize.width() )
251 && itemPos.y() >= offset.y() && itemPos.y() <= ( offset.y() + frameSize.height() ) )
260 switch ( moveAction )
263 return Qt::ArrowCursor;
266 return Qt::SizeAllCursor;
269 return Qt::SizeVerCursor;
272 return Qt::SizeHorCursor;
275 return Qt::SizeFDiagCursor;
278 return Qt::SizeBDiagCursor;
280 return Qt::ArrowCursor;
284 double QgsMapCanvasAnnotationItem::scaledSymbolSize()
const
296 double dpmm =
mMapCanvas->logicalDpiX() / 25.4;
302 if ( !mAnnotation || !mAnnotation->
isVisible() )
309 mAnnotation->
render( rc );
313 drawSelectionBoxes( painter );