42#include <QImageReader>
45#include "moc_qgscreateannotationitemmaptool_impl.cpp"
47using namespace Qt::StringLiterals;
58 mToolName = tr(
"Annotation tool" );
107 setUseSnappingIndicator(
true );
114 if ( event->button() != Qt::LeftButton )
119 auto createdItem = std::make_unique<QgsAnnotationPointTextItem>( tr(
"Text" ), layerPoint );
120 createdItem->setAlignment( Qt::AlignLeft );
124 createdItem->setFormat( format );
126 createdItem->setUseSymbologyReferenceScale(
true );
127 createdItem->setSymbologyReferenceScale(
canvas()->scale() );
128 mHandler->pushCreatedItem( createdItem.release() );
154 if ( event->button() != Qt::LeftButton )
158 auto createdItem = std::make_unique<QgsAnnotationMarkerItem>( QgsPoint( layerPoint ) );
163 createdItem->setSymbol( markerSymbol.release() );
166 createdItem->setSymbologyReferenceScale(
canvas()->scale() );
168 mHandler->pushCreatedItem( createdItem.release() );
185void QgsCreateLineItemMapTool::lineCaptured(
const QgsCurve *line )
194 auto createdItem = std::make_unique<QgsAnnotationLineItem>( qgis::down_cast<QgsCurve *>( geometry.release() ) );
199 createdItem->setSymbol( lineSymbol.release() );
202 createdItem->setSymbologyReferenceScale(
canvas()->scale() );
204 mHandler->pushCreatedItem( createdItem.release() );
218void QgsCreatePolygonItemMapTool::polygonCaptured(
const QgsCurvePolygon *polygon )
226 auto newPolygon = std::make_unique<QgsCurvePolygon>();
227 newPolygon->setExteriorRing( qgis::down_cast<QgsCurve *>( geometry.release() ) );
228 auto createdItem = std::make_unique<QgsAnnotationPolygonItem>( newPolygon.release() );
233 createdItem->setSymbol( fillSymbol.release() );
236 createdItem->setSymbologyReferenceScale(
canvas()->scale() );
238 mHandler->pushCreatedItem( createdItem.release() );
248 =
new QgsSettingsEntryString( u
"last-source-folder"_s, sTreePicture, QString(), u
"Last used folder for picture annotation source files"_s );
254 setUseSnappingIndicator(
true );
259 if ( event->button() == Qt::RightButton && mRubberBand )
266 if ( event->button() != Qt::LeftButton )
271 mFirstPoint =
event->snapPoint();
278 color.setAlphaF( color.alphaF() * alphaScale );
279 mRubberBand->setLineStyle( Qt::DotLine );
280 mRubberBand->setStrokeColor( color );
283 mRubberBand->setFillColor( fillColor );
289 QStringList formatsFilter;
290 formatsFilter.append( u
"*.svg"_s );
291 const QByteArrayList supportedFormats = QImageReader::supportedImageFormats();
292 for (
const auto &format : supportedFormats )
294 formatsFilter.append( QString( u
"*.%1"_s ).arg( QString( format ) ) );
296 const QString dialogFilter = u
"%1 (%2);;%3 (*.*)"_s.arg( tr(
"Images" ), formatsFilter.join(
' '_L1 ), tr(
"All files" ) );
298 const QString imagePath = QFileDialog::getOpenFileName(
nullptr, tr(
"Add Picture Annotation" ), initialDir.isEmpty() ? QDir::homePath() : initialDir, dialogFilter );
300 if ( imagePath.isEmpty() )
312 const double initialWidthPixels = std::abs( devicePoint1.
x() - devicePoint2.
x() );
313 const double initialHeightPixels = std::abs( devicePoint1.
y() - devicePoint2.
y() );
315 const QFileInfo pathInfo( imagePath );
319 if ( pathInfo.suffix().compare(
"svg"_L1, Qt::CaseInsensitive ) == 0 )
332 auto createdItem = std::make_unique<QgsAnnotationPictureItem>( format, imagePath, QgsRectangle( point1, point2 ) );
333 if ( size.isValid() )
335 const double pixelsToMm =
mCanvas->mapSettings().outputDpi() / 25.4;
336 if ( size.width() / size.height() > initialWidthPixels / initialHeightPixels )
338 createdItem->setFixedSize( QSizeF( initialWidthPixels / pixelsToMm, size.height() / size.width() * initialWidthPixels / pixelsToMm ) );
342 createdItem->setFixedSize( QSizeF( size.width() / size.height() * initialHeightPixels / pixelsToMm, initialHeightPixels / pixelsToMm ) );
347 mHandler->pushCreatedItem( createdItem.release() );
361 const QgsMapToPixel *transform =
mCanvas->getCoordinateTransform();
362 const QgsPointXY topLeft = transform->
toMapCoordinates( firstCanvasPoint.
x(), firstCanvasPoint.
y() );
363 const QgsPointXY topRight = transform->
toMapCoordinates( currentCanvasPoint.
x(), firstCanvasPoint.
y() );
364 const QgsPointXY bottomRight = transform->
toMapCoordinates( currentCanvasPoint.
x(), currentCanvasPoint.
y() );
365 const QgsPointXY bottomLeft = transform->
toMapCoordinates( firstCanvasPoint.
x(), currentCanvasPoint.
y() );
373 if ( event->key() == Qt::Key_Escape )
403 setUseSnappingIndicator(
true );
408 if ( event->button() == Qt::RightButton && mRubberBand )
415 if ( event->button() != Qt::LeftButton )
420 mFirstPoint =
event->snapPoint();
427 color.setAlphaF( color.alphaF() * alphaScale );
428 mRubberBand->setLineStyle( Qt::DotLine );
429 mRubberBand->setStrokeColor( color );
432 mRubberBand->setFillColor( fillColor );
443 auto createdItem = std::make_unique<QgsAnnotationRectangleTextItem>( tr(
"Text" ), QgsRectangle( point1, point2 ) );
448 createdItem->setFormat( format );
451 createdItem->setUseSymbologyReferenceScale(
true );
452 createdItem->setSymbologyReferenceScale(
canvas()->scale() );
453 mHandler->pushCreatedItem( createdItem.release() );
467 const QgsMapToPixel *transform =
mCanvas->getCoordinateTransform();
468 const QgsPointXY topLeft = transform->
toMapCoordinates( firstCanvasPoint.
x(), firstCanvasPoint.
y() );
469 const QgsPointXY topRight = transform->
toMapCoordinates( currentCanvasPoint.
x(), firstCanvasPoint.
y() );
470 const QgsPointXY bottomRight = transform->
toMapCoordinates( currentCanvasPoint.
x(), currentCanvasPoint.
y() );
471 const QgsPointXY bottomLeft = transform->
toMapCoordinates( firstCanvasPoint.
x(), currentCanvasPoint.
y() );
479 if ( event->key() == Qt::Key_Escape )
511void QgsCreateLineTextItemMapTool::lineCaptured(
const QgsCurve *line )
520 auto createdItem = std::make_unique<QgsAnnotationLineTextItem>( tr(
"Text" ), qgis::down_cast<QgsCurve *>( geometry.release() ) );
529 createdItem->setFormat( format );
532 createdItem->setUseSymbologyReferenceScale(
true );
533 createdItem->setSymbologyReferenceScale(
canvas()->scale() );
534 mHandler->pushCreatedItem( createdItem.release() );
CaptureTechnique
Capture technique.
@ NurbsCurve
Digitizes NURBS curves with control points (curve is attracted to but does not pass through control p...
@ StraightSegments
Default capture mode - capture occurs with straight line segments.
@ CircularString
Capture in circular strings.
@ Streaming
Streaming points digitizing mode (points are automatically added as the mouse cursor moves).
@ PolyBezier
Digitizes poly-Bézier curves with anchors and tangent handles (curve passes through anchor points).
PictureFormat
Picture formats.
@ Unknown
Invalid or unknown image type.
@ Millimeters
Millimeters.
virtual const QgsAbstractGeometry * simplifiedTypeRef() const
Returns a reference to the simplest lossless representation of this geometry, e.g.
virtual bool isEmpty() const
Returns true if the geometry is empty.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
static QgsRecentStyleHandler * recentStyleHandler()
Returns the handler for recently used style items.
static QgsImageCache * imageCache()
Returns the application's image cache, used for caching resampled versions of raster images.
static QgsSvgCache * svgCache()
Returns the application's SVG cache, used for caching SVG images and handling parameter replacement w...
QgsCreateLineTextItemMapTool(QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget)
Constructor.
~QgsCreatePointTextItemMapTool() override
QgsMapTool * mapTool() override
Returns a reference to the associated map tool.
void cadCanvasPressEvent(QgsMapMouseEvent *event) override
Override this method when subclassing this class.
QgsCreatePointTextItemMapTool(QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget)
Constructor.
QgsCreateAnnotationItemMapToolHandler * handler() const override
Returns the handler object for the map tool.
QgsCreateRectangleTextItemMapTool(QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget)
Constructor.
QgsMapTool * mapTool() override
Returns a reference to the associated map tool.
void cadCanvasMoveEvent(QgsMapMouseEvent *event) override
Override this method when subclassing this class.
void cadCanvasPressEvent(QgsMapMouseEvent *event) override
Override this method when subclassing this class.
void keyPressEvent(QKeyEvent *event) override
Key event for overriding. Default implementation does nothing.
QgsCreateAnnotationItemMapToolHandler * handler() const override
Returns the handler object for the map tool.
Curve polygon geometry type.
const QgsCurve * exteriorRing() const
Returns the curve polygon's exterior ring.
bool isEmpty() const override
Returns true if the geometry is empty.
Abstract base class for curved geometry type.
static QgsGeometry fromPolygonXY(const QgsPolygonXY &polygon)
Creates a new geometry from a QgsPolygonXY.
QSize originalSize(const QString &path, bool blocking=false) const
Returns the original size (in pixels) of the image at the specified path.
Map canvas is a class for displaying all GIS data types on a canvas.
Base class for all map layer types.
A mouse event which is the result of a user interaction with a QgsMapCanvas.
QgsPointXY mapPoint() const
mapPoint returns the point in coordinates
QgsPointXY snapPoint()
snapPoint will snap the points using the map canvas snapping utils configuration
QgsPointXY toMapCoordinates(int x, int y) const
Transforms device coordinates to map (world) coordinates.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsSymbol * recentSymbol(const QString &identifier) const
Returns a copy of the recently used symbol with the specified identifier, or nullptr if no symbol wit...
T value(const QString &dynamicKeyPart=QString()) const
Returns settings value.
static const QgsSettingsEntryDouble * settingsDigitizingLineColorAlphaScale
Settings entry digitizing line color alpha scale.
static QgsTextFormat defaultTextFormatForProject(QgsProject *project, QgsStyle::TextFormatContext context=QgsStyle::TextFormatContext::Labeling)
Returns the default text format to use for new text based objects for the specified project,...
@ Labeling
Text format used in labeling.
QSizeF svgViewboxSize(const QString &path, double size, const QColor &fill, const QColor &stroke, double strokeWidth, double widthScaleFactor, double fixedAspectRatio=0, bool blocking=false, const QMap< QString, QString > ¶meters=QMap< QString, QString >())
Calculates the viewbox size of a (possibly cached) SVG file.
static QgsSymbol * defaultSymbol(Qgis::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
void setAllowHtmlFormatting(bool allow)
Sets whether text should be treated as a HTML document and HTML tags should be used for formatting th...
#define BUILTIN_UNREACHABLE
T qgsgeometry_cast(QgsAbstractGeometry *geom)
constexpr QObjectUniquePtr< Tp > make_qobject_unique(Args &&...args)
Create an object owned by a QObjectUniquePtr.