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();
67 coord = t.transform( coord );
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 );
QgsFillSymbol * fillSymbol() const
Returns the symbol that is used for rendering the annotation frame.
void paint(QPainter *painter) override
function to be implemented by derived classes
Wrapper for iterator of features from vector data provider or vector layer.
A rectangle specified with double values.
QPointF frameOffsetFromReferencePointMm() const
Returns the annotation's frame's offset (in millimeters) from the mapPosition() reference point...
Moving annotation map position.
QgsCoordinateReferenceSystem mapPositionCrs() const
Returns the CRS of the map position, or an invalid CRS if the annotation does not have a fixed map po...
void appearanceChanged()
Emitted whenever the annotation's appearance changes.
Use exact geometry intersection (slower) instead of bounding boxes.
Use antialiasing while drawing.
void mapLayerChanged()
Emitted when the map layer associated with the annotation changes.
A class to represent a 2D point.
An abstract class for items that can be placed on the map canvas.
bool isVisible() const
Returns true if the annotation is visible and should be rendered.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
QgsPointXY mapToLayerCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from output CRS to layer's CRS
MouseMoveAction moveActionForPosition(QPointF pos) const
Returns the mouse move behavior for a given position in scene coordinates.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
QRectF boundingRect() const override
Moving position of frame relative to annotation.
Map canvas is a class for displaying all GIS data types on a canvas.
QgsCoordinateReferenceSystem destinationCrs() const
returns CRS of destination coordinate reference system
Abstract base class for annotation items which are drawn over a map.
void updatePosition() override
called on changed extent or resize event to update position of the item
QList< QgsMapLayer * > layers() const
Gets list of layers for map rendering The layers are stored in the reverse order of how they are rend...
static QgsRenderContext fromQPainter(QPainter *painter)
Creates a default render context given a pixel based QPainter destination.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
void destinationCrsChanged()
Emitted when map CRS has changed.
static double estimateMaxSymbolBleed(QgsSymbol *symbol, const QgsRenderContext &context)
Returns the maximum estimated bleed for the symbol.
void render(QgsRenderContext &context) const
Renders the annotation to a target render context.
QPointF relativePosition() const
Returns the relative position of the annotation, if it is not attached to a fixed map position...
void moved()
Emitted when the annotation's position has changed and items need to be moved to reflect this...
MouseMoveAction
Mouse actions for interacting with item.
Contains information about the context of a rendering operation.
QgsMapCanvasAnnotationItem(QgsAnnotation *annotation, QgsMapCanvas *mapCanvas)
Constructor for QgsMapCanvasAnnotationItem.
Qt::CursorShape cursorShapeForAction(MouseMoveAction moveAction) const
Returns matching cursor shape for a mouse move action.
QgsMapCanvas * mMapCanvas
pointer to map canvas
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsMarkerSymbol * markerSymbol() const
Returns the symbol that is drawn at the annotation's map position.
void setFlag(Flag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
QgsMapLayer * mapLayer() const
Returns the map layer associated with the annotation.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Query the layer for features specified in request.
double size() const
Returns the estimated size for the whole symbol, which is the maximum size of all marker symbol layer...
Custom exception class for Coordinate Reference System related exceptions.
bool nextFeature(QgsFeature &f)
QPointF toCanvasCoordinates(const QgsPointXY &point) const
transformation from map coordinates to screen coordinates
Represents a vector layer which manages a vector based data sets.
virtual void setAssociatedFeature(const QgsFeature &feature)
Sets the feature associated with the annotation.
bool annotationsVisible() const
Returns true if annotations are visible within the map canvas.
QSizeF frameSizeMm() const
Returns the size (in millimeters) of the annotation's frame (the main area in which the annotation's ...
void layersChanged()
Emitted when a new set of layers has been received.