67 #include "qgsattributeeditorcontainer.h"
71 #include <QApplication>
75 #include <QTextStream>
76 #include <QTemporaryFile>
79 #include <QStandardPaths>
81 #include <QRegularExpression>
84 #include <sys/utime.h>
102 QStringList keyTokens = QStringList( scope );
103 #if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
104 keyTokens += key.split(
'/', QString::SkipEmptyParts );
106 keyTokens += key.split(
'/', Qt::SkipEmptyParts );
110 keyTokens.push_front( QStringLiteral(
"properties" ) );
113 for (
int i = 0; i < keyTokens.size(); ++i )
115 QString keyToken = keyTokens.at( i );
119 const thread_local QRegularExpression sInvalidRegexp = QRegularExpression(
"([^:A-Z_a-z\\x{C0}-\\x{D6}\\x{D8}-\\x{F6}\\x{F8}-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}\\-\\.0-9\\x{B7}\\x{0300}-\\x{036F}\\x{203F}-\\x{2040}]|^[^:A-Z_a-z\\x{C0}-\\x{D6}\\x{D8}-\\x{F6}\\x{F8}-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}])" );
120 if ( keyToken.contains( sInvalidRegexp ) )
122 QString errorString = QObject::tr(
"Entry token invalid : '%1'. The token will not be saved to file." ).arg( keyToken );
150 while ( !keySequence.isEmpty() )
154 if ( keySequence.first() == currentProperty->
name() )
157 keySequence.pop_front();
159 if ( 1 == keySequence.count() )
162 return currentProperty->
find( keySequence.front() );
164 else if ( keySequence.isEmpty() )
169 return currentProperty;
171 else if ( ( nextProperty = currentProperty->
find( keySequence.first() ) ) )
173 if ( nextProperty->
isKey() )
177 else if ( nextProperty->
isValue() && 1 == keySequence.count() )
183 return currentProperty;
221 const QVariant &value,
222 bool &propertiesModified )
231 propertiesModified =
false;
232 while ( ! keySequence.isEmpty() )
236 if ( keySequence.first() == currentProperty->
name() )
239 keySequence.pop_front();
243 if ( 1 == keySequence.count() )
246 if ( !property || property->value() != value )
248 currentProperty->
setValue( keySequence.front(), value );
249 propertiesModified =
true;
252 return currentProperty;
256 else if ( keySequence.isEmpty() )
258 if ( currentProperty->
value() != value )
261 propertiesModified =
true;
264 return currentProperty;
266 else if ( ( nextProperty = currentProperty->
find( keySequence.first() ) ) )
270 if ( currentProperty )
281 if ( ( newPropertyKey = currentProperty->
addKey( keySequence.first() ) ) )
283 currentProperty = newPropertyKey;
315 while ( ! keySequence.isEmpty() )
319 if ( keySequence.first() == currentProperty->
name() )
322 keySequence.pop_front();
326 if ( 1 == keySequence.count() )
328 currentProperty->
removeKey( keySequence.front() );
333 else if ( keySequence.isEmpty() )
335 previousQgsPropertyKey->
removeKey( currentProperty->
name() );
337 else if ( ( nextProperty = currentProperty->
find( keySequence.first() ) ) )
339 previousQgsPropertyKey = currentProperty;
342 if ( currentProperty )
368 , mSnappingConfig( this )
381 mProperties.
setName( QStringLiteral(
"properties" ) );
384 mMainAnnotationLayer->setParent(
this );
398 this, [ = ](
const QStringList &
layers ) { mProjectScope.reset(); emit layersWillBeRemoved( layers ); } );
400 this, [ = ](
const QList<QgsMapLayer *> &
layers ) { mProjectScope.reset(); emit layersWillBeRemoved( layers ); } );
402 this, [ = ](
const QString & layer ) { mProjectScope.reset(); emit layerWillBeRemoved( layer ); } );
404 this, [ = ](
QgsMapLayer * layer ) { mProjectScope.reset(); emit layerWillBeRemoved( layer ); } );
406 [ = ](
const QStringList &
layers ) { mProjectScope.reset(); emit layersRemoved( layers ); } );
408 [ = ](
const QString & layer ) { mProjectScope.reset(); emit layerRemoved( layer ); } );
410 [ = ]() { mProjectScope.reset(); emit removeAll(); } );
412 [ = ](
const QList< QgsMapLayer * > &
layers ) { mProjectScope.reset(); emit layersAdded( layers ); } );
414 [ = ](
QgsMapLayer * layer ) { mProjectScope.reset(); emit layerWasAdded( layer ); } );
422 [ = ](
const QList<QgsMapLayer *> &
layers )
424 for ( const auto &layer : layers )
426 disconnect( layer, &QgsMapLayer::dataSourceChanged, mRelationManager, &QgsRelationManager::updateRelationsStatus );
431 [ = ](
const QList<QgsMapLayer *> &layers )
433 for ( const auto &layer : layers )
435 connect( layer, &QgsMapLayer::dataSourceChanged, mRelationManager, &QgsRelationManager::updateRelationsStatus );
448 mIsBeingDeleted =
true;
451 delete mBadLayerHandler;
452 delete mRelationManager;
453 delete mLayerTreeRegistryBridge;
455 if (
this == sProject )
482 mProjectScope.reset();
490 return mMetadata.
title();
500 return mSaveUserFull;
505 return mSaveDateTime;
520 if ( dirty && mDirtyBlockCount > 0 )
526 if ( mDirty == dirty )
535 if ( path == mHomePath )
539 mCachedHomePath.clear();
540 mProjectScope.reset();
549 const QList<QgsAttributeEditorElement *> elements = parent->children();
551 for ( QgsAttributeEditorElement *element : elements )
553 if ( element->type() == QgsAttributeEditorElement::AeTypeContainer )
555 QgsAttributeEditorContainer *container =
dynamic_cast<QgsAttributeEditorContainer *
>( element );
557 translationContext->
registerTranslation( QStringLiteral(
"project:layers:%1:formcontainers" ).arg( layerId ), container->name() );
559 if ( !container->children().empty() )
572 translationContext->
registerTranslation( QStringLiteral(
"project:layers:%1" ).arg( layer->layerId() ), layer->name() );
589 translationContext->
registerTranslation( QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( vlayer->
id() ), fieldName );
604 const QList<QgsLayerTreeGroup *> groupLayers = mRootGroup->
findGroups();
607 translationContext->
registerTranslation( QStringLiteral(
"project:layergroups" ), groupLayer->name() );
611 const QList<QgsRelation> &relations = mRelationManager->
relations().values();
614 translationContext->
registerTranslation( QStringLiteral(
"project:relations" ), relation.name() );
620 mDataDefinedServerProperties = properties;
625 return mDataDefinedServerProperties;
630 if ( name == mFile.fileName() )
635 mFile.setFileName( name );
636 mCachedHomePath.clear();
637 mProjectScope.reset();
642 if ( newHomePath != oldHomePath )
650 return mFile.fileName();
655 mOriginalPath = path;
660 return mOriginalPath;
665 return QFileInfo( mFile );
678 storage->readProjectStorageMetadata( mFile.fileName(),
metadata );
683 return QFileInfo( mFile.fileName() ).lastModified();
692 if ( mFile.fileName().isEmpty() )
695 return QFileInfo( mFile.fileName() ).absolutePath();
703 if ( mFile.fileName().isEmpty() )
706 return QFileInfo( mFile.fileName() ).absoluteFilePath();
714 storage->readProjectStorageMetadata( mFile.fileName(),
metadata );
719 return QFileInfo( mFile.fileName() ).completeBaseName();
733 writeEntry( QStringLiteral(
"SpatialRefSys" ), QStringLiteral(
"/ProjectionsEnabled" ),
crs.
isValid() ? 1 : 0 );
734 mProjectScope.reset();
739 if ( adjustEllipsoid )
745 if ( !
crs().isValid() )
748 return readEntry( QStringLiteral(
"Measure" ), QStringLiteral(
"/Ellipsoid" ),
geoNone() );
753 if (
ellipsoid ==
readEntry( QStringLiteral(
"Measure" ), QStringLiteral(
"/Ellipsoid" ) ) )
756 mProjectScope.reset();
763 return mTransformContext;
768 if ( context == mTransformContext )
771 mTransformContext = context;
772 mProjectScope.reset();
775 for (
auto &layer : mLayerStore.get()->mapLayers() )
777 layer->setTransformContext( context );
784 ScopedIntIncrementor snapSingleBlocker( &mBlockSnappingUpdates );
786 mProjectScope.reset();
787 mFile.setFileName( QString() );
790 mSaveUserFull.clear();
791 mSaveDateTime = QDateTime();
794 mCachedHomePath.clear();
795 mAutoTransaction =
false;
796 mEvaluateDefaultValues =
false;
798 mTrustLayerMetadata =
false;
799 mCustomVariables.clear();
802 if ( !mSettings.value( QStringLiteral(
"projects/anonymize_new_projects" ),
false, QgsSettings::Core ).toBool() )
813 mEmbeddedLayers.clear();
814 mRelationManager->
clear();
815 mAnnotationManager->clear();
816 mLayoutManager->clear();
817 mBookmarkManager->
clear();
818 mViewSettings->
reset();
819 mTimeSettings->
reset();
820 mDisplaySettings->
reset();
821 mSnappingConfig.
reset();
829 mLabelingEngineSettings->clear();
836 if ( !mIsBeingDeleted )
844 writeEntry( QStringLiteral(
"PositionPrecision" ), QStringLiteral(
"/Automatic" ),
true );
845 writeEntry( QStringLiteral(
"PositionPrecision" ), QStringLiteral(
"/DecimalPlaces" ), 2 );
846 writeEntry( QStringLiteral(
"Paths" ), QStringLiteral(
"/Absolute" ),
false );
849 writeEntry( QStringLiteral(
"Measurement" ), QStringLiteral(
"/DistanceUnits" ), mSettings.value( QStringLiteral(
"/qgis/measure/displayunits" ) ).toString() );
850 writeEntry( QStringLiteral(
"Measurement" ), QStringLiteral(
"/AreaUnits" ), mSettings.value( QStringLiteral(
"/qgis/measure/areaunits" ) ).toString() );
852 int red = mSettings.value( QStringLiteral(
"qgis/default_canvas_color_red" ), 255 ).toInt();
853 int green = mSettings.value( QStringLiteral(
"qgis/default_canvas_color_green" ), 255 ).toInt();
854 int blue = mSettings.value( QStringLiteral(
"qgis/default_canvas_color_blue" ), 255 ).toInt();
857 red = mSettings.value( QStringLiteral(
"qgis/default_selection_color_red" ), 255 ).toInt();
858 green = mSettings.value( QStringLiteral(
"qgis/default_selection_color_green" ), 255 ).toInt();
859 blue = mSettings.value( QStringLiteral(
"qgis/default_selection_color_blue" ), 0 ).toInt();
860 int alpha = mSettings.value( QStringLiteral(
"qgis/default_selection_color_alpha" ), 255 ).toInt();
867 if ( mMainAnnotationLayer )
868 mMainAnnotationLayer->
reset();
870 snapSingleBlocker.release();
872 if ( !mBlockSnappingUpdates )
884 topQgsPropertyKey.
dump();
917 QDomElement propertiesElem = doc.documentElement().firstChildElement( QStringLiteral(
"properties" ) );
919 if ( propertiesElem.isNull() )
924 QDomNodeList scopes = propertiesElem.childNodes();
926 if ( propertiesElem.firstChild().isNull() )
928 QgsDebugMsg( QStringLiteral(
"empty ``properties'' XML tag ... bailing" ) );
932 if ( ! project_properties.
readXml( propertiesElem ) )
934 QgsDebugMsg( QStringLiteral(
"Project_properties.readXml() failed" ) );
948 QDomElement ddElem = doc.documentElement().firstChildElement( QStringLiteral(
"dataDefinedServerProperties" ) );
949 if ( !ddElem.isNull() )
951 if ( !ddServerProperties.
readXml( ddElem, dataDefinedServerPropertyDefinitions ) )
953 QgsDebugMsg( QStringLiteral(
"dataDefinedServerProperties.readXml() failed" ) );
956 return ddServerProperties;
963 static void _getTitle(
const QDomDocument &doc, QString &title )
965 QDomElement titleNode = doc.documentElement().firstChildElement( QStringLiteral(
"title" ) );
969 if ( titleNode.isNull() )
975 if ( !titleNode.hasChildNodes() )
981 QDomNode titleTextNode = titleNode.firstChild();
983 if ( !titleTextNode.isText() )
989 QDomText titleText = titleTextNode.toText();
991 title = titleText.data();
995 static void readProjectFileMetadata(
const QDomDocument &doc, QString &lastUser, QString &lastUserFull, QDateTime &lastSaveDateTime )
997 QDomNodeList nl = doc.elementsByTagName( QStringLiteral(
"qgis" ) );
1005 QDomNode qgisNode = nl.item( 0 );
1007 QDomElement qgisElement = qgisNode.toElement();
1008 lastUser = qgisElement.attribute( QStringLiteral(
"saveUser" ), QString() );
1009 lastUserFull = qgisElement.attribute( QStringLiteral(
"saveUserFull" ), QString() );
1010 lastSaveDateTime = QDateTime::fromString( qgisElement.attribute( QStringLiteral(
"saveDateTime" ), QString() ), Qt::ISODate );
1016 QDomNodeList nl = doc.elementsByTagName( QStringLiteral(
"qgis" ) );
1020 QgsDebugMsg( QStringLiteral(
" unable to find qgis element in project file" ) );
1024 QDomNode qgisNode = nl.item( 0 );
1026 QDomElement qgisElement = qgisNode.toElement();
1027 QgsProjectVersion projectVersion( qgisElement.attribute( QStringLiteral(
"version" ) ) );
1028 return projectVersion;
1034 return mSnappingConfig;
1049 if ( mAvoidIntersectionsMode == mode )
1052 mAvoidIntersectionsMode = mode;
1056 bool QgsProject::_getMapLayers(
const QDomDocument &doc, QList<QDomNode> &brokenNodes, QgsProject::ReadFlags flags )
1061 QDomElement layerElement = doc.documentElement().firstChildElement( QStringLiteral(
"projectlayers" ) ).firstChildElement( QStringLiteral(
"maplayer" ) );
1065 if ( layerElement.isNull() )
1075 bool returnStatus =
true;
1078 while ( ! layerElement.isNull() )
1081 layerElement = layerElement.nextSiblingElement( QStringLiteral(
"maplayer" ) );
1087 if ( depSorter.hasCycle() )
1091 if ( depSorter.hasMissingDependency() )
1092 returnStatus =
false;
1096 const QVector<QDomNode> sortedLayerNodes = depSorter.sortedLayerNodes();
1097 const int totalLayerCount = sortedLayerNodes.count();
1100 for (
const QDomNode &node : sortedLayerNodes )
1102 const QDomElement element = node.toElement();
1104 const QString name =
translate( QStringLiteral(
"project:layers:%1" ).arg( node.namedItem( QStringLiteral(
"id" ) ).toElement().text() ), node.namedItem( QStringLiteral(
"layername" ) ).toElement().text() );
1105 if ( !name.isNull() )
1106 emit
loadingLayer( tr(
"Loading layer %1" ).arg( name ) );
1108 profile.switchTask( name );
1110 if ( element.attribute( QStringLiteral(
"embedded" ) ) == QLatin1String(
"1" ) )
1112 createEmbeddedLayer( element.attribute( QStringLiteral(
"id" ) ),
readPath( element.attribute( QStringLiteral(
"project" ) ) ), brokenNodes,
true, flags );
1121 if ( !addLayer( element, brokenNodes, context, flags ) )
1123 returnStatus =
false;
1126 if ( !messages.isEmpty() )
1135 return returnStatus;
1138 bool QgsProject::addLayer(
const QDomElement &layerElem, QList<QDomNode> &brokenNodes,
QgsReadWriteContext &context, QgsProject::ReadFlags flags )
1140 QString type = layerElem.attribute( QStringLiteral(
"type" ) );
1142 std::unique_ptr<QgsMapLayer>
mapLayer;
1150 QgsDebugMsg( QStringLiteral(
"Unknown layer type \"%1\"" ).arg( type ) );
1154 switch ( layerType )
1158 mapLayer = std::make_unique<QgsVectorLayer>();
1168 mapLayer = std::make_unique<QgsRasterLayer>();
1172 mapLayer = std::make_unique<QgsMeshLayer>();
1176 mapLayer = std::make_unique<QgsVectorTileLayer>();
1180 mapLayer = std::make_unique<QgsPointCloudLayer>();
1185 QString
typeName = layerElem.attribute( QStringLiteral(
"name" ) );
1193 mapLayer = std::make_unique<QgsAnnotationLayer>( QString(), options );
1200 QgsDebugMsg( QStringLiteral(
"Unable to create layer" ) );
1208 const QString layerId { layerElem.namedItem( QStringLiteral(
"id" ) ).toElement().text() };
1209 Q_ASSERT( ! layerId.isEmpty() );
1213 QgsMapLayer::ReadFlags layerFlags = QgsMapLayer::ReadFlags();
1220 profile.switchTask( tr(
"Load layer source" ) );
1223 profile.switchTask( tr(
"Add layer to project" ) );
1224 QList<QgsMapLayer *> newLayers;
1236 QgsDebugMsg(
"Unable to load " + type +
" layer" );
1237 brokenNodes.push_back( layerElem );
1242 if ( ! layerWasStored )
1247 return layerIsValid;
1252 mFile.setFileName( filename );
1253 mCachedHomePath.clear();
1254 mProjectScope.reset();
1256 return read( flags );
1261 QString filename = mFile.fileName();
1266 QTemporaryFile inDevice;
1267 if ( !inDevice.open() )
1269 setError( tr(
"Unable to open %1" ).arg( inDevice.fileName() ) );
1275 if ( !storage->readProject( filename, &inDevice, context ) )
1277 QString err = tr(
"Unable to open %1" ).arg( filename );
1278 QList<QgsReadWriteContext::ReadWriteMessage> messages = context.
takeMessages();
1279 if ( !messages.isEmpty() )
1280 err += QStringLiteral(
"\n\n" ) + messages.last().message();
1284 returnValue = unzip( inDevice.fileName(), flags );
1290 returnValue = unzip( mFile.fileName(), flags );
1295 returnValue = readProjectFile( mFile.fileName(), flags );
1301 mFile.setFileName( filename );
1302 mCachedHomePath.clear();
1303 mProjectScope.reset();
1308 mTranslator.reset(
nullptr );
1315 bool QgsProject::readProjectFile(
const QString &filename, QgsProject::ReadFlags flags )
1318 ScopedIntIncrementor snapSignalBlock( &mBlockSnappingUpdates );
1320 QFile projectFile( filename );
1328 if ( QFile( QStringLiteral(
"%1/%2.qm" ).arg( QFileInfo( projectFile.fileName() ).absolutePath(), localeFileName ) ).exists() )
1330 mTranslator.reset(
new QTranslator() );
1331 mTranslator->load( localeFileName, QFileInfo( projectFile.fileName() ).absolutePath() );
1334 profile.switchTask( tr(
"Reading project file" ) );
1335 std::unique_ptr<QDomDocument> doc(
new QDomDocument( QStringLiteral(
"qgis" ) ) );
1337 if ( !projectFile.open( QIODevice::ReadOnly | QIODevice::Text ) )
1339 projectFile.close();
1341 setError( tr(
"Unable to open %1" ).arg( projectFile.fileName() ) );
1350 if ( !doc->setContent( &projectFile, &errorMsg, &line, &column ) )
1352 QString errorString = tr(
"Project file read error in file %1: %2 at line %3 column %4" )
1353 .arg( projectFile.fileName(), errorMsg ).arg( line ).arg( column );
1357 projectFile.close();
1359 setError( tr(
"%1 for file %2" ).arg( errorString, projectFile.fileName() ) );
1364 projectFile.close();
1372 profile.switchTask( tr(
"Updating project file" ) );
1373 if ( thisVersion > fileVersion )
1376 "version of qgis (saved in " + fileVersion.
text() +
1378 "). Problems may occur." );
1385 projectFile.updateRevision( thisVersion );
1389 profile.switchTask( tr(
"Creating auxiliary storage" ) );
1390 QString
fileName = mFile.fileName();
1391 std::unique_ptr<QgsAuxiliaryStorage> aStorage = std::move( mAuxiliaryStorage );
1393 mAuxiliaryStorage = std::move( aStorage );
1395 mCachedHomePath.clear();
1396 mProjectScope.reset();
1397 mSaveVersion = fileVersion;
1400 profile.switchTask( tr(
"Reading properties" ) );
1409 dump_( mProperties );
1414 _getTitle( *doc, oldTitle );
1416 readProjectFileMetadata( *doc, mSaveUser, mSaveUserFull, mSaveDateTime );
1418 QDomNodeList homePathNl = doc->elementsByTagName( QStringLiteral(
"homePath" ) );
1419 if ( homePathNl.count() > 0 )
1421 QDomElement homePathElement = homePathNl.at( 0 ).toElement();
1422 QString
homePath = homePathElement.attribute( QStringLiteral(
"path" ) );
1432 readNumEntry( QStringLiteral(
"Gui" ), QStringLiteral(
"/CanvasColorGreenPart" ), 255 ),
1433 readNumEntry( QStringLiteral(
"Gui" ), QStringLiteral(
"/CanvasColorBluePart" ), 255 ) );
1436 readNumEntry( QStringLiteral(
"Gui" ), QStringLiteral(
"/SelectionColorGreenPart" ), 255 ),
1437 readNumEntry( QStringLiteral(
"Gui" ), QStringLiteral(
"/SelectionColorBluePart" ), 255 ),
1438 readNumEntry( QStringLiteral(
"Gui" ), QStringLiteral(
"/SelectionColorAlphaPart" ), 255 ) );
1447 if (
readNumEntry( QStringLiteral(
"SpatialRefSys" ), QStringLiteral(
"/ProjectionsEnabled" ), 0 ) )
1450 QDomNode srsNode = doc->documentElement().namedItem( QStringLiteral(
"projectCrs" ) );
1451 if ( !srsNode.isNull() )
1453 projectCrs.
readXml( srsNode );
1458 QString projCrsString =
readEntry( QStringLiteral(
"SpatialRefSys" ), QStringLiteral(
"/ProjectCRSProj4String" ) );
1459 long currentCRS =
readNumEntry( QStringLiteral(
"SpatialRefSys" ), QStringLiteral(
"/ProjectCRSID" ), -1 );
1460 const QString authid =
readEntry( QStringLiteral(
"SpatialRefSys" ), QStringLiteral(
"/ProjectCrs" ) );
1463 bool isUserAuthId = authid.startsWith( QLatin1String(
"USER:" ), Qt::CaseInsensitive );
1464 if ( !authid.isEmpty() && !isUserAuthId )
1468 if ( !projectCrs.
isValid() && currentCRS >= 0 )
1474 if ( !projCrsString.isEmpty() && ( authid.isEmpty() || isUserAuthId ) && ( !projectCrs.
isValid() || projectCrs.
toProj() != projCrsString ) )
1488 QStringList datumErrors;
1489 if ( !mTransformContext.
readXml( doc->documentElement(), context, datumErrors ) && !datumErrors.empty() )
1497 QStringList variableNames =
readListEntry( QStringLiteral(
"Variables" ), QStringLiteral(
"/variableNames" ) );
1498 QStringList variableValues =
readListEntry( QStringLiteral(
"Variables" ), QStringLiteral(
"/variableValues" ) );
1500 mCustomVariables.clear();
1501 if ( variableNames.length() == variableValues.length() )
1503 for (
int i = 0; i < variableNames.length(); ++i )
1505 mCustomVariables.insert( variableNames.at( i ), variableValues.at( i ) );
1510 QgsMessageLog::logMessage( tr(
"Project Variables Invalid" ), tr(
"The project contains invalid variable settings." ) );
1513 QDomElement element = doc->documentElement().firstChildElement( QStringLiteral(
"projectMetadata" ) );
1515 if ( !element.isNull() )
1524 if ( mMetadata.
title().isEmpty() && !oldTitle.isEmpty() )
1531 element = doc->documentElement().firstChildElement( QStringLiteral(
"autotransaction" ) );
1532 if ( ! element.isNull() )
1534 if ( element.attribute( QStringLiteral(
"active" ), QStringLiteral(
"0" ) ).toInt() == 1 )
1535 mAutoTransaction =
true;
1538 element = doc->documentElement().firstChildElement( QStringLiteral(
"evaluateDefaultValues" ) );
1539 if ( !element.isNull() )
1541 if ( element.attribute( QStringLiteral(
"active" ), QStringLiteral(
"0" ) ).toInt() == 1 )
1542 mEvaluateDefaultValues =
true;
1546 element = doc->documentElement().firstChildElement( QStringLiteral(
"trust" ) );
1547 if ( !element.isNull() )
1549 if ( element.attribute( QStringLiteral(
"active" ), QStringLiteral(
"0" ) ).toInt() == 1 )
1550 mTrustLayerMetadata =
true;
1554 profile.switchTask( tr(
"Loading layer tree" ) );
1557 QDomElement layerTreeElem = doc->documentElement().firstChildElement( QStringLiteral(
"layer-tree-group" ) );
1558 if ( !layerTreeElem.isNull() )
1570 mLayerTreeRegistryBridge->
setEnabled(
false );
1573 profile.switchTask( tr(
"Reading map layers" ) );
1575 QList<QDomNode> brokenNodes;
1576 bool clean = _getMapLayers( *doc, brokenNodes, flags );
1581 QgsDebugMsg( QStringLiteral(
"Unable to get map layers from project file." ) );
1583 if ( !brokenNodes.isEmpty() )
1585 QgsDebugMsg(
"there are " + QString::number( brokenNodes.size() ) +
" broken layers" );
1593 mMainAnnotationLayer->
readLayerXml( doc->documentElement().firstChildElement( QStringLiteral(
"main-annotation-layer" ) ), context );
1598 profile.switchTask( tr(
"Resolving layer references" ) );
1599 QMap<QString, QgsMapLayer *>
layers = mLayerStore->mapLayers();
1600 for ( QMap<QString, QgsMapLayer *>::iterator it =
layers.begin(); it !=
layers.end(); ++it )
1602 it.value()->resolveReferences(
this );
1605 mLayerTreeRegistryBridge->
setEnabled(
true );
1608 profile.switchTask( tr(
"Loading embedded layers" ) );
1609 loadEmbeddedNodes( mRootGroup, flags );
1612 profile.switchTask( tr(
"Resolving references" ) );
1615 if ( !layerTreeElem.isNull() )
1621 QDomElement layerTreeCanvasElem = doc->documentElement().firstChildElement( QStringLiteral(
"layer-tree-canvas" ) );
1622 if ( !layerTreeCanvasElem.isNull( ) )
1630 const QStringList requiredLayerIds =
readListEntry( QStringLiteral(
"RequiredLayers" ), QStringLiteral(
"Layers" ) );
1631 for (
const QString &layerId : requiredLayerIds )
1638 const QStringList disabledLayerIds =
readListEntry( QStringLiteral(
"Identify" ), QStringLiteral(
"/disabledLayers" ) );
1639 for (
const QString &layerId : disabledLayerIds )
1653 profile.switchTask( tr(
"Storing original layer properties" ) );
1659 profile.switchTask( tr(
"Loading map themes" ) );
1662 mMapThemeCollection->readXml( *doc );
1664 profile.switchTask( tr(
"Loading label settings" ) );
1665 mLabelingEngineSettings->readSettingsFromProject(
this );
1668 profile.switchTask( tr(
"Loading annotations" ) );
1669 mAnnotationManager->readXml( doc->documentElement(), context );
1672 profile.switchTask( tr(
"Loading layouts" ) );
1673 mLayoutManager->readXml( doc->documentElement(), *doc );
1675 profile.switchTask( tr(
"Loading bookmarks" ) );
1676 mBookmarkManager->
readXml( doc->documentElement(), *doc );
1679 QMap<QString, QgsMapLayer *> existingMaps =
mapLayers();
1680 for ( QMap<QString, QgsMapLayer *>::iterator it = existingMaps.begin(); it != existingMaps.end(); ++it )
1682 it.value()->setDependencies( it.value()->dependencies() );
1685 profile.switchTask( tr(
"Loading snapping settings" ) );
1689 profile.switchTask( tr(
"Loading view settings" ) );
1692 const QStringList scales =
readListEntry( QStringLiteral(
"Scales" ), QStringLiteral(
"/ScalesList" ) );
1693 QVector<double> res;
1694 for (
const QString &scale : scales )
1696 const QStringList parts = scale.split(
':' );
1697 if ( parts.size() != 2 )
1701 const double denominator = QLocale().toDouble( parts[1], &ok );
1708 QDomElement viewSettingsElement = doc->documentElement().firstChildElement( QStringLiteral(
"ProjectViewSettings" ) );
1709 if ( !viewSettingsElement.isNull() )
1710 mViewSettings->
readXml( viewSettingsElement, context );
1713 profile.switchTask( tr(
"Loading temporal settings" ) );
1714 QDomElement timeSettingsElement = doc->documentElement().firstChildElement( QStringLiteral(
"ProjectTimeSettings" ) );
1715 if ( !timeSettingsElement.isNull() )
1716 mTimeSettings->
readXml( timeSettingsElement, context );
1718 profile.switchTask( tr(
"Loading display settings" ) );
1719 QDomElement displaySettingsElement = doc->documentElement().firstChildElement( QStringLiteral(
"ProjectDisplaySettings" ) );
1720 if ( !displaySettingsElement.isNull() )
1721 mDisplaySettings->
readXml( displaySettingsElement, context );
1723 profile.switchTask( tr(
"Updating variables" ) );
1725 profile.switchTask( tr(
"Updating CRS" ) );
1730 profile.switchTask( tr(
"Reading external settings" ) );
1734 profile.switchTask( tr(
"Updating interface" ) );
1736 snapSignalBlock.release();
1737 if ( !mBlockSnappingUpdates )
1748 QgsDebugMsgLevel( QString(
"Project save user: %1" ).arg( mSaveUser ), 2 );
1749 QgsDebugMsgLevel( QString(
"Project save user: %1" ).arg( mSaveUserFull ), 2 );
1758 QString newFileName( QStringLiteral(
"%1/%2.qgs" ).arg( QFileInfo( projectFile.fileName() ).absolutePath(), localeFileName ) );
1764 QgsMessageLog::logMessage( tr(
"Translated project saved with locale prefix %1" ).arg( newFileName ), QObject::tr(
"Project translation" ), Qgis::MessageLevel::Success );
1768 QgsMessageLog::logMessage( tr(
"Error saving translated project with locale prefix %1" ).arg( newFileName ), QObject::tr(
"Project translation" ), Qgis::MessageLevel::Critical );
1775 bool QgsProject::loadEmbeddedNodes(
QgsLayerTreeGroup *group, QgsProject::ReadFlags flags )
1778 const auto constChildren = group->
children();
1784 if ( childGroup->
customProperty( QStringLiteral(
"embedded" ) ).toInt() )
1787 QString projectPath =
readPath( childGroup->
customProperty( QStringLiteral(
"embedded_project" ) ).toString() );
1788 childGroup->
setCustomProperty( QStringLiteral(
"embedded_project" ), projectPath );
1792 QList<QgsLayerTreeNode *> clonedChildren;
1793 const auto constChildren = newGroup->
children();
1795 clonedChildren << newGroupChild->clone();
1803 loadEmbeddedNodes( childGroup, flags );
1808 if ( child->customProperty( QStringLiteral(
"embedded" ) ).toInt() )
1810 QList<QDomNode> brokenNodes;
1813 valid = valid &&
false;
1825 return mCustomVariables;
1830 if ( variables == mCustomVariables )
1834 QStringList variableNames;
1835 QStringList variableValues;
1837 QVariantMap::const_iterator it = variables.constBegin();
1838 for ( ; it != variables.constEnd(); ++it )
1840 variableNames << it.key();
1841 variableValues << it.value().toString();
1844 writeEntry( QStringLiteral(
"Variables" ), QStringLiteral(
"/variableNames" ), variableNames );
1845 writeEntry( QStringLiteral(
"Variables" ), QStringLiteral(
"/variableValues" ), variableValues );
1847 mCustomVariables = variables;
1848 mProjectScope.reset();
1855 *mLabelingEngineSettings = settings;
1861 return *mLabelingEngineSettings;
1866 mProjectScope.reset();
1867 return mLayerStore.get();
1872 return mLayerStore.get();
1877 QList<QgsVectorLayer *>
layers;
1878 QStringList layerIds =
readListEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/AvoidIntersectionsList" ), QStringList() );
1879 const auto constLayerIds = layerIds;
1880 for (
const QString &layerId : constLayerIds )
1891 const auto constLayers =
layers;
1893 list << layer->id();
1894 writeEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/AvoidIntersectionsList" ), list );
1911 if ( mProjectScope )
1913 std::unique_ptr< QgsExpressionContextScope > projectScope = std::make_unique< QgsExpressionContextScope >( *mProjectScope );
1917 return projectScope.release();
1920 mProjectScope = std::make_unique< QgsExpressionContextScope >( QObject::tr(
"Project" ) );
1924 QVariantMap::const_iterator it = vars.constBegin();
1926 for ( ; it != vars.constEnd(); ++it )
1928 mProjectScope->setVariable( it.key(), it.value(),
true );
1932 if ( projectPath.isEmpty() )
1933 projectPath = mOriginalPath;
1934 QString projectFolder = QFileInfo( projectPath ).path();
1935 QString projectFilename = QFileInfo( projectPath ).fileName();
1936 QString projectBasename =
baseName();
1965 QVariantMap keywords;
1967 for (
auto it = metadataKeywords.constBegin(); it != metadataKeywords.constEnd(); ++it )
1969 keywords.insert( it.key(), it.value() );
1974 QVariantList layersIds;
1976 const QMap<QString, QgsMapLayer *> layersInProject = mLayerStore->mapLayers();
1977 layersIds.reserve( layersInProject.count() );
1978 layers.reserve( layersInProject.count() );
1979 for (
auto it = layersInProject.constBegin(); it != layersInProject.constEnd(); ++it )
1981 layersIds << it.value()->id();
1987 mProjectScope->addFunction( QStringLiteral(
"project_color" ),
new GetNamedProjectColor(
this ) );
1992 void QgsProject::onMapLayersAdded(
const QList<QgsMapLayer *> &layers )
1994 QMap<QString, QgsMapLayer *> existingMaps =
mapLayers();
1996 bool tgChanged =
false;
1998 const auto constLayers =
layers;
2001 if ( layer->isValid() )
2003 QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
2010 const QString connString = QgsTransaction::connectionString( vlayer->
source() );
2018 mTransactionGroups.insert( qMakePair( key, connString ), tg );
2033 for ( QMap<QString, QgsMapLayer *>::const_iterator it = existingMaps.cbegin(); it != existingMaps.cend(); ++it )
2035 QSet<QgsMapLayerDependency> deps = it.value()->dependencies();
2036 if ( deps.contains( layer->id() ) )
2039 it.value()->setDependencies( deps );
2049 void QgsProject::onMapLayersRemoved(
const QList<QgsMapLayer *> &layers )
2055 void QgsProject::cleanTransactionGroups(
bool force )
2057 bool changed =
false;
2058 for ( QMap< QPair< QString, QString>,
QgsTransactionGroup *>::Iterator tg = mTransactionGroups.begin(); tg != mTransactionGroups.end(); )
2060 if ( tg.value()->
isEmpty() || force )
2063 tg = mTransactionGroups.erase( tg );
2081 QList<QDomNode> brokenNodes;
2082 if ( addLayer( layerNode.toElement(), brokenNodes, context ) )
2086 QVector<QgsVectorLayer *> vectorLayers = layers<QgsVectorLayer *>();
2087 const auto constVectorLayers = vectorLayers;
2091 layer->resolveReferences(
this );
2101 mFile.setFileName( filename );
2102 mCachedHomePath.clear();
2108 mProjectScope.reset();
2114 QString storageFilePath { storage->filePath( mFile.fileName() ) };
2115 if ( storageFilePath.isEmpty() )
2117 writeEntry( QStringLiteral(
"Paths" ), QStringLiteral(
"/Absolute" ),
true );
2121 QString tempPath = QStandardPaths::standardLocations( QStandardPaths::TempLocation ).at( 0 );
2122 QString tmpZipFilename( tempPath + QDir::separator() + QUuid::createUuid().toString() );
2124 if ( !zip( tmpZipFilename ) )
2127 QFile tmpZipFile( tmpZipFilename );
2128 if ( !tmpZipFile.open( QIODevice::ReadOnly ) )
2130 setError( tr(
"Unable to read file %1" ).arg( tmpZipFilename ) );
2135 if ( !storage->writeProject( mFile.fileName(), &tmpZipFile, context ) )
2137 QString err = tr(
"Unable to save project to storage %1" ).arg( mFile.fileName() );
2138 QList<QgsReadWriteContext::ReadWriteMessage> messages = context.
takeMessages();
2139 if ( !messages.isEmpty() )
2140 err += QStringLiteral(
"\n\n" ) + messages.last().message();
2146 QFile::remove( tmpZipFilename );
2153 return zip( mFile.fileName() );
2159 const bool asOk = saveAuxiliaryStorage();
2160 const bool writeOk = writeProjectFile( mFile.fileName() );
2163 if ( !asOk && writeOk )
2165 const QString err = mAuxiliaryStorage->errorString();
2166 setError( tr(
"Unable to save auxiliary storage ('%1')" ).arg( err ) );
2169 return asOk && writeOk;
2173 bool QgsProject::writeProjectFile(
const QString &filename )
2175 QFile projectFile( filename );
2181 QFileInfo myFileInfo( projectFile );
2182 if ( myFileInfo.exists() && !myFileInfo.isWritable() )
2184 setError( tr(
"%1 is not writable. Please adjust permissions (if possible) and try again." )
2185 .arg( projectFile.fileName() ) );
2193 QDomImplementation DomImplementation;
2194 DomImplementation.setInvalidDataPolicy( QDomImplementation::DropInvalidChars );
2196 QDomDocumentType documentType =
2197 DomImplementation.createDocumentType( QStringLiteral(
"qgis" ), QStringLiteral(
"http://mrcc.com/qgis.dtd" ),
2198 QStringLiteral(
"SYSTEM" ) );
2199 std::unique_ptr<QDomDocument> doc(
new QDomDocument( documentType ) );
2201 QDomElement qgisNode = doc->createElement( QStringLiteral(
"qgis" ) );
2202 qgisNode.setAttribute( QStringLiteral(
"projectname" ),
title() );
2203 qgisNode.setAttribute( QStringLiteral(
"version" ),
Qgis::version() );
2205 if ( !mSettings.value( QStringLiteral(
"projects/anonymize_saved_projects" ),
false, QgsSettings::Core ).toBool() )
2209 qgisNode.setAttribute( QStringLiteral(
"saveUser" ), newSaveUser );
2210 qgisNode.setAttribute( QStringLiteral(
"saveUserFull" ), newSaveUserFull );
2211 mSaveUser = newSaveUser;
2212 mSaveUserFull = newSaveUserFull;
2213 mSaveDateTime = QDateTime::currentDateTime();
2214 qgisNode.setAttribute( QStringLiteral(
"saveDateTime" ), mSaveDateTime.toString( Qt::ISODate ) );
2219 mSaveUserFull.clear();
2220 mSaveDateTime = QDateTime();
2222 doc->appendChild( qgisNode );
2225 QDomElement homePathNode = doc->createElement( QStringLiteral(
"homePath" ) );
2226 homePathNode.setAttribute( QStringLiteral(
"path" ), mHomePath );
2227 qgisNode.appendChild( homePathNode );
2230 QDomElement titleNode = doc->createElement( QStringLiteral(
"title" ) );
2231 qgisNode.appendChild( titleNode );
2233 QDomElement transactionNode = doc->createElement( QStringLiteral(
"autotransaction" ) );
2234 transactionNode.setAttribute( QStringLiteral(
"active" ), mAutoTransaction ? 1 : 0 );
2235 qgisNode.appendChild( transactionNode );
2237 QDomElement evaluateDefaultValuesNode = doc->createElement( QStringLiteral(
"evaluateDefaultValues" ) );
2238 evaluateDefaultValuesNode.setAttribute( QStringLiteral(
"active" ), mEvaluateDefaultValues ? 1 : 0 );
2239 qgisNode.appendChild( evaluateDefaultValuesNode );
2241 QDomElement trustNode = doc->createElement( QStringLiteral(
"trust" ) );
2242 trustNode.setAttribute( QStringLiteral(
"active" ), mTrustLayerMetadata ? 1 : 0 );
2243 qgisNode.appendChild( trustNode );
2245 QDomText titleText = doc->createTextNode(
title() );
2246 titleNode.appendChild( titleText );
2249 QDomElement srsNode = doc->createElement( QStringLiteral(
"projectCrs" ) );
2251 qgisNode.appendChild( srsNode );
2258 clonedRoot->
writeXml( qgisNode, context );
2262 writeEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/AvoidIntersectionsMode" ),
static_cast<int>( mAvoidIntersectionsMode ) );
2270 QDomElement annotationLayerNode = doc->createElement( QStringLiteral(
"main-annotation-layer" ) );
2271 mMainAnnotationLayer->
writeLayerXml( annotationLayerNode, *doc, context );
2272 qgisNode.appendChild( annotationLayerNode );
2276 QDomElement projectLayersNode = doc->createElement( QStringLiteral(
"projectlayers" ) );
2278 QMap<QString, QgsMapLayer *>::ConstIterator li =
layers.constBegin();
2279 while ( li !=
layers.end() )
2285 QHash< QString, QPair< QString, bool> >::const_iterator emIt = mEmbeddedLayers.constFind( ml->
id() );
2286 if ( emIt == mEmbeddedLayers.constEnd() )
2288 QDomElement maplayerElem;
2294 maplayerElem = doc->createElement( QStringLiteral(
"maplayer" ) );
2299 QDomDocument document;
2302 maplayerElem = document.firstChildElement();
2306 QgsDebugMsg( QStringLiteral(
"Could not restore layer properties for layer %1" ).arg( ml->
id() ) );
2312 projectLayersNode.appendChild( maplayerElem );
2318 if ( emIt.value().second )
2320 QDomElement mapLayerElem = doc->createElement( QStringLiteral(
"maplayer" ) );
2321 mapLayerElem.setAttribute( QStringLiteral(
"embedded" ), 1 );
2322 mapLayerElem.setAttribute( QStringLiteral(
"project" ),
writePath( emIt.value().first ) );
2323 mapLayerElem.setAttribute( QStringLiteral(
"id" ), ml->
id() );
2324 projectLayersNode.appendChild( mapLayerElem );
2331 qgisNode.appendChild( projectLayersNode );
2333 QDomElement layerOrderNode = doc->createElement( QStringLiteral(
"layerorder" ) );
2335 for (
QgsMapLayer *layer : constCustomLayerOrder )
2337 QDomElement mapLayerElem = doc->createElement( QStringLiteral(
"layer" ) );
2338 mapLayerElem.setAttribute( QStringLiteral(
"id" ), layer->id() );
2339 layerOrderNode.appendChild( mapLayerElem );
2341 qgisNode.appendChild( layerOrderNode );
2343 mLabelingEngineSettings->writeSettingsToProject(
this );
2345 writeEntry( QStringLiteral(
"Gui" ), QStringLiteral(
"/CanvasColorRedPart" ), mBackgroundColor.red() );
2346 writeEntry( QStringLiteral(
"Gui" ), QStringLiteral(
"/CanvasColorGreenPart" ), mBackgroundColor.green() );
2347 writeEntry( QStringLiteral(
"Gui" ), QStringLiteral(
"/CanvasColorBluePart" ), mBackgroundColor.blue() );
2349 writeEntry( QStringLiteral(
"Gui" ), QStringLiteral(
"/SelectionColorRedPart" ), mSelectionColor.red() );
2350 writeEntry( QStringLiteral(
"Gui" ), QStringLiteral(
"/SelectionColorGreenPart" ), mSelectionColor.green() );
2351 writeEntry( QStringLiteral(
"Gui" ), QStringLiteral(
"/SelectionColorBluePart" ), mSelectionColor.blue() );
2352 writeEntry( QStringLiteral(
"Gui" ), QStringLiteral(
"/SelectionColorAlphaPart" ), mSelectionColor.alpha() );
2356 dump_( mProperties );
2359 QgsDebugMsgLevel( QStringLiteral(
"there are %1 property scopes" ).arg(
static_cast<int>( mProperties.
count() ) ), 2 );
2364 mProperties.
writeXml( QStringLiteral(
"properties" ), qgisNode, *doc );
2367 QDomElement ddElem = doc->createElement( QStringLiteral(
"dataDefinedServerProperties" ) );
2368 mDataDefinedServerProperties.
writeXml( ddElem, dataDefinedServerPropertyDefinitions() );
2369 qgisNode.appendChild( ddElem );
2371 mMapThemeCollection->writeXml( *doc );
2373 mTransformContext.
writeXml( qgisNode, context );
2375 QDomElement metadataElem = doc->createElement( QStringLiteral(
"projectMetadata" ) );
2377 qgisNode.appendChild( metadataElem );
2379 QDomElement annotationsElem = mAnnotationManager->writeXml( *doc, context );
2380 qgisNode.appendChild( annotationsElem );
2382 QDomElement layoutElem = mLayoutManager->writeXml( *doc );
2383 qgisNode.appendChild( layoutElem );
2385 QDomElement bookmarkElem = mBookmarkManager->
writeXml( *doc );
2386 qgisNode.appendChild( bookmarkElem );
2388 QDomElement viewSettingsElem = mViewSettings->
writeXml( *doc, context );
2389 qgisNode.appendChild( viewSettingsElem );
2391 QDomElement timeSettingsElement = mTimeSettings->
writeXml( *doc, context );
2392 qgisNode.appendChild( timeSettingsElement );
2394 QDomElement displaySettingsElem = mDisplaySettings->
writeXml( *doc, context );
2395 qgisNode.appendChild( displaySettingsElem );
2403 QFile backupFile( QStringLiteral(
"%1~" ).arg( filename ) );
2405 ok &= backupFile.open( QIODevice::WriteOnly | QIODevice::Truncate );
2406 ok &= projectFile.open( QIODevice::ReadOnly );
2409 while ( ok && !projectFile.atEnd() )
2411 ba = projectFile.read( 10240 );
2412 ok &= backupFile.write( ba ) == ba.size();
2415 projectFile.close();
2420 setError( tr(
"Unable to create backup file %1" ).arg( backupFile.fileName() ) );
2425 struct utimbuf tb = {
static_cast<time_t
>( fi.lastRead().toSecsSinceEpoch() ),
static_cast<time_t
>( fi.lastModified().toSecsSinceEpoch() ) };
2426 utime( backupFile.fileName().toUtf8().constData(), &tb );
2429 if ( !projectFile.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
2431 projectFile.close();
2434 setError( tr(
"Unable to save to file %1" ).arg( projectFile.fileName() ) );
2438 QTemporaryFile tempFile;
2439 bool ok = tempFile.open();
2442 QTextStream projectFileStream( &tempFile );
2443 doc->save( projectFileStream, 2 );
2444 ok &= projectFileStream.pos() > -1;
2446 ok &= tempFile.seek( 0 );
2449 while ( ok && !tempFile.atEnd() )
2451 ba = tempFile.read( 10240 );
2452 ok &= projectFile.write( ba ) == ba.size();
2455 ok &= projectFile.error() == QFile::NoError;
2457 projectFile.close();
2464 setError( tr(
"Unable to save to file %1. Your project "
2465 "may be corrupted on disk. Try clearing some space on the volume and "
2466 "check file permissions before pressing save again." )
2467 .arg( projectFile.fileName() ) );
2479 bool propertiesModified;
2480 bool success =
addKey_( scope, key, &mProperties, value, propertiesModified );
2482 if ( propertiesModified )
2490 bool propertiesModified;
2491 bool success =
addKey_( scope, key, &mProperties, value, propertiesModified );
2493 if ( propertiesModified )
2501 bool propertiesModified;
2502 bool success =
addKey_( scope, key, &mProperties, value, propertiesModified );
2504 if ( propertiesModified )
2512 bool propertiesModified;
2513 bool success =
addKey_( scope, key, &mProperties, value, propertiesModified );
2515 if ( propertiesModified )
2523 bool propertiesModified;
2524 bool success =
addKey_( scope, key, &mProperties, value, propertiesModified );
2526 if ( propertiesModified )
2534 const QStringList &def,
2543 value =
property->value();
2545 bool valid = QVariant::StringList == value.type();
2551 return value.toStringList();
2573 value =
property->value();
2575 bool valid = value.canConvert( QVariant::String );
2580 return value.toString();
2597 value =
property->value();
2600 bool valid = value.canConvert( QVariant::Int );
2609 return value.toInt();
2622 QVariant value =
property->value();
2624 bool valid = value.canConvert( QVariant::Double );
2629 return value.toDouble();
2644 QVariant value =
property->value();
2646 bool valid = value.canConvert( QVariant::Bool );
2651 return value.toBool();
2661 if (
findKey_( scope, key, mProperties ) )
2667 return !
findKey_( scope, key, mProperties );
2675 QStringList entries;
2677 if ( foundProperty )
2692 QStringList entries;
2694 if ( foundProperty )
2707 dump_( mProperties );
2712 bool absolutePaths =
readBoolEntry( QStringLiteral(
"Paths" ), QStringLiteral(
"/Absolute" ),
false );
2714 if ( ! absolutePaths )
2721 filePath = storage->filePath( mFile.fileName() );
2741 void QgsProject::setError(
const QString &errorMessage )
2743 mErrorMessage = errorMessage;
2748 return mErrorMessage;
2751 void QgsProject::clearError()
2753 setError( QString() );
2758 delete mBadLayerHandler;
2759 mBadLayerHandler = handler;
2764 QHash< QString, QPair< QString, bool > >::const_iterator it = mEmbeddedLayers.find(
id );
2765 if ( it == mEmbeddedLayers.constEnd() )
2769 return it.value().first;
2773 bool saveFlag, QgsProject::ReadFlags flags )
2777 static QString sPrevProjectFilePath;
2778 static QDateTime sPrevProjectFileTimestamp;
2779 static QDomDocument sProjectDocument;
2781 QString qgsProjectFile = projectFilePath;
2783 if ( projectFilePath.endsWith( QLatin1String(
".qgz" ), Qt::CaseInsensitive ) )
2785 archive.
unzip( projectFilePath );
2789 QDateTime projectFileTimestamp = QFileInfo( projectFilePath ).lastModified();
2791 if ( projectFilePath != sPrevProjectFilePath || projectFileTimestamp != sPrevProjectFileTimestamp )
2793 sPrevProjectFilePath.clear();
2795 QFile projectFile( qgsProjectFile );
2796 if ( !projectFile.open( QIODevice::ReadOnly ) )
2801 if ( !sProjectDocument.setContent( &projectFile ) )
2806 sPrevProjectFilePath = projectFilePath;
2807 sPrevProjectFileTimestamp = projectFileTimestamp;
2811 bool useAbsolutePaths =
true;
2813 QDomElement propertiesElem = sProjectDocument.documentElement().firstChildElement( QStringLiteral(
"properties" ) );
2814 if ( !propertiesElem.isNull() )
2816 QDomElement absElem = propertiesElem.firstChildElement( QStringLiteral(
"Paths" ) ).firstChildElement( QStringLiteral(
"Absolute" ) );
2817 if ( !absElem.isNull() )
2819 useAbsolutePaths = absElem.text().compare( QLatin1String(
"true" ), Qt::CaseInsensitive ) == 0;
2824 if ( !useAbsolutePaths )
2829 QDomElement projectLayersElem = sProjectDocument.documentElement().firstChildElement( QStringLiteral(
"projectlayers" ) );
2830 if ( projectLayersElem.isNull() )
2835 QDomElement mapLayerElem = projectLayersElem.firstChildElement( QStringLiteral(
"maplayer" ) );
2836 while ( ! mapLayerElem.isNull() )
2839 QString
id = mapLayerElem.firstChildElement( QStringLiteral(
"id" ) ).text();
2840 if (
id == layerId )
2843 if ( mapLayerElem.attribute( QStringLiteral(
"embedded" ) ) == QLatin1String(
"1" ) )
2848 mEmbeddedLayers.insert( layerId, qMakePair( projectFilePath, saveFlag ) );
2850 if ( addLayer( mapLayerElem, brokenNodes, embeddedContext, flags ) )
2856 mEmbeddedLayers.remove( layerId );
2860 mapLayerElem = mapLayerElem.nextSiblingElement( QStringLiteral(
"maplayer" ) );
2869 QString qgsProjectFile = projectFilePath;
2871 if ( projectFilePath.endsWith( QLatin1String(
".qgz" ), Qt::CaseInsensitive ) )
2873 archive.
unzip( projectFilePath );
2878 QFile projectFile( qgsProjectFile );
2879 if ( !projectFile.open( QIODevice::ReadOnly ) )
2884 QDomDocument projectDocument;
2885 if ( !projectDocument.setContent( &projectFile ) )
2897 QDomElement layerTreeElem = projectDocument.documentElement().firstChildElement( QStringLiteral(
"layer-tree-group" ) );
2898 if ( !layerTreeElem.isNull() )
2908 if ( !group || group->
customProperty( QStringLiteral(
"embedded" ) ).toBool() )
2921 newGroup->
setCustomProperty( QStringLiteral(
"embedded_project" ), projectFilePath );
2924 mLayerTreeRegistryBridge->
setEnabled(
false );
2925 initializeEmbeddedSubtree( projectFilePath, newGroup, flags );
2926 mLayerTreeRegistryBridge->
setEnabled(
true );
2929 const auto constFindLayerIds = newGroup->
findLayerIds();
2930 for (
const QString &layerId : constFindLayerIds )
2943 void QgsProject::initializeEmbeddedSubtree(
const QString &projectFilePath,
QgsLayerTreeGroup *group, QgsProject::ReadFlags flags )
2945 const auto constChildren = group->
children();
2949 child->setCustomProperty( QStringLiteral(
"embedded" ), 1 );
2958 QList<QDomNode> brokenNodes;
2966 return mEvaluateDefaultValues;
2975 QMap<QString, QgsMapLayer *>::const_iterator layerIt =
layers.constBegin();
2976 for ( ; layerIt !=
layers.constEnd(); ++layerIt )
2978 QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layerIt.value() );
2990 writeEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/TopologicalEditing" ), ( enabled ? 1 : 0 ) );
2996 return readNumEntry( QStringLiteral(
"Digitizing" ), QStringLiteral(
"/TopologicalEditing" ), 0 );
3001 QString distanceUnitString =
readEntry( QStringLiteral(
"Measurement" ), QStringLiteral(
"/DistanceUnits" ), QString() );
3002 if ( !distanceUnitString.isEmpty() )
3018 QString areaUnitString =
readEntry( QStringLiteral(
"Measurement" ), QStringLiteral(
"/AreaUnits" ), QString() );
3019 if ( !areaUnitString.isEmpty() )
3035 if ( !mCachedHomePath.isEmpty() )
3036 return mCachedHomePath;
3040 if ( !mHomePath.isEmpty() )
3042 QFileInfo homeInfo( mHomePath );
3043 if ( !homeInfo.isRelative() )
3045 mCachedHomePath = mHomePath;
3051 mCachedHomePath = pfi.path();
3053 return mCachedHomePath;
3056 if ( !pfi.exists() )
3058 mCachedHomePath = mHomePath;
3062 if ( !mHomePath.isEmpty() )
3065 mCachedHomePath = QDir::cleanPath( pfi.path() +
'/' + mHomePath );
3069 mCachedHomePath = pfi.canonicalPath();
3071 return mCachedHomePath;
3081 return mRelationManager;
3086 return mLayoutManager.get();
3091 return mLayoutManager.get();
3096 return mBookmarkManager;
3101 return mBookmarkManager;
3106 return mViewSettings;
3111 return mViewSettings;
3116 return mTimeSettings;
3121 return mTimeSettings;
3126 return mDisplaySettings;
3131 return mDisplaySettings;
3141 return mMapThemeCollection.get();
3146 return mAnnotationManager.get();
3151 return mAnnotationManager.get();
3156 const QMap<QString, QgsMapLayer *> &projectLayers =
mapLayers();
3157 for ( QMap<QString, QgsMapLayer *>::const_iterator it = projectLayers.constBegin(); it != projectLayers.constEnd(); ++it )
3162 if (
layers.contains( it.value() ) )
3177 for (
const QString &layerId : layerIds )
3193 for ( QMap<QString, QgsMapLayer *>::const_iterator it =
layers.constBegin(); it !=
layers.constEnd(); ++it )
3205 return mAutoTransaction;
3215 onMapLayersAdded(
mapLayers().values() );
3217 cleanTransactionGroups(
true );
3223 return mTransactionGroups;
3234 return mLayerStore->count();
3239 return mLayerStore->validCount();
3244 return mLayerStore->mapLayer( layerId );
3249 return mLayerStore->mapLayersByName( layerName );
3254 QList<QgsMapLayer *>
layers;
3255 const auto constMapLayers { mLayerStore->mapLayers() };
3256 for (
const auto &l : constMapLayers )
3258 if ( ! l->shortName().isEmpty() )
3260 if ( l->shortName() == shortName )
3263 else if ( l->name() == shortName )
3271 bool QgsProject::unzip(
const QString &filename, QgsProject::ReadFlags flags )
3277 if ( !archive->unzip( filename ) )
3279 setError( tr(
"Unable to unzip file '%1'" ).arg( filename ) );
3284 if ( archive->projectFile().isEmpty() )
3286 setError( tr(
"Zip archive does not provide a project file" ) );
3291 if ( !archive->auxiliaryStorageFile().isEmpty() )
3295 mAuxiliaryStorage.reset(
new QgsAuxiliaryStorage( archive->auxiliaryStorageFile(),
false ) );
3303 if ( ! readProjectFile( archive->projectFile(), flags ) )
3305 setError( tr(
"Cannot read unzipped qgs project file" ) );
3310 mArchive = std::move( archive );
3311 mArchive->clearProjectFile();
3316 bool QgsProject::zip(
const QString &filename )
3322 const QString
baseName = QFileInfo( filename ).baseName();
3323 const QString qgsFileName = QStringLiteral(
"%1.qgs" ).arg(
baseName );
3324 QFile qgsFile( QDir( archive->dir() ).filePath( qgsFileName ) );
3326 bool writeOk =
false;
3327 if ( qgsFile.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
3329 writeOk = writeProjectFile( qgsFile.fileName() );
3336 setError( tr(
"Unable to write temporary qgs file" ) );
3341 const QFileInfo info( qgsFile );
3344 if ( ! saveAuxiliaryStorage( asFileName ) )
3346 const QString err = mAuxiliaryStorage->errorString();
3347 setError( tr(
"Unable to save auxiliary storage ('%1')" ).arg( err ) );
3352 archive->addFile( qgsFile.fileName() );
3353 archive->addFile( asFileName );
3356 if ( !archive->zip( filename ) )
3358 setError( tr(
"Unable to perform zip" ) );
3371 const QList<QgsMapLayer *> &layers,
3373 bool takeOwnership )
3375 const QList<QgsMapLayer *> myResultList { mLayerStore->addMapLayers(
layers, takeOwnership ) };
3376 if ( !myResultList.isEmpty() )
3379 for (
auto &l : myResultList )
3389 if ( mAuxiliaryStorage )
3404 mProjectScope.reset();
3406 return myResultList;
3412 bool takeOwnership )
3414 QList<QgsMapLayer *> addedLayers;
3415 addedLayers =
addMapLayers( QList<QgsMapLayer *>() << layer, addToLegend, takeOwnership );
3416 return addedLayers.isEmpty() ? nullptr : addedLayers[0];
3421 mProjectScope.reset();
3422 mLayerStore->removeMapLayers( layerIds );
3427 mProjectScope.reset();
3428 mLayerStore->removeMapLayers(
layers );
3433 mProjectScope.reset();
3434 mLayerStore->removeMapLayer( layerId );
3439 mProjectScope.reset();
3440 mLayerStore->removeMapLayer( layer );
3445 mProjectScope.reset();
3446 return mLayerStore->takeMapLayer( layer );
3451 return mMainAnnotationLayer;
3456 if ( mLayerStore->count() == 0 )
3459 ScopedIntIncrementor snapSingleBlocker( &mBlockSnappingUpdates );
3460 mProjectScope.reset();
3461 mLayerStore->removeAllMapLayers();
3463 snapSingleBlocker.release();
3465 if ( !mBlockSnappingUpdates )
3471 QMap<QString, QgsMapLayer *>
layers = mLayerStore->mapLayers();
3472 QMap<QString, QgsMapLayer *>::const_iterator it =
layers.constBegin();
3473 for ( ; it !=
layers.constEnd(); ++it )
3475 it.value()->reload();
3481 return validOnly ? mLayerStore->validMapLayers() : mLayerStore->mapLayers();
3486 return mTransactionGroups.value( qMakePair( providerKey, connString ) );
3495 if ( mSettings.value( QStringLiteral(
"/projections/unknownCrsBehavior" ), QStringLiteral(
"NoAction" ), QgsSettings::App ).toString() == QStringLiteral(
"UseProjectCrs" )
3496 || mSettings.value( QStringLiteral(
"/projections/unknownCrsBehavior" ), 0, QgsSettings::App ).toString() == QLatin1String(
"2" ) )
3504 QString layerDefaultCrs = mSettings.value( QStringLiteral(
"/Projections/layerDefaultCrs" ),
geoEpsgCrsAuthId() ).toString();
3513 mTrustLayerMetadata = trust;
3516 for (
auto it =
layers.constBegin(); it !=
layers.constEnd(); ++it )
3518 QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( it.value() );
3526 bool QgsProject::saveAuxiliaryStorage(
const QString &filename )
3530 for (
auto it =
layers.constBegin(); it !=
layers.constEnd(); ++it )
3535 QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( it.value() );
3543 if ( !mAuxiliaryStorage->exists( *
this ) && filename.isEmpty() && empty )
3547 else if ( !filename.isEmpty() )
3549 return mAuxiliaryStorage->saveAs( filename );
3553 return mAuxiliaryStorage->saveAs( *
this );
3562 QgsProject::DataDefinedServerProperty::WMSOnlineResource,
3566 return sPropertyDefinitions;
3571 return mAuxiliaryStorage.get();
3576 return mAuxiliaryStorage.get();
3590 mProjectScope.reset();
3602 for ( QMap<QString, QgsMapLayer *>::const_iterator it =
layers.constBegin(); it !=
layers.constEnd(); ++it )
3614 const QMap<QString, QgsMapLayer *> &projectLayers =
mapLayers();
3615 for ( QMap<QString, QgsMapLayer *>::const_iterator it = projectLayers.constBegin(); it != projectLayers.constEnd(); ++it )
3620 if (
layers.contains( it.value() ) )
3630 QStringList customColors;
3631 QStringList customColorLabels;
3633 QgsNamedColorList::const_iterator colorIt = colors.constBegin();
3634 for ( ; colorIt != colors.constEnd(); ++colorIt )
3637 QString label = ( *colorIt ).second;
3638 customColors.append( color );
3639 customColorLabels.append( label );
3641 writeEntry( QStringLiteral(
"Palette" ), QStringLiteral(
"/Colors" ), customColors );
3642 writeEntry( QStringLiteral(
"Palette" ), QStringLiteral(
"/Labels" ), customColorLabels );
3643 mProjectScope.reset();
3649 if ( mBackgroundColor == color )
3652 mBackgroundColor = color;
3658 return mBackgroundColor;
3663 if ( mSelectionColor == color )
3666 mSelectionColor = color;
3672 return mSelectionColor;
3706 QString
QgsProject::translate(
const QString &context,
const QString &sourceText,
const char *disambiguation,
int n )
const
3713 QString result = mTranslator->translate( context.toUtf8(), sourceText.toUtf8(), disambiguation, n );
3715 if ( result.isEmpty() )
3727 for (
auto it =
layers.constBegin(); it !=
layers.constEnd(); ++it )
3732 if ( !( ( *it )->accept( visitor ) ) )
3741 if ( !mLayoutManager->accept( visitor ) )
3744 if ( !mAnnotationManager->accept( visitor ) )
3751 GetNamedProjectColor::GetNamedProjectColor(
const QgsProject *project )
3758 QStringList colorStrings = project->
readListEntry( QStringLiteral(
"Palette" ), QStringLiteral(
"/Colors" ) );
3759 QStringList colorLabels = project->
readListEntry( QStringLiteral(
"Palette" ), QStringLiteral(
"/Labels" ) );
3763 for ( QStringList::iterator it = colorStrings.begin();
3764 it != colorStrings.end(); ++it )
3768 if ( colorLabels.length() > colorIndex )
3770 label = colorLabels.at( colorIndex );
3773 mColors.insert( label.toLower(), color );
3778 GetNamedProjectColor::GetNamedProjectColor(
const QHash<QString, QColor> &colors )
3786 QString colorName = values.at( 0 ).toString().toLower();
3787 if ( mColors.contains( colorName ) )
3789 return QStringLiteral(
"%1,%2,%3" ).arg( mColors.value( colorName ).red() ).arg( mColors.value( colorName ).green() ).arg( mColors.value( colorName ).blue() );
3797 return new GetNamedProjectColor( mColors );
static QString version()
Version string.
virtual bool readXml(const QDomElement &collectionElem, const QgsPropertiesDefinition &definitions)
Reads property collection state from an XML element.
virtual bool writeXml(QDomElement &collectionElem, const QgsPropertiesDefinition &definitions) const
Writes the current state of the property collection into an XML element.
Represents a map layer containing a set of georeferenced annotations, e.g.
void setTransformContext(const QgsCoordinateTransformContext &context) override
Sets the coordinate transform context to transformContext.
void reset()
Resets the annotation layer to a default state, and clears all items from it.
Manages storage of a set of QgsAnnotation annotation objects.
static QgsApplication * instance()
Returns the singleton instance of the QgsApplication.
static QgsProjectStorageRegistry * projectStorageRegistry()
Returns registry of available project storage implementations.
static QgsRuntimeProfiler * profiler()
Returns the application runtime profiler.
void collectTranslatableObjects(QgsTranslationContext *translationContext)
Emits the signal to collect all the strings of .qgs to be included in ts file.
static QgsPluginLayerRegistry * pluginLayerRegistry()
Returns the application's plugin layer registry, used for managing plugin layer types.
void requestForTranslatableObjects(QgsTranslationContext *translationContext)
Emitted when project strings which require translation are being collected for inclusion in a ....
static QString userFullName()
Returns the user's operating system login account full display name.
static QString userLoginName()
Returns the user's operating system login account name.
static const QgsSettingsEntryString settingsLocaleUserLocale
Settings entry locale user locale.
QgsFields auxiliaryFields() const
Returns a list of all auxiliary fields currently managed by the layer.
bool save()
Commits changes and starts editing then.
Class providing some utility methods to manage auxiliary storage.
static QString extension()
Returns the extension used for auxiliary databases.
Manages storage of a set of bookmarks.
bool readXml(const QDomElement &element, const QDomDocument &doc)
Reads the manager's state from a DOM element, restoring all bookmarks present in the XML document.
void clear()
Removes and deletes all bookmarks from the manager.
QDomElement writeXml(QDomDocument &doc) const
Returns a DOM element representing the state of the manager.
This class represents a coordinate reference system (CRS).
static QgsCoordinateReferenceSystem fromOgcWmsCrs(const QString &ogcCrs)
Creates a CRS from a given OGC WMS-format Coordinate Reference System string.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QString toProj() const
Returns a Proj string representation of this CRS.
bool readXml(const QDomNode &node)
Restores state from the given DOM node.
QString ellipsoidAcronym() const
Returns the ellipsoid acronym for the ellipsoid used by the CRS.
QString description() const
Returns the descriptive name of the CRS, e.g., "WGS 84" or "GDA 94 / Vicgrid94".
QString projectionAcronym() const
Returns the projection acronym for the projection used by the CRS.
static QgsCoordinateReferenceSystem fromProj(const QString &proj)
Creates a CRS from a proj style formatted string.
QString authid() const
Returns the authority identifier for the CRS.
@ WKT_PREFERRED
Preferred format, matching the most recent WKT ISO standard. Currently an alias to WKT2_2019,...
bool writeXml(QDomNode &node, QDomDocument &doc) const
Stores state to the given Dom node in the given document.
static QgsCoordinateReferenceSystem fromSrsId(long srsId)
Creates a CRS from a specified QGIS SRS ID.
QString toWkt(WktVariant variant=WKT1_GDAL, bool multiline=false, int indentationWidth=4) const
Returns a WKT representation of this CRS.
Q_GADGET QgsUnitTypes::DistanceUnit mapUnits
Contains information about the context in which a coordinate transform is executed.
void readSettings()
Reads the context's state from application settings.
void writeXml(QDomElement &element, const QgsReadWriteContext &context) const
Writes the context's state to a DOM element.
bool readXml(const QDomElement &element, const QgsReadWriteContext &context, QStringList &missingTransforms)
Reads the context's state from a DOM element.
void setProviderProperty(ProviderProperty property, const QVariant &value)
Allows setting arbitrary properties on the provider.
@ EvaluateDefaultValues
Evaluate default values on provider side when calling QgsVectorDataProvider::defaultValue( int index ...
Single scope for storing variables and functions for use within a QgsExpressionContext.
static QgsExpressionContextScope * projectScope(const QgsProject *project)
Creates a new scope which contains variables and functions relating to a QGIS project.
static QgsExpressionContextScope * globalScope()
Creates a new scope which contains variables and functions relating to the global QGIS context.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
An expression node for expression functions.
Class for parsing and evaluation of expressions (formerly called "search strings").
Encapsulate a field in an attribute table or data source.
QgsEditorWidgetSetup editorWidgetSetup() const
Gets the editor widget setup for the field.
Container of fields for a vector layer.
bool isEmpty() const
Checks whether the container is empty.
Stores global configuration for labeling engine.
Class used to work with layer dependencies stored in a XML project or layer definition file.
Layer tree group node serves as a container for layers and further groups.
void resolveReferences(const QgsProject *project, bool looseMatching=false) override
Calls resolveReferences() on child tree nodes.
QgsLayerTreeGroup * findGroup(const QString &name)
Find group node with specified name.
QList< QgsLayerTreeGroup * > findGroups(bool recursive=false) const
Find group layer nodes.
QString name() const override
Returns the group's name.
QStringList findLayerIds() const
Find layer IDs used in all layer nodes.
void insertChildNodes(int index, const QList< QgsLayerTreeNode * > &nodes)
Insert existing nodes at specified position.
void readChildrenFromXml(QDomElement &element, const QgsReadWriteContext &context)
Read children from XML and append them to the group.
QgsLayerTreeGroup * clone() const override
Returns a clone of the group.
QList< QgsLayerTreeLayer * > findLayers() const
Find all layer nodes.
QgsLayerTreeLayer * findLayer(QgsMapLayer *layer) const
Find layer node representing the map layer.
Layer tree node points to a map layer.
void resolveReferences(const QgsProject *project, bool looseMatching=false) override
Resolves reference to layer from stored layer ID (if it has not been resolved already)
This class is a base class for nodes in a layer tree.
QList< QgsLayerTreeNode * > abandonChildren()
Removes the childrens, disconnect all the forwarded and external signals and sets their parent to nul...
void setCustomProperty(const QString &key, const QVariant &value)
Sets a custom property for the node. Properties are stored in a map and saved in project file.
virtual void writeXml(QDomElement &parentElement, const QgsReadWriteContext &context)=0
Write layer tree to XML.
void removeCustomProperty(const QString &key)
Remove a custom property from layer. Properties are stored in a map and saved in project file.
QVariant customProperty(const QString &key, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer. Properties are stored in a map and saved in project file.
QList< QgsLayerTreeNode * > children()
Gets list of children of the node. Children are owned by the parent.
void setItemVisibilityChecked(bool checked)
Check or uncheck a node (independently of its ancestors or children)
Listens to the updates in map layer registry and does changes in layer tree.
void setEnabled(bool enabled)
static void replaceChildrenOfEmbeddedGroups(QgsLayerTreeGroup *group)
Remove subtree of embedded groups and replaces it with a custom property embedded-visible-layers.
static void storeOriginalLayersProperties(QgsLayerTreeGroup *group, const QDomDocument *doc)
Stores in a layer's originalXmlProperties the layer properties information.
static void updateEmbeddedGroupsProjectPath(QgsLayerTreeGroup *group, const QgsProject *project)
Updates an embedded group from a project.
static bool readOldLegend(QgsLayerTreeGroup *root, const QDomElement &legendElem)
Try to load layer tree from.
Namespace with helper functions for layer tree operations.
void readLayerOrderFromXml(const QDomElement &doc)
Load the layer order from an XML element.
void clear()
Clear any information from this layer tree.
static bool isLayer(const QgsLayerTreeNode *node)
Check whether the node is a valid layer node.
static QgsLayerTreeLayer * toLayer(QgsLayerTreeNode *node)
Cast node to a layer.
static bool isGroup(QgsLayerTreeNode *node)
Check whether the node is a valid group node.
QList< QgsMapLayer * > customLayerOrder() const
The order in which layers will be rendered on the canvas.
static QgsLayerTreeGroup * toGroup(QgsLayerTreeNode *node)
Cast node to a group.
QgsLayerTree * clone() const override
Create a copy of the node. Returns new instance.
Manages storage of a set of layouts.
static void warning(const QString &msg)
Goes to qWarning.
static QgsMapLayerType typeFromString(const QString &string, bool &ok)
Returns the map layer type corresponding a string value.
A storage object for map layers, in which the layers are owned by the store and have their lifetime b...
void layersWillBeRemoved(const QStringList &layerIds)
Emitted when one or more layers are about to be removed from the store.
void layerWillBeRemoved(const QString &layerId)
Emitted when a layer is about to be removed from the store.
void layersRemoved(const QStringList &layerIds)
Emitted after one or more layers were removed from the store.
void allLayersRemoved()
Emitted when all layers are removed, before layersWillBeRemoved() and layerWillBeRemoved() signals ar...
void layerRemoved(const QString &layerId)
Emitted after a layer was removed from the store.
void layerWasAdded(QgsMapLayer *layer)
Emitted when a layer was added to the store.
QgsMapLayer * mapLayer(const QString &id) const
Retrieve a pointer to a layer by layer id.
void layersAdded(const QList< QgsMapLayer * > &layers)
Emitted when one or more layers were added to the store.
Base class for all map layer types.
QString source() const
Returns the source for the layer.
QString providerType() const
Returns the provider type (provider key) for this layer.
void configChanged()
Emitted whenever the configuration is changed.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
QString originalXmlProperties() const
Returns the XML properties of the original layer as they were when the layer was first read from the ...
bool writeLayerXml(QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context) const
Stores state in DOM node.
bool readLayerXml(const QDomElement &layerElement, QgsReadWriteContext &context, QgsMapLayer::ReadFlags flags=QgsMapLayer::ReadFlags())
Sets state from DOM document.
@ Identifiable
If the layer is identifiable using the identify map tool and as a WMS layer.
@ Removable
If the layer can be removed from the project. The layer will not be removable from the legend menu en...
@ FlagTrustLayerMetadata
Trust layer metadata. Improves layer load time by skipping expensive checks like primary key unicity,...
@ FlagDontResolveLayers
Don't resolve layer paths or create data providers for layers.
Container class that allows storage of map themes consisting of visible map layers and layer styles.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
Resolves relative paths into absolute paths and vice versa.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
Class allowing to manage the zip/unzip actions on project file.
QString projectFile() const
Returns the current .qgs project file or an empty string if there's none.
bool unzip(const QString &zipFilename) override
Clear the current content of this archive and unzip.
Interface for classes that handle missing layer files when reading project file.
virtual void handleBadLayers(const QList< QDomNode > &layers)
This method will be called whenever the project tries to load layers which cannot be accessed.
Contains settings and properties relating to how a QgsProject should display values such as map coord...
void reset()
Resets the settings to a default state.
bool readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads the settings's state from a DOM element.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Returns a DOM element representing the settings.
Project property key node.
QString name() const
The name of the property is used as identifier.
QgsProjectPropertyKey * addKey(const QString &keyName)
Adds the specified property key as a sub-key.
void removeKey(const QString &keyName)
Removes the specified key.
void dump(int tabs=0) const override
Dumps out the keys and values.
bool isEmpty() const
Returns true if this property contains no sub-keys.
virtual void clearKeys()
Deletes any sub-nodes from the property.
bool writeXml(const QString &nodeName, QDomElement &element, QDomDocument &document) override
Writes the property hierarchy to a specified DOM element.
void subkeyList(QStringList &entries) const
Returns any sub-keys contained by this property which themselves contain other keys.
QgsProjectProperty * find(const QString &propertyName) const
Attempts to find a property with a matching sub-key name.
void setName(const QString &name)
The name of the property is used as identifier.
QVariant value() const override
If this key has a value, it will be stored by its name in its properties.
void entryList(QStringList &entries) const
Returns any sub-keys contained by this property that do not contain other keys.
int count() const
Returns the number of sub-keys contained by this property.
QgsProjectPropertyValue * setValue(const QString &name, const QVariant &value)
Sets the value associated with this key.
bool readXml(const QDomNode &keyNode) override
Restores the property hierarchy from a specified DOM node.
An Abstract Base Class for QGIS project property hierarchys.
virtual bool isKey() const =0
Returns true if the property is a QgsProjectPropertyKey.
virtual bool isValue() const =0
Returns true if the property is a QgsProjectPropertyValue.
QgsProjectStorage * projectStorageFromUri(const QString &uri)
Returns storage implementation if the URI matches one. Returns nullptr otherwise (it is a normal file...
Abstract interface for project storage - to be implemented by various backends and registered in QgsP...
Contains temporal settings and properties for the project, this may be used when animating maps or sh...
bool readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads the settings's state from a DOM element.
void reset()
Resets the settings to a default state.
QDomElement writeXml(QDomDocument &document, const QgsReadWriteContext &context) const
Returns a DOM element representing the settings.
A class to describe the version of a project.
QString text() const
Returns a string representation of the version.
Contains settings and properties relating to how a QgsProject should be displayed inside map canvas,...
bool useProjectScales() const
Returns true if project mapScales() are enabled.
void reset()
Resets the settings to a default state.
bool readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads the settings's state from a DOM element.
void setMapScales(const QVector< double > &scales)
Sets the list of custom project map scales.
void setUseProjectScales(bool enabled)
Sets whether project mapScales() are enabled.
QVector< double > mapScales() const
Returns the list of custom project map scales.
void mapScalesChanged()
Emitted when the list of custom project map scales changes.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Returns a DOM element representing the settings.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
bool isZipped() const
Returns true if the project comes from a zip archive, false otherwise.
QgsProject(QObject *parent=nullptr)
Create a new QgsProject.
void setAvoidIntersectionsMode(const AvoidIntersectionsMode mode)
Sets the avoid intersections mode.
QgsRelationManager * relationManager
bool write()
Writes the project to its current associated file (see fileName() ).
void removeMapLayer(const QString &layerId)
Remove a layer from the registry by layer ID.
bool evaluateDefaultValues() const
Should default values be evaluated on provider side when requested and not when committed.
void setAreaUnits(QgsUnitTypes::AreaUnit unit)
Sets the default area measurement units for the project.
void layersRemoved(const QStringList &layerIds)
Emitted after one or more layers were removed from the registry.
void clear()
Clears the project, removing all settings and resetting it back to an empty, default state.
QString error() const
Returns error message from previous read/write.
Q_DECL_DEPRECATED void setUseProjectScales(bool enabled)
Sets whether project mapScales() are enabled.
int readNumEntry(const QString &scope, const QString &key, int def=0, bool *ok=nullptr) const
Reads an integer from the specified scope and key.
Q_DECL_DEPRECATED void setNonIdentifiableLayers(const QList< QgsMapLayer * > &layers)
Set a list of layers which should not be taken into account on map identification.
QList< QgsMapLayer * > addMapLayers(const QList< QgsMapLayer * > &mapLayers, bool addToLegend=true, bool takeOwnership=true)
Add a list of layers to the map of loaded layers.
Q_DECL_DEPRECATED QFileInfo fileInfo() const
Returns QFileInfo object for the project's associated file.
QString presetHomePath() const
Returns any manual project home path setting, or an empty string if not set.
void setBackgroundColor(const QColor &color)
Sets the default background color used by default map canvases.
void setCrs(const QgsCoordinateReferenceSystem &crs, bool adjustEllipsoid=false)
Sets the project's native coordinate reference system.
QString title() const
Returns the project's title.
void mapThemeCollectionChanged()
Emitted when the map theme collection changes.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Q_DECL_DEPRECATED void mapScalesChanged()
Emitted when the list of custom project map scales changes.
void fileNameChanged()
Emitted when the file name of the project changes.
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
void writeMapLayer(QgsMapLayer *mapLayer, QDomElement &layerElem, QDomDocument &doc)
Emitted when a layer is being saved.
void setSnappingConfig(const QgsSnappingConfig &snappingConfig)
The snapping configuration for this project.
void setDistanceUnits(QgsUnitTypes::DistanceUnit unit)
Sets the default distance measurement units for the project.
QgsPropertyCollection dataDefinedServerProperties() const
Returns the data defined properties used for overrides in user defined server parameters.
Q_DECL_DEPRECATED void nonIdentifiableLayersChanged(QStringList nonIdentifiableLayers)
Emitted when the list of layer which are excluded from map identification changes.
void layersWillBeRemoved(const QStringList &layerIds)
Emitted when one or more layers are about to be removed from the registry.
void setSelectionColor(const QColor &color)
Sets the color used to highlight selected features.
void snappingConfigChanged(const QgsSnappingConfig &config)
Emitted whenever the configuration for snapping has changed.
QgsPathResolver pathResolver() const
Returns path resolver object with considering whether the project uses absolute or relative paths and...
void setBadLayerHandler(QgsProjectBadLayerHandler *handler)
Change handler for missing layers.
void setEvaluateDefaultValues(bool evaluateDefaultValues)
Defines if default values should be evaluated on provider side when requested and not when committed.
void crsChanged()
Emitted when the CRS of the project has changed.
QString translate(const QString &context, const QString &sourceText, const char *disambiguation=nullptr, int n=-1) const override
Translates the project with QTranslator and qm file.
QgsSnappingConfig snappingConfig
void setFileName(const QString &name)
Sets the file name associated with the project.
QgsUnitTypes::AreaUnit areaUnits() const
Convenience function to query default area measurement units for project.
void avoidIntersectionsLayersChanged()
Emitted whenever avoidIntersectionsLayers has changed.
void setDataDefinedServerProperties(const QgsPropertyCollection &properties)
Sets the data defined properties used for overrides in user defined server parameters to properties.
void registerTranslatableObjects(QgsTranslationContext *translationContext)
Registers the objects that require translation into the translationContext.
QgsAnnotationLayer * mainAnnotationLayer()
Returns the main annotation layer associated with the project.
const QgsBookmarkManager * bookmarkManager() const
Returns the project's bookmark manager, which manages bookmarks within the project.
void readMapLayer(QgsMapLayer *mapLayer, const QDomElement &layerNode)
Emitted after the basic initialization of a layer from the project file is done.
void setAutoTransaction(bool autoTransaction)
Transactional editing means that on supported datasources (postgres databases) the edit state of all ...
void setTrustLayerMetadata(bool trust)
Sets the trust option allowing to indicate if the extent has to be read from the XML document when da...
void cleared()
Emitted when the project is cleared (and additionally when an open project is cleared just before a n...
void setLabelingEngineSettings(const QgsLabelingEngineSettings &settings)
Sets project's global labeling engine settings.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
void metadataChanged()
Emitted when the project's metadata is changed.
QVector< T > layers() const
Returns a list of registered map layers with a specified layer type.
QString absolutePath() const
Returns full absolute path to the project folder if the project is stored in a file system - derived ...
void removeMapLayers(const QStringList &layerIds)
Remove a set of layers from the registry by layer ID.
Q_DECL_DEPRECATED void setRequiredLayers(const QSet< QgsMapLayer * > &layers)
Configures a set of map layers that are required in the project and therefore they should not get rem...
QList< QgsVectorLayer * > avoidIntersectionsLayers
QString readEntry(const QString &scope, const QString &key, const QString &def=QString(), bool *ok=nullptr) const
Reads a string from the specified scope and key.
AvoidIntersectionsMode
Flags which control how intersections of pre-existing feature are handled when digitizing new feature...
@ AvoidIntersectionsLayers
Overlap with features from a specified list of layers when digitizing new features not allowed.
@ AllowIntersections
Overlap with any feature allowed when digitizing new features.
QgsExpressionContextScope * createExpressionContextScope() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QString baseName() const
Returns the base name of the project file without the path and without extension - derived from fileN...
void ellipsoidChanged(const QString &ellipsoid)
Emitted when the project ellipsoid is changed.
QgsMapThemeCollection * mapThemeCollection
void generateTsFile(const QString &locale)
Triggers the collection strings of .qgs to be included in ts file and calls writeTsFile()
QStringList entryList(const QString &scope, const QString &key) const
Returns a list of child keys with values which exist within the the specified scope and key.
QgsAnnotationManager * annotationManager()
Returns pointer to the project's annotation manager.
QgsProjectMetadata metadata
void projectColorsChanged()
Emitted whenever the project's color scheme has been changed.
QgsUnitTypes::DistanceUnit distanceUnits() const
Convenience function to query default distance measurement units for project.
QString saveUser() const
Returns the user name that did the last save.
void setProjectColors(const QgsNamedColorList &colors)
Sets the colors for the project's color scheme (see QgsProjectColorScheme).
QgsCoordinateTransformContext transformContext
void labelingEngineSettingsChanged()
Emitted when global configuration of the labeling engine changes.
void customVariablesChanged()
Emitted whenever the expression variables stored in the project have been changed.
QgsLayerTree * layerTreeRoot() const
Returns pointer to the root (invisible) node of the project's layer tree.
bool readBoolEntry(const QString &scope, const QString &key, bool def=false, bool *ok=nullptr) const
Reads a boolean from the specified scope and key.
QgsMapLayerStore * layerStore()
Returns a pointer to the project's internal layer store.
void readProject(const QDomDocument &)
Emitted when a project is being read.
QString originalPath() const
Returns the original path associated with the project.
void setOriginalPath(const QString &path)
Sets the original path associated with the project.
void dumpProperties() const
Dump out current project properties to stderr.
static void setInstance(QgsProject *project)
Set the current project singleton instance to project.
int validCount() const
Returns the number of registered valid layers.
const QgsLayoutManager * layoutManager() const
Returns the project's layout manager, which manages print layouts, atlases and reports within the pro...
QList< QgsMapLayer * > mapLayersByName(const QString &layerName) const
Retrieve a list of matching registered layers by layer name.
bool autoTransaction() const
Transactional editing means that on supported datasources (postgres databases) the edit state of all ...
bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified style entity visitor, causing it to visit all style entities associated with th...
void setMetadata(const QgsProjectMetadata &metadata)
Sets the project's metadata store.
void missingDatumTransforms(const QStringList &missingTransforms)
Emitted when datum transforms stored in the project are not available locally.
QgsTransactionGroup * transactionGroup(const QString &providerKey, const QString &connString)
Returns the matching transaction group from a provider key and connection string.
QgsCoordinateReferenceSystem crs
void readProjectWithContext(const QDomDocument &, QgsReadWriteContext &context)
Emitted when a project is being read.
QgsMapLayer * addMapLayer(QgsMapLayer *mapLayer, bool addToLegend=true, bool takeOwnership=true)
Add a layer to the map of loaded layers.
QStringList nonIdentifiableLayers
void transactionGroupsChanged()
Emitted whenever a new transaction group has been created or a transaction group has been removed.
const QgsAuxiliaryStorage * auxiliaryStorage() const
Returns the current const auxiliary storage.
void reloadAllLayers()
Reload all registered layer's provider data caches, synchronising the layer with any changes in the d...
int count() const
Returns the number of registered layers.
void loadingLayerMessageReceived(const QString &layerName, const QList< QgsReadWriteContext::ReadWriteMessage > &messages)
Emitted when loading layers has produced some messages.
void setTitle(const QString &title)
Sets the project's title.
QMap< QPair< QString, QString >, QgsTransactionGroup * > transactionGroups()
Map of transaction groups.
void writeProject(QDomDocument &)
Emitted when the project is being written.
QDateTime lastModified() const
Returns last modified time of the project file as returned by the file system (or other project stora...
bool readLayer(const QDomNode &layerNode)
Reads the layer described in the associated DOM node.
double readDoubleEntry(const QString &scope, const QString &key, double def=0, bool *ok=nullptr) const
Reads a double from the specified scope and key.
bool writeEntry(const QString &scope, const QString &key, bool value)
Write a boolean value to the project file.
QgsLayerTreeGroup * createEmbeddedGroup(const QString &groupName, const QString &projectFilePath, const QStringList &invisibleLayers, QgsProject::ReadFlags flags=QgsProject::ReadFlags())
Create layer group instance defined in an arbitrary project file.
QString absoluteFilePath() const
Returns full absolute path to the project file if the project is stored in a file system - derived fr...
QDateTime lastSaveDateTime() const
Returns the date and time when the project was last saved.
void projectSaved()
Emitted when the project file has been written and closed.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
void setEllipsoid(const QString &ellipsoid)
Sets the project's ellipsoid from a proj string representation, e.g., "WGS84".
bool read(const QString &filename, QgsProject::ReadFlags flags=QgsProject::ReadFlags())
Reads given project file from the given file.
void setTransformContext(const QgsCoordinateTransformContext &context)
Sets the project's coordinate transform context, which stores various information regarding which dat...
void layerLoaded(int i, int n)
Emitted when a layer from a projects was read.
QStringList subkeyList(const QString &scope, const QString &key) const
Returns a list of child keys which contain other keys that exist within the the specified scope and k...
QStringList readListEntry(const QString &scope, const QString &key, const QStringList &def=QStringList(), bool *ok=nullptr) const
Reads a string list from the specified scope and key.
void selectionColorChanged()
Emitted whenever the project's selection color has been changed.
bool createEmbeddedLayer(const QString &layerId, const QString &projectFilePath, QList< QDomNode > &brokenNodes, bool saveFlag=true, QgsProject::ReadFlags flags=QgsProject::ReadFlags())
Creates a maplayer instance defined in an arbitrary project file.
const QgsLabelingEngineSettings & labelingEngineSettings() const
Returns project's global labeling engine settings.
void removeAllMapLayers()
Removes all registered layers.
Q_DECL_DEPRECATED QVector< double > mapScales() const
Returns the list of custom project map scales.
void setDirty(bool b=true)
Flag the project as dirty (modified).
void backgroundColorChanged()
Emitted whenever the project's canvas background color has been changed.
@ FlagTrustLayerMetadata
Trust layer metadata. Improves project read time. Do not use it if layers' extent is not fixed during...
@ FlagDontStoreOriginalStyles
Skip the initial XML style storage for layers. Useful for minimising project load times in non-intera...
@ FlagDontLoadLayouts
Don't load print layouts. Improves project read time if layouts are not required, and allows projects...
@ FlagDontResolveLayers
Don't resolve layer paths (i.e. don't load any layer content). Dramatically improves project read tim...
const QgsProjectViewSettings * viewSettings() const
Returns the project's view settings, which contains settings and properties relating to how a QgsProj...
QString readPath(const QString &filename) const
Transforms a filename read from the project file to an absolute path.
void registerTranslatableContainers(QgsTranslationContext *translationContext, QgsAttributeEditorContainer *parent, const QString &layerId)
Registers the containers that require translation into the translationContext.
void oldProjectVersionWarning(const QString &)
Emitted when an old project file is read.
Q_DECL_DEPRECATED QSet< QgsMapLayer * > requiredLayers() const
Returns a set of map layers that are required in the project and therefore they should not get remove...
void transformContextChanged()
Emitted when the project transformContext() is changed.
void setTopologicalEditing(bool enabled)
Convenience function to set topological editing.
void legendLayersAdded(const QList< QgsMapLayer * > &layers)
Emitted, when a layer was added to the registry and the legend.
QVariantMap customVariables() const
A map of custom project variables.
void setAvoidIntersectionsLayers(const QList< QgsVectorLayer * > &layers)
Sets the list of layers with which intersections should be avoided.
void homePathChanged()
Emitted when the home path of the project changes.
void dirtySet()
Emitted when setDirty(true) is called.
void setCustomVariables(const QVariantMap &customVariables)
A map of custom project variables.
QgsCoordinateReferenceSystem defaultCrsForNewLayers() const
Returns the default CRS for new layers based on the settings and the current project CRS.
const QgsProjectDisplaySettings * displaySettings() const
Returns the project's display settings, which settings and properties relating to how a QgsProject sh...
QString saveUserFullName() const
Returns the full user name that did the last save.
void layersAdded(const QList< QgsMapLayer * > &layers)
Emitted when one or more layers were added to the registry.
QMap< QString, QgsMapLayer * > mapLayers(const bool validOnly=false) const
Returns a map of all registered layers by layer ID.
bool isDirty() const
Returns true if the project has been modified since the last write()
QgsMapLayer * takeMapLayer(QgsMapLayer *layer)
Takes a layer from the registry.
void isDirtyChanged(bool dirty)
Emitted when the project dirty status changes.
Q_DECL_DEPRECATED bool useProjectScales() const
Returns true if project mapScales() are enabled.
Q_DECL_DEPRECATED void setMapScales(const QVector< double > &scales)
Sets the list of custom project map scales.
void setPresetHomePath(const QString &path)
Sets the project's home path.
QList< QgsMapLayer * > mapLayersByShortName(const QString &shortName) const
Retrieves a list of matching registered layers by layer shortName.
QgsProjectStorage * projectStorage() const
Returns pointer to project storage implementation that handles read/write of the project file.
QString layerIsEmbedded(const QString &id) const
Returns the source project file path if the layer with matching id is embedded from other project fil...
const QgsProjectTimeSettings * timeSettings() const
Returns the project's time settings, which contains the project's temporal range and other time based...
void topologicalEditingChanged()
Emitted when the topological editing flag has changed.
bool removeEntry(const QString &scope, const QString &key)
Remove the given key from the specified scope.
QgsProjectVersion lastSaveVersion() const
Returns the QGIS version which the project was last saved using.
void avoidIntersectionsModeChanged()
Emitted whenever the avoid intersections mode has changed.
void loadingLayer(const QString &layerName)
Emitted when a layer is loaded.
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
Definition for a property.
@ String
Any string value.
The class is used as a container of context for various read/write operations on other objects.
void setTransformContext(const QgsCoordinateTransformContext &transformContext)
Sets data coordinate transform context to transformContext.
QList< QgsReadWriteContext::ReadWriteMessage > takeMessages()
Returns the stored messages and remove them.
void setProjectTranslator(QgsProjectTranslator *projectTranslator)
Sets the project translator.
void setPathResolver(const QgsPathResolver &resolver)
Sets up path resolver for conversion between relative and absolute paths.
This class manages a set of relations between layers.
void clear()
Remove any relation managed by this class.
QMap< QString, QgsRelation > relations() const
Gets access to the relations managed by this class.
void clear(const QString &group="startup")
clear Clear all profile data.
Expression function for use within a QgsExpressionContextScope.
Scoped object for logging of the runtime for a single operation or group of operations.
This is a container for configuration of the snapping of the project.
bool addLayers(const QList< QgsMapLayer * > &layers)
Adds the specified layers as individual layers to the configuration with standard configuration.
void readProject(const QDomDocument &doc)
Reads the configuration from the specified QGIS project document.
void reset()
reset to default values
void writeProject(QDomDocument &doc)
Writes the configuration to the specified QGIS project document.
void clearIndividualLayerSettings()
Removes all individual layer snapping settings.
bool removeLayers(const QList< QgsMapLayer * > &layers)
Removes the specified layers from the individual layer configuration.
An interface for classes which can visit style entity (e.g.
virtual bool visitExit(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor stops visiting a node.
virtual bool visitEnter(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor starts visiting a node.
static QColor decodeColor(const QString &str)
static QString encodeColor(const QColor &color)
bool isEmpty() const
Returns true if there are no layers in this transaction group.
bool addLayer(QgsVectorLayer *layer)
Add a layer to this transaction group.
static bool supportsTransaction(const QgsVectorLayer *layer)
Checks if the provider of a given layer supports transactions.
Used for the collecting of strings from projects for translation and creation of ts files.
void registerTranslation(const QString &context, const QString &source)
Registers the source to be translated.
void writeTsFile(const QString &locale)
Writes the Ts-file.
void setFileName(const QString &fileName)
Sets the fileName of the TS file.
void setProject(QgsProject *project)
Sets the project being translated.
DistanceUnit
Units of distance.
static Q_INVOKABLE QString encodeUnit(QgsUnitTypes::DistanceUnit unit)
Encodes a distance unit to a string.
static Q_INVOKABLE QgsUnitTypes::DistanceUnit decodeDistanceUnit(const QString &string, bool *ok=nullptr)
Decodes a distance unit from a string.
static Q_INVOKABLE QString toString(QgsUnitTypes::DistanceUnit unit)
Returns a translated string representing a distance unit.
static Q_INVOKABLE QgsUnitTypes::AreaUnit decodeAreaUnit(const QString &string, bool *ok=nullptr)
Decodes an areal unit from a string.
@ AreaSquareMeters
Square meters.
Represents a vector layer which manages a vector based data sets.
bool loadAuxiliaryLayer(const QgsAuxiliaryStorage &storage, const QString &key=QString())
Loads the auxiliary layer for this vector layer.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
QgsAuxiliaryLayer * auxiliaryLayer()
Returns the current auxiliary layer.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
void setReadExtentFromXml(bool readExtentFromXml)
Flag allowing to indicate if the extent has to be read from the XML document when data source has no ...
QgsEditFormConfig editFormConfig
QList< QPair< QColor, QString > > QgsNamedColorList
List of colors paired with a friendly display name identifying the color.
QgsMapLayerType
Types of layers that can be added to a map.
@ PointCloudLayer
Added in 3.18.
@ VectorTileLayer
Added in 3.14.
@ AnnotationLayer
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
CORE_EXPORT bool isZipFile(const QString &filename)
Returns true if the file name is a zipped file ( i.e with a '.qgz' extension, false otherwise.
CONSTLATIN1STRING geoNone()
Constant that holds the string representation for "No ellips/No CRS".
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH
CONSTLATIN1STRING geoEpsgCrsAuthId()
Geographic coord sys from EPSG authority.
#define QgsDebugMsgLevel(str, level)
QPointer< QgsMapLayer > QgsWeakMapLayerPointer
Weak pointer for QgsMapLayer.
void _getProperties(const QDomDocument &doc, QgsProjectPropertyKey &project_properties)
Restores any optional properties found in "doc" to "properties".
QgsPropertyCollection getDataDefinedServerProperties(const QDomDocument &doc, const QgsPropertiesDefinition &dataDefinedServerPropertyDefinitions)
Returns the data defined server properties collection found in "doc" to "dataDefinedServerProperties"...
QgsProjectProperty * findKey_(const QString &scope, const QString &key, QgsProjectPropertyKey &rootProperty)
Returns the property that matches the given key sequence, if any.
void removeKey_(const QString &scope, const QString &key, QgsProjectPropertyKey &rootProperty)
Removes a given key.
QgsProjectProperty * addKey_(const QString &scope, const QString &key, QgsProjectPropertyKey *rootProperty, const QVariant &value, bool &propertiesModified)
Adds the given key and value.
QgsProjectVersion getVersion(const QDomDocument &doc)
Returns the version string found in the given DOM document.
QStringList makeKeyTokens_(const QString &scope, const QString &key)
Takes the given scope and key and convert them to a string list of key tokens that will be used to na...
void dump_(const QgsProjectPropertyKey &topQgsPropertyKey)
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
const QgsCoordinateReferenceSystem & crs
Setting options for loading annotation layers.
Single variable definition for use within a QgsExpressionContextScope.
Contains information relating to a node (i.e.