QGIS API Documentation 4.1.0-Master (60fea48833c)
Loading...
Searching...
No Matches
qgsannotationlayer.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsannotationlayer.cpp
3 ------------------
4 copyright : (C) 2019 by Sandro Mani
5 email : smani at sourcepole dot ch
6 ***************************************************************************/
7
8/***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17#include "qgsannotationlayer.h"
18
19#include "RTree.h"
20#include "qgsannotationitem.h"
24#include "qgsapplication.h"
25#include "qgsfeedback.h"
26#include "qgslogger.h"
27#include "qgsmaplayerfactory.h"
28#include "qgspainteffect.h"
30#include "qgspainting.h"
31#include "qgsthreadingutils.h"
32
33#include <QString>
34#include <QUuid>
35
36#include "moc_qgsannotationlayer.cpp"
37
38using namespace Qt::StringLiterals;
39
41class QgsAnnotationLayerSpatialIndex : public RTree<QString, float, 2, float>
42{
43 public:
44 void insert( const QString &uuid, const QgsRectangle &bounds )
45 {
46 std::array< float, 4 > scaledBounds = scaleBounds( bounds );
47 float aMin[2] { scaledBounds[0], scaledBounds[1] };
48 float aMax[2] { scaledBounds[2], scaledBounds[3] };
49 this->Insert( aMin, aMax, uuid );
50 }
51
58 void remove( const QString &uuid, const QgsRectangle &bounds )
59 {
60 std::array< float, 4 > scaledBounds = scaleBounds( bounds );
61 float aMin[2] { scaledBounds[0], scaledBounds[1] };
62 float aMax[2] { scaledBounds[2], scaledBounds[3] };
63 this->Remove( aMin, aMax, uuid );
64 }
65
71 bool intersects( const QgsRectangle &bounds, const std::function< bool( const QString &uuid )> &callback ) const
72 {
73 std::array< float, 4 > scaledBounds = scaleBounds( bounds );
74 float aMin[2] { scaledBounds[0], scaledBounds[1] };
75 float aMax[2] { scaledBounds[2], scaledBounds[3] };
76 this->Search( aMin, aMax, callback );
77 return true;
78 }
79
80 private:
81 std::array<float, 4> scaleBounds( const QgsRectangle &bounds ) const
82 {
83 return { static_cast< float >( bounds.xMinimum() ), static_cast< float >( bounds.yMinimum() ), static_cast< float >( bounds.xMaximum() ), static_cast< float >( bounds.yMaximum() ) };
84 }
85};
87
89 : QgsMapLayer( Qgis::LayerType::Annotation, name )
90 , mTransformContext( options.transformContext )
91 , mSpatialIndex( std::make_unique< QgsAnnotationLayerSpatialIndex >() )
92{
93 mShouldValidateCrs = false;
94 mValid = true;
95
97 providerOptions.transformContext = options.transformContext;
98 mDataProvider = std::make_unique<QgsAnnotationLayerDataProvider>( providerOptions, Qgis::DataProviderReadFlags() );
99
100 mPaintEffect.reset( QgsPaintEffectRegistry::defaultStack() );
101 mPaintEffect->setEnabled( false );
102}
103
105{
106 emit willBeDeleted();
107 qDeleteAll( mItems );
108}
109
122
124{
126
127 const QString uuid = QUuid::createUuid().toString();
128 mItems.insert( uuid, item );
130 mNonIndexedItems.insert( uuid );
131 else
132 mSpatialIndex->insert( uuid, item->boundingBox() );
133
135
136 return uuid;
137}
138
140{
142
143 std::unique_ptr< QgsAnnotationItem> prevItem( mItems.take( id ) );
144
145 if ( prevItem )
146 {
147 auto it = mNonIndexedItems.find( id );
148 if ( it == mNonIndexedItems.end() )
149 {
150 mSpatialIndex->remove( id, prevItem->boundingBox() );
151 }
152 else
153 {
154 mNonIndexedItems.erase( it );
155 }
156 }
157
158 mItems.insert( id, item );
160 mNonIndexedItems.insert( id );
161 else
162 mSpatialIndex->insert( id, item->boundingBox() );
163
165}
166
167bool QgsAnnotationLayer::removeItem( const QString &id )
168{
170
171 if ( !mItems.contains( id ) )
172 return false;
173
174 std::unique_ptr< QgsAnnotationItem> item( mItems.take( id ) );
175
176 auto it = mNonIndexedItems.find( id );
177 if ( it == mNonIndexedItems.end() )
178 {
179 mSpatialIndex->remove( id, item->boundingBox() );
180 }
181 else
182 {
183 mNonIndexedItems.erase( it );
184 }
185
186 item.reset();
187
189
190 return true;
191}
192
194{
196
197 qDeleteAll( mItems );
198 mItems.clear();
199 mSpatialIndex = std::make_unique< QgsAnnotationLayerSpatialIndex >();
200 mNonIndexedItems.clear();
201
203}
204
206{
208
209 return mItems.empty();
210}
211
213{
215
216 return mItems.value( id );
217}
218
219QStringList QgsAnnotationLayer::queryIndex( const QgsRectangle &bounds, QgsFeedback *feedback ) const
220{
222
223 QStringList res;
224
225 mSpatialIndex->intersects( bounds, [&res, feedback]( const QString &uuid ) -> bool {
226 res << uuid;
227 return !feedback || !feedback->isCanceled();
228 } );
229 return res;
230}
231
232QStringList QgsAnnotationLayer::itemsInBounds( const QgsRectangle &bounds, QgsRenderContext &context, QgsFeedback *feedback ) const
233{
235
236 QStringList res = queryIndex( bounds, feedback );
237 // we also have to search through any non-indexed items
238 for ( const QString &uuid : mNonIndexedItems )
239 {
240 auto it = mItems.constFind( uuid );
241 if ( it != mItems.constEnd() && it.value()->boundingBox( context ).intersects( bounds ) )
242 res << uuid;
243 }
244
245 return res;
246}
247
254
256{
258
260 if ( QgsAnnotationItem *targetItem = item( operation->itemId() ) )
261 {
262 // remove item from index if present
263 auto it = mNonIndexedItems.find( operation->itemId() );
264 if ( it == mNonIndexedItems.end() )
265 {
266 mSpatialIndex->remove( operation->itemId(), targetItem->boundingBox() );
267 }
268 res = targetItem->applyEditV2( operation, context );
269
270 switch ( res )
271 {
274 // re-add to index if possible
275 if ( !( targetItem->flags() & Qgis::AnnotationItemFlag::ScaleDependentBoundingBox ) )
276 mSpatialIndex->insert( operation->itemId(), targetItem->boundingBox() );
277 break;
278
280 // item needs removing from layer
281 delete mItems.take( operation->itemId() );
282 mNonIndexedItems.remove( operation->itemId() );
283 break;
284 }
285 }
286
289
290 return res;
291}
292
300
302{
304
305 const QgsAnnotationLayer::LayerOptions options( mTransformContext );
306 auto layer = std::make_unique< QgsAnnotationLayer >( name(), options );
307 QgsMapLayer::clone( layer.get() );
308
309 for ( auto it = mItems.constBegin(); it != mItems.constEnd(); ++it )
310 {
311 layer->mItems.insert( it.key(), ( *it )->clone() );
313 layer->mNonIndexedItems.insert( it.key() );
314 else
315 layer->mSpatialIndex->insert( it.key(), ( *it )->boundingBox() );
316 }
317
318 if ( mPaintEffect )
319 layer->setPaintEffect( mPaintEffect->clone() );
320
321 layer->mLinkedLayer = mLinkedLayer;
322
323 return layer.release();
324}
325
332
334{
336
337 QgsRectangle rect;
338 for ( auto it = mItems.constBegin(); it != mItems.constEnd(); ++it )
339 {
340 if ( rect.isNull() )
341 {
342 rect = it.value()->boundingBox();
343 }
344 else
345 {
346 rect.combineExtentWith( it.value()->boundingBox() );
347 }
348 }
349 return rect;
350}
351
353{
355
356 if ( mDataProvider )
357 mDataProvider->setTransformContext( context );
358
359 mTransformContext = context;
361}
362
363bool QgsAnnotationLayer::readXml( const QDomNode &layerNode, QgsReadWriteContext &context )
364{
366
368 {
369 return false;
370 }
371
372 QString errorMsg;
373 readItems( layerNode, errorMsg, context );
374 readSymbology( layerNode, errorMsg, context );
375
376 {
377 const QString layerId = layerNode.toElement().attribute( u"linkedLayer"_s );
378 const QString layerName = layerNode.toElement().attribute( u"linkedLayerName"_s );
379 const QString layerSource = layerNode.toElement().attribute( u"linkedLayerSource"_s );
380 const QString layerProvider = layerNode.toElement().attribute( u"linkedLayerProvider"_s );
381 mLinkedLayer = QgsMapLayerRef( layerId, layerName, layerSource, layerProvider );
382 }
383
385
386 return mValid;
387}
388
389bool QgsAnnotationLayer::writeXml( QDomNode &layer_node, QDomDocument &doc, const QgsReadWriteContext &context ) const
390{
392
393 // first get the layer element so that we can append the type attribute
394 QDomElement mapLayerNode = layer_node.toElement();
395
396 if ( mapLayerNode.isNull() )
397 {
398 QgsDebugMsgLevel( u"can't find maplayer node"_s, 2 );
399 return false;
400 }
401
402 mapLayerNode.setAttribute( u"type"_s, QgsMapLayerFactory::typeToString( Qgis::LayerType::Annotation ) );
403
404 if ( mLinkedLayer )
405 {
406 mapLayerNode.setAttribute( u"linkedLayer"_s, mLinkedLayer.layerId );
407 mapLayerNode.setAttribute( u"linkedLayerName"_s, mLinkedLayer.name );
408 mapLayerNode.setAttribute( u"linkedLayerSource"_s, mLinkedLayer.source );
409 mapLayerNode.setAttribute( u"linkedLayerProvider"_s, mLinkedLayer.provider );
410 }
411
412 QString errorMsg;
413 writeItems( layer_node, doc, errorMsg, context );
414
415 // renderer specific settings
416 return writeSymbology( layer_node, doc, errorMsg, context );
417}
418
419bool QgsAnnotationLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString &, const QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories ) const
420{
422
423 QDomElement layerElement = node.toElement();
424 writeCommonStyle( layerElement, doc, context, categories );
425
426 // add the layer opacity
427 if ( categories.testFlag( Rendering ) )
428 {
429 QDomElement layerOpacityElem = doc.createElement( u"layerOpacity"_s );
430 const QDomText layerOpacityText = doc.createTextNode( QString::number( opacity() ) );
431 layerOpacityElem.appendChild( layerOpacityText );
432 node.appendChild( layerOpacityElem );
433 }
434
435 if ( categories.testFlag( Symbology ) )
436 {
437 // add the blend mode field
438 QDomElement blendModeElem = doc.createElement( u"blendMode"_s );
439 const QDomText blendModeText = doc.createTextNode( QString::number( static_cast< int >( QgsPainting::getBlendModeEnum( blendMode() ) ) ) );
440 blendModeElem.appendChild( blendModeText );
441 node.appendChild( blendModeElem );
442
443 QDomElement paintEffectElem = doc.createElement( u"paintEffect"_s );
444 if ( mPaintEffect && !QgsPaintEffectRegistry::isDefaultStack( mPaintEffect.get() ) )
445 mPaintEffect->saveProperties( doc, paintEffectElem );
446 node.appendChild( paintEffectElem );
447 }
448
449 return true;
450}
451
452bool QgsAnnotationLayer::readSymbology( const QDomNode &node, QString &, QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories )
453{
455
456 const QDomElement layerElement = node.toElement();
457 readCommonStyle( layerElement, context, categories );
458
459 if ( categories.testFlag( Rendering ) )
460 {
461 const QDomNode layerOpacityNode = node.namedItem( u"layerOpacity"_s );
462 if ( !layerOpacityNode.isNull() )
463 {
464 const QDomElement e = layerOpacityNode.toElement();
465 setOpacity( e.text().toDouble() );
466 }
467 }
468
469 if ( categories.testFlag( Symbology ) )
470 {
471 // get and set the blend mode if it exists
472 const QDomNode blendModeNode = node.namedItem( u"blendMode"_s );
473 if ( !blendModeNode.isNull() )
474 {
475 const QDomElement e = blendModeNode.toElement();
476 setBlendMode( QgsPainting::getCompositionMode( static_cast< Qgis::BlendMode >( e.text().toInt() ) ) );
477 }
478
479 //restore layer effect
480 const QDomNode paintEffectNode = node.namedItem( u"paintEffect"_s );
481 if ( !paintEffectNode.isNull() )
482 {
483 const QDomElement effectElem = paintEffectNode.firstChildElement( u"effect"_s );
484 if ( !effectElem.isNull() )
485 {
486 setPaintEffect( QgsApplication::paintEffectRegistry()->createEffect( effectElem ) );
487 }
488 }
489 }
490
491 return true;
492}
493
494bool QgsAnnotationLayer::writeItems( QDomNode &node, QDomDocument &doc, QString &, const QgsReadWriteContext &context, QgsMapLayer::StyleCategories ) const
495{
497
498 QDomElement itemsElement = doc.createElement( u"items"_s );
499
500 for ( auto it = mItems.constBegin(); it != mItems.constEnd(); ++it )
501 {
502 QDomElement itemElement = doc.createElement( u"item"_s );
503 itemElement.setAttribute( u"type"_s, ( *it )->type() );
504 itemElement.setAttribute( u"id"_s, it.key() );
505 ( *it )->writeXml( itemElement, doc, context );
506 itemsElement.appendChild( itemElement );
507 }
508 node.appendChild( itemsElement );
509
510 return true;
511}
512
513bool QgsAnnotationLayer::readItems( const QDomNode &node, QString &, QgsReadWriteContext &context, QgsMapLayer::StyleCategories )
514{
516
517 qDeleteAll( mItems );
518 mItems.clear();
519 mSpatialIndex = std::make_unique< QgsAnnotationLayerSpatialIndex >();
520 mNonIndexedItems.clear();
521
522 const QDomNodeList itemsElements = node.toElement().elementsByTagName( u"items"_s );
523 if ( itemsElements.size() == 0 )
524 return false;
525
526 const QDomNodeList items = itemsElements.at( 0 ).childNodes();
527 for ( int i = 0; i < items.size(); ++i )
528 {
529 const QDomElement itemElement = items.at( i ).toElement();
530 const QString id = itemElement.attribute( u"id"_s );
531 const QString type = itemElement.attribute( u"type"_s );
532 std::unique_ptr< QgsAnnotationItem > item( QgsApplication::annotationItemRegistry()->createItem( type ) );
533 if ( item )
534 {
535 item->readXml( itemElement, context );
537 mNonIndexedItems.insert( id );
538 else
539 mSpatialIndex->insert( id, item->boundingBox() );
540 mItems.insert( id, item.release() );
541 }
542 }
543
544 return true;
545}
546
547bool QgsAnnotationLayer::writeStyle( QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories ) const
548{
550
551 writeItems( node, doc, errorMessage, context, categories );
552
553 return writeSymbology( node, doc, errorMessage, context, categories );
554}
555
556bool QgsAnnotationLayer::readStyle( const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories )
557{
559
560 readItems( node, errorMessage, context, categories );
561
562 return readSymbology( node, errorMessage, context, categories );
563}
564
566{
568
569 // annotation layers are always editable
570 return true;
571}
572
574{
576
577 return true;
578}
579
586
588{
590
591 return mDataProvider.get();
592}
593
595{
597
598 QString metadata = u"<html>\n<body>\n<h1>"_s + tr( "General" ) + u"</h1>\n<hr>\n"_s + u"<table class=\"list-view\">\n"_s;
599
600 metadata += u"<tr><td class=\"highlight\">"_s + tr( "Name" ) + u"</td><td>"_s + name() + u"</td></tr>\n"_s;
601
602 // Extent
603 metadata += u"<tr><td class=\"highlight\">"_s + tr( "Extent" ) + u"</td><td>"_s + extent().toString() + u"</td></tr>\n"_s;
604
605 // item count
606 QLocale locale = QLocale();
607 locale.setNumberOptions( locale.numberOptions() &= ~QLocale::NumberOption::OmitGroupSeparator );
608 const int itemCount = mItems.size();
609 metadata += u"<tr><td class=\"highlight\">"_s + tr( "Item count" ) + u"</td><td>"_s + locale.toString( static_cast<qlonglong>( itemCount ) ) + u"</td></tr>\n"_s;
610 metadata += "</table>\n<br><br>"_L1;
611
612 // CRS
614
615 // items section
616 metadata += u"<h1>"_s + tr( "Items" ) + u"</h1>\n<hr>\n"_s;
617
618 metadata += "<table width=\"100%\" class=\"tabular-view\">\n"_L1;
619 metadata += "<tr><th>"_L1 + tr( "Type" ) + "</th><th>"_L1 + tr( "Count" ) + "</th></tr>\n"_L1;
620
621 QMap< QString, int > itemCounts;
622 for ( auto it = mItems.constBegin(); it != mItems.constEnd(); ++it )
623 {
624 itemCounts[it.value()->type()]++;
625 }
626
627 const QMap<QString, QString> itemTypes = QgsApplication::annotationItemRegistry()->itemTypes();
628 int i = 0;
629 for ( auto it = itemTypes.begin(); it != itemTypes.end(); ++it )
630 {
631 QString rowClass;
632 if ( i % 2 )
633 rowClass = u"class=\"odd-row\""_s;
634 metadata += "<tr "_L1 + rowClass + "><td>"_L1 + it.value() + "</td><td>"_L1 + locale.toString( static_cast<qlonglong>( itemCounts.value( it.key() ) ) ) + "</td></tr>\n"_L1;
635 i++;
636 }
637
638 metadata += "</table>\n<br><br>"_L1;
639
640 metadata += "\n</body>\n</html>\n"_L1;
641 return metadata;
642}
643
645{
646 mLinkedLayer.resolve( project );
647}
648
650{
652
653 return mPaintEffect.get();
654}
655
657{
659
660 mPaintEffect.reset( effect );
661}
662
669
671{
673
674 mLinkedLayer.setLayer( layer );
676}
677
678
679//
680// QgsAnnotationLayerDataProvider
681//
683QgsAnnotationLayerDataProvider::QgsAnnotationLayerDataProvider( const ProviderOptions &options, Qgis::DataProviderReadFlags flags )
684 : QgsDataProvider( QString(), options, flags )
685{}
686
687QgsCoordinateReferenceSystem QgsAnnotationLayerDataProvider::crs() const
688{
690
692}
693
694QString QgsAnnotationLayerDataProvider::name() const
695{
697
698 return u"annotation"_s;
699}
700
701QString QgsAnnotationLayerDataProvider::description() const
702{
704
705 return QString();
706}
707
708QgsRectangle QgsAnnotationLayerDataProvider::extent() const
709{
711
712 return QgsRectangle();
713}
714
715bool QgsAnnotationLayerDataProvider::isValid() const
716{
718
719 return true;
720}
Provides global constants and enumerations for use throughout the application.
Definition qgis.h:62
@ UsersCannotToggleEditing
Indicates that users are not allowed to toggle editing for this layer. Note that this does not imply ...
Definition qgis.h:2361
@ ScaleDependentBoundingBox
Item's bounding box will vary depending on map scale.
Definition qgis.h:2554
AnnotationItemEditOperationResult
Results from an edit operation on an annotation item.
Definition qgis.h:2608
@ Invalid
Operation has invalid parameters for the item, no change occurred.
Definition qgis.h:2610
@ Success
Item was modified successfully.
Definition qgis.h:2609
@ ItemCleared
The operation results in the item being cleared, and the item should be removed from the layer as a r...
Definition qgis.h:2611
BlendMode
Blending modes defining the available composition modes that can be used when painting.
Definition qgis.h:5087
QFlags< DataProviderReadFlag > DataProviderReadFlags
Flags which control data provider construction.
Definition qgis.h:512
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
Definition qgis.h:212
QFlags< MapLayerProperty > MapLayerProperties
Map layer properties.
Definition qgis.h:2367
Abstract base class for annotation item edit operations.
QString itemId() const
Returns the associated item ID.
Encapsulates the context for an annotation item edit operation.
QMap< QString, QString > itemTypes() const
Returns a map of available item types to translated name.
Abstract base class for annotation items which are drawn with QgsAnnotationLayers.
QgsRectangle extent() const override
Returns the extent of the layer.
bool writeSymbology(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &, StyleCategories categories=AllStyleCategories) const override
Write the style for the layer into the document provided.
void resolveReferences(QgsProject *project) override
Resolve references to other layers (kept as layer IDs after reading XML) into layer objects.
bool readSymbology(const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories) override
Read the symbology for the current layer from the DOM node supplied.
bool readStyle(const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, StyleCategories categories) override
Read the style for the current layer from the DOM node supplied.
void clear()
Removes all items from the layer.
QgsDataProvider * dataProvider() override
Returns the layer's data provider, it may be nullptr.
QgsMapLayerRenderer * createMapRenderer(QgsRenderContext &rendererContext) override
Returns new instance of QgsMapLayerRenderer that will be used for rendering of given context.
bool isEditable() const override
Returns true if the layer can be edited.
bool removeItem(const QString &id)
Removes (and deletes) the item with matching id.
QStringList itemsInBounds(const QgsRectangle &bounds, QgsRenderContext &context, QgsFeedback *feedback=nullptr) const
Returns a list of the IDs of all annotation items within the specified bounds (in layer CRS),...
void setTransformContext(const QgsCoordinateTransformContext &context) override
Sets the coordinate transform context to transformContext.
Q_DECL_DEPRECATED Qgis::AnnotationItemEditOperationResult applyEdit(QgsAbstractAnnotationItemEditOperation *operation)
Applies an edit operation to the layer.
void setPaintEffect(QgsPaintEffect *effect)
Sets the current paint effect for the layer.
void setLinkedVisibilityLayer(QgsMapLayer *layer)
Sets a linked layer, where the items in this annotation layer will only be visible when the linked la...
QgsPaintEffect * paintEffect() const
Returns the current paint effect for the layer.
void replaceItem(const QString &id, QgsAnnotationItem *item)
Replaces the existing item with matching id with a new item.
Qgis::AnnotationItemEditOperationResult applyEditV2(QgsAbstractAnnotationItemEditOperation *operation, const QgsAnnotationItemEditContext &context)
Applies an edit operation to the layer.
QgsAnnotationLayer * clone() const override
Returns a new instance equivalent to this one except for the id which is still unique.
friend class QgsAnnotationLayerRenderer
bool supportsEditing() const override
Returns whether the layer supports editing or not.
void reset()
Resets the annotation layer to a default state, and clears all items from it.
QString addItem(QgsAnnotationItem *item)
Adds an item to the layer.
QgsMapLayer * linkedVisibilityLayer()
Returns a linked layer, where the items in this annotation layer will only be visible when the linked...
QString htmlMetadata() const override
Obtain a formatted HTML string containing assorted metadata for this layer.
Qgis::MapLayerProperties properties() const override
Returns the map layer properties of this layer.
bool isEmpty() const
Returns true if the annotation layer is empty and contains no annotations.
QgsAnnotationItem * item(const QString &id) const
Returns the item with the specified id, or nullptr if no matching item was found.
bool writeXml(QDomNode &layer_node, QDomDocument &doc, const QgsReadWriteContext &context) const override
Called by writeLayerXML(), used by children to write state specific to them to project files.
bool readXml(const QDomNode &layerNode, QgsReadWriteContext &context) override
Called by readLayerXML(), used by children to read state specific to them from project files.
QgsAnnotationLayer(const QString &name, const QgsAnnotationLayer::LayerOptions &options)
Constructor for a new QgsAnnotationLayer with the specified layer name.
QMap< QString, QgsAnnotationItem * > items() const
Returns a map of items contained in the layer, by unique item ID.
bool writeStyle(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, StyleCategories categories) const override
Write just the symbology information for the layer into the document.
static QgsAnnotationItemRegistry * annotationItemRegistry()
Returns the application's annotation item registry, used for annotation item types.
static QgsPaintEffectRegistry * paintEffectRegistry()
Returns the application's paint effect registry, used for managing paint effects.
Represents a coordinate reference system (CRS).
Contains information about the context in which a coordinate transform is executed.
Abstract base class for spatial data provider implementations.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
Definition qgsfeedback.h:44
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition qgsfeedback.h:56
static QString typeToString(Qgis::LayerType type)
Converts a map layer type to a string value.
Base class for utility classes that encapsulate information necessary for rendering of map layers.
QString name
Definition qgsmaplayer.h:87
void setBlendMode(QPainter::CompositionMode blendMode)
Set the blending mode used for rendering a layer.
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted.
QString crsHtmlMetadata() const
Returns a HTML fragment containing the layer's CRS metadata, for use in the htmlMetadata() method.
QgsLayerMetadata metadata
Definition qgsmaplayer.h:89
QgsMapLayer(Qgis::LayerType type=Qgis::LayerType::Vector, const QString &name=QString(), const QString &source=QString())
Constructor for QgsMapLayer.
Qgis::LayerType type
Definition qgsmaplayer.h:93
QPainter::CompositionMode blendMode() const
Returns the current blending mode for a layer.
virtual void setOpacity(double opacity)
Sets the opacity for the layer, where opacity is a value between 0 (totally transparent) and 1....
QFlags< StyleCategory > StyleCategories
QgsCoordinateTransformContext transformContext() const
Returns the layer data provider coordinate transform context or a default transform context if the la...
QUndoStack * undoStackStyles()
Returns pointer to layer's style undo stack.
void willBeDeleted()
Emitted in the destructor when the layer is about to be deleted, but it is still in a perfectly valid...
virtual QgsMapLayer * clone() const =0
Returns a new instance equivalent to this one except for the id which is still unique.
@ FlagDontResolveLayers
Don't resolve layer paths or create data providers for layers.
void readCommonStyle(const QDomElement &layerElement, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories)
Read style data common to all layer types.
QgsMapLayer::ReadFlags mReadFlags
Read flags. It's up to the subclass to respect these when restoring state from XML.
QgsProject * project() const
Returns the parent project if this map layer is added to a project.
double opacity
Definition qgsmaplayer.h:95
bool mValid
Indicates if the layer is valid and can be drawn.
@ Symbology
Symbology.
@ Rendering
Rendering: scale visibility, simplify method, opacity.
void writeCommonStyle(QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories) const
Write style data common to all layer types.
void invalidateWgs84Extent()
Invalidates the WGS84 extent.
bool mShouldValidateCrs
true if the layer's CRS should be validated and invalid CRSes are not permitted.
void setCrs(const QgsCoordinateReferenceSystem &srs, bool emitSignal=true)
Sets layer's spatial reference system.
static QgsPaintEffect * defaultStack()
Returns a new effect stack consisting of a sensible selection of default effects.
static bool isDefaultStack(QgsPaintEffect *effect)
Tests whether a paint effect matches the default effects stack.
Base class for visual effects which can be applied to QPicture drawings.
static Qgis::BlendMode getBlendModeEnum(QPainter::CompositionMode blendMode)
Returns a Qgis::BlendMode corresponding to a QPainter::CompositionMode.
static QPainter::CompositionMode getCompositionMode(Qgis::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a Qgis::BlendMode.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition qgsproject.h:113
A container for the context for various read/write operations on objects.
A rectangle specified with double values.
Q_INVOKABLE QString toString(int precision=16) const
Returns a string representation of form xmin,ymin : xmax,ymax Coordinates will be rounded to the spec...
double xMinimum
double yMinimum
double xMaximum
double yMaximum
Contains information about the context of a rendering operation.
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:63
_LayerRef< QgsMapLayer > QgsMapLayerRef
#define QGIS_PROTECT_QOBJECT_THREAD_ACCESS
Setting options for loading annotation layers.
QgsCoordinateTransformContext transformContext
Coordinate transform context.
Setting options for creating vector data providers.
QgsCoordinateTransformContext transformContext
Coordinate transform context.