613 bool matches = exp.
evaluate( context ).toBool();
617 newSelection << feat.
id();
621 newSelection << feat.
id();
642 newSelection = mSelectedFeatureIds + ids;
646 newSelection = mSelectedFeatureIds - ids;
650 newSelection = mSelectedFeatureIds.intersect( ids );
654 QgsFeatureIds deselectedFeatures = mSelectedFeatureIds - newSelection;
655 mSelectedFeatureIds = newSelection;
656 mPreviousSelectedFeatureIds.clear();
666 if ( !intersectingIds.isEmpty() )
668 QgsDebugMsgLevel( QStringLiteral(
"Trying to select and deselect the same item at the same time. Unsure what to do. Selecting dubious items." ), 3 );
671 mSelectedFeatureIds -= deselectIds;
672 mSelectedFeatureIds += selectIds;
673 mPreviousSelectedFeatureIds.clear();
683 ids.subtract( mSelectedFeatureIds );
702 .setFilterRect( rect )
704 .setNoAttributes() );
712 if ( mSelectedFeatureIds.contains( fet.
id() ) )
714 deselectIds << fet.
id();
718 selectIds << fet.
id();
729 if ( mSelectedFeatureIds.isEmpty() )
734 mPreviousSelectedFeatureIds = previous;
741 if ( mPreviousSelectedFeatureIds.isEmpty() || !mSelectedFeatureIds.empty() )
752 return mDataProvider;
760 return mDataProvider;
768 return mSelectionProperties;
775 return mTemporalProperties;
782 return mElevationProperties;
798 if (
isValid() && mDataProvider && mDataProvider->
encoding() != encoding )
809 delete mDiagramRenderer;
810 mDiagramRenderer = r;
834 if ( !
isValid() || !
isSpatial() || mSelectedFeatureIds.isEmpty() || !mDataProvider )
846 .setFilterFids( mSelectedFeatureIds )
847 .setNoAttributes() );
860 .setNoAttributes() );
864 if ( mSelectedFeatureIds.contains( fet.
id() ) )
875 if ( retval.
width() == 0.0 || retval.
height() == 0.0 )
884 retval.
set( -1.0, -1.0, 1.0, 1.0 );
896 return mLabelsEnabled &&
static_cast< bool >( mLabeling );
903 mLabelsEnabled = enabled;
911 if ( !mDiagramRenderer || !mDiagramLayerSettings )
914 QList<QgsDiagramSettings> settingList = mDiagramRenderer->
diagramSettings();
915 if ( !settingList.isEmpty() )
917 return settingList.at( 0 ).enabled;
926 if ( !mSymbolFeatureCounted )
929 return mSymbolFeatureCountMap.value( legendKey, -1 );
936 if ( !mSymbolFeatureCounted )
939 return mSymbolFeatureIdMap.value( legendKey,
QgsFeatureIds() );
945 if ( ( mSymbolFeatureCounted || mFeatureCounter ) && !( storeSymbolFids && mSymbolFeatureIdMap.isEmpty() ) )
946 return mFeatureCounter;
948 mSymbolFeatureCountMap.clear();
949 mSymbolFeatureIdMap.clear();
954 return mFeatureCounter;
956 if ( !mDataProvider )
959 return mFeatureCounter;
964 return mFeatureCounter;
967 if ( !mFeatureCounter || ( storeSymbolFids && mSymbolFeatureIdMap.isEmpty() ) )
970 connect( mFeatureCounter, &
QgsTask::taskCompleted,
this, &QgsVectorLayer::onFeatureCounterCompleted, Qt::UniqueConnection );
971 connect( mFeatureCounter, &
QgsTask::taskTerminated,
this, &QgsVectorLayer::onFeatureCounterTerminated, Qt::UniqueConnection );
975 return mFeatureCounter;
983 if ( force || !mReadExtentFromXml || ( mReadExtentFromXml && mXmlExtent2D.
isNull() && mXmlExtent3D.
isNull() ) )
985 mValidExtent2D =
false;
986 mValidExtent3D =
false;
995 mValidExtent2D =
true;
1003 mValidExtent3D =
true;
1010 if ( !mDefaultValueOnUpdateFields.isEmpty() )
1015 int size = mFields.
size();
1016 for (
int idx : std::as_const( mDefaultValueOnUpdateFields ) )
1018 if ( idx < 0 || idx >= size )
1041 updateExtent( mDataProvider->
extent() );
1042 mValidExtent2D =
true;
1043 mLazyExtent2D =
false;
1047 if ( !mValidExtent2D && mLazyExtent2D && mReadExtentFromXml && !mXmlExtent2D.
isNull() )
1049 updateExtent( mXmlExtent2D );
1050 mValidExtent2D =
true;
1051 mLazyExtent2D =
false;
1054 if ( !mValidExtent2D && mLazyExtent2D && mDataProvider && mDataProvider->
isValid() )
1057 updateExtent( mDataProvider->
extent() );
1058 mValidExtent2D =
true;
1059 mLazyExtent2D =
false;
1062 QgsDebugMsgLevel( QStringLiteral(
"2D Extent of layer: %1" ).arg( mExtent2D.toString() ), 3 );
1066 if ( mValidExtent2D )
1069 if ( !
isValid() || !mDataProvider )
1071 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider" ), 3 );
1075 if ( !mEditBuffer ||
1089 if ( mEditBuffer && !mDataProvider->
transaction() )
1092 for ( QgsFeatureMap::const_iterator it = addedFeatures.constBegin(); it != addedFeatures.constEnd(); ++it )
1094 if ( it->hasGeometry() )
1105 .setNoAttributes() );
1118 if ( rect.xMinimum() > rect.xMaximum() && rect.yMinimum() > rect.yMaximum() )
1124 updateExtent( rect );
1125 mValidExtent2D =
true;
1154 updateExtent( mDataProvider->
extent3D() );
1155 mValidExtent3D =
true;
1156 mLazyExtent3D =
false;
1160 if ( !mValidExtent3D && mLazyExtent3D && mReadExtentFromXml && !mXmlExtent3D.
isNull() )
1162 updateExtent( mXmlExtent3D );
1163 mValidExtent3D =
true;
1164 mLazyExtent3D =
false;
1167 if ( !mValidExtent3D && mLazyExtent3D && mDataProvider && mDataProvider->
isValid() )
1170 updateExtent( mDataProvider->
extent3D() );
1171 mValidExtent3D =
true;
1172 mLazyExtent3D =
false;
1175 QgsDebugMsgLevel( QStringLiteral(
"3D Extent of layer: %1" ).arg( mExtent3D.toString() ), 3 );
1179 if ( mValidExtent3D )
1182 if ( !
isValid() || !mDataProvider )
1184 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider" ), 3 );
1188 if ( !mEditBuffer ||
1199 extent.combineWith( ext );
1202 if ( mEditBuffer && !mDataProvider->
transaction() )
1205 for ( QgsFeatureMap::const_iterator it = addedFeatures.constBegin(); it != addedFeatures.constEnd(); ++it )
1207 if ( it->hasGeometry() )
1209 const QgsBox3D bbox = it->geometry().boundingBox3D();
1210 extent.combineWith( bbox );
1218 .setNoAttributes() );
1226 extent.combineWith( bb );
1238 mValidExtent3D =
true;
1264 if ( !
isValid() || !mDataProvider )
1266 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider" ), 3 );
1267 return customProperty( QStringLiteral(
"storedSubsetString" ) ).toString();
1276 if ( !
isValid() || !mDataProvider )
1278 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider or while editing" ), 3 );
1282 else if ( mEditBuffer )
1314 double maximumSimplificationScale = mSimplifyMethod.
maximumScale();
1317 return !( maximumSimplificationScale > 1 && renderContext.
rendererScale() <= maximumSimplificationScale );
1326 return mConditionalStyles;
1334 if ( !
isValid() || !mDataProvider )
1346 if ( feature.isValid() )
1347 return feature.geometry();
1356 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1360 if ( mGeometryOptions->isActive() )
1363 mGeometryOptions->apply( geom );
1367 bool success = mEditBuffer->
addFeature( feature );
1374 success = mJoinBuffer->
addFeature( feature );
1384 if ( !mEditBuffer || !mDataProvider )
1390 if ( currentFeature.
isValid() )
1392 bool hasChanged =
false;
1393 bool hasError =
false;
1405 QgsDebugMsgLevel( QStringLiteral(
"geometry of feature %1 could not be changed." ).arg( updatedFeature.
id() ), 3 );
1412 for (
int attr = 0; attr < fa.count(); ++attr )
1422 QgsDebugMsgLevel( QStringLiteral(
"attribute %1 of feature %2 could not be changed." ).arg( attr ).arg( updatedFeature.
id() ), 3 );
1427 if ( hasChanged && !mDefaultValueOnUpdateFields.isEmpty() && !skipDefaultValues )
1428 updateDefaultValues( updatedFeature.
id(), updatedFeature );
1434 QgsDebugMsgLevel( QStringLiteral(
"feature %1 could not be retrieved" ).arg( updatedFeature.
id() ), 3 );
1444 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1448 bool result = utils.
insertVertex( x, y, atFeatureId, beforeVertex );
1459 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1463 bool result = utils.
insertVertex( point, atFeatureId, beforeVertex );
1474 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1478 bool result = utils.
moveVertex( x, y, atFeatureId, atVertex );
1489 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1493 bool result = utils.
moveVertex( p, atFeatureId, atVertex );
1504 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1531 int count = mSelectedFeatureIds.size();
1544 *deletedCount = deleted;
1547 return deleted == count;
1550static const QgsPointSequence vectorPointXY2pointSequence(
const QVector<QgsPointXY> &points )
1553 pts.reserve( points.size() );
1554 QVector<QgsPointXY>::const_iterator it = points.constBegin();
1555 while ( it != points.constEnd() )
1566 return addRing( vectorPointXY2pointSequence( ring ), featureId );
1573 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1580 if ( !mSelectedFeatureIds.isEmpty() )
1582 result = utils.
addRing( ring, mSelectedFeatureIds, featureId );
1598 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1619 if ( !mSelectedFeatureIds.isEmpty() )
1621 result = utils.
addRing(
static_cast< QgsCurve *
>( ring->
clone() ), mSelectedFeatureIds, featureId );
1639 pts.reserve( points.size() );
1640 for ( QList<QgsPointXY>::const_iterator it = points.constBegin(); it != points.constEnd() ; ++it )
1647#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
1652 return addPart( vectorPointXY2pointSequence( points ) );
1660 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1665 if ( mSelectedFeatureIds.empty() )
1670 else if ( mSelectedFeatureIds.size() > 1 )
1688 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1693 if ( mSelectedFeatureIds.empty() )
1698 else if ( mSelectedFeatureIds.size() > 1 )
1717 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1732 return splitParts( vectorPointXY2pointSequence( splitLine ), topologicalEditing );
1739 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1743 return utils.
splitParts( splitLine, topologicalEditing );
1750 return splitFeatures( vectorPointXY2pointSequence( splitLine ), topologicalEditing );
1759 bool preserveCircular =
false;
1760 return splitFeatures( &splitLineString, topologyTestPoints, preserveCircular, topologicalEditing );
1767 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1771 return utils.
splitFeatures( curve, topologyTestPoints, preserveCircular, topologicalEditing );
1778 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1796 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1807 if ( !
mValid || !mEditBuffer || !mDataProvider )
1832 if ( !
isValid() || !mDataProvider )
1866 if ( mDataProvider )
1882 if ( !mRenderer->
accept( visitor ) )
1886 if ( !mLabeling->
accept( visitor ) )
1899 QDomNode pkeyNode = layer_node.namedItem( QStringLiteral(
"provider" ) );
1901 if ( pkeyNode.isNull() )
1907 QDomElement pkeyElt = pkeyNode.toElement();
1917 else if (
mDataSource.contains( QLatin1String(
"dbname=" ) ) )
1926 const QDomElement elem = layer_node.toElement();
1940 if ( elem.hasAttribute( QStringLiteral(
"wkbType" ) ) )
1941 mWkbType =
qgsEnumKeyToValue( elem.attribute( QStringLiteral(
"wkbType" ) ), mWkbType );
1944 QDomElement pkeyElem = pkeyNode.toElement();
1945 if ( !pkeyElem.isNull() )
1947 QString encodingString = pkeyElem.attribute( QStringLiteral(
"encoding" ) );
1948 if ( mDataProvider && !encodingString.isEmpty() )
1955 mJoinBuffer->
readXml( layer_node );
1960 mSetLegendFromStyle =
false;
1970 QDomNode depsNode = layer_node.namedItem( QStringLiteral(
"dataDependencies" ) );
1971 QDomNodeList depsNodes = depsNode.childNodes();
1972 QSet<QgsMapLayerDependency> sources;
1973 for (
int i = 0; i < depsNodes.count(); i++ )
1975 QString
source = depsNodes.at( i ).toElement().attribute( QStringLiteral(
"id" ) );
1980 if ( !mSetLegendFromStyle )
1986 mReadExtentFromXml =
true;
1988 if ( mReadExtentFromXml )
1990 const QDomNode extentNode = layer_node.namedItem( QStringLiteral(
"extent" ) );
1991 if ( !extentNode.isNull() )
1995 const QDomNode extent3DNode = layer_node.namedItem( QStringLiteral(
"extent3D" ) );
1996 if ( !extent3DNode.isNull() )
2003 const QDomNode asNode = layer_node.namedItem( QStringLiteral(
"auxiliaryLayer" ) );
2004 const QDomElement asElem = asNode.toElement();
2005 if ( !asElem.isNull() )
2007 mAuxiliaryLayerKey = asElem.attribute( QStringLiteral(
"key" ) );
2011 mServerProperties->readXml( layer_node );
2018void QgsVectorLayer::setDataSourcePrivate(
const QString &dataSource,
const QString &baseName,
const QString &provider,
2027 setDataProvider( provider, options,
flags );
2037 bool loadDefaultStyleFlag =
false;
2040 loadDefaultStyleFlag =
true;
2046 std::unique_ptr< QgsScopedRuntimeProfile > profile;
2048 profile = std::make_unique< QgsScopedRuntimeProfile >( tr(
"Load layer style" ), QStringLiteral(
"projectload" ) );
2050 bool defaultLoadedFlag =
false;
2058 mSetLegendFromStyle =
false;
2063 if ( !defaultLoadedFlag && loadDefaultStyleFlag )
2071 std::unique_ptr< QgsFeatureRenderer > defaultRenderer( mDataProvider->
createRenderer() );
2072 if ( defaultRenderer )
2074 defaultLoadedFlag =
true;
2080 if ( !defaultLoadedFlag )
2086 if ( !mSetLegendFromStyle )
2091 std::unique_ptr< QgsAbstractVectorLayerLabeling > defaultLabeling( mDataProvider->
createLabeling() );
2092 if ( defaultLabeling )
2099 styleChangedSignalBlocker.release();
2116 QStringList ids, names, descriptions;
2117 QString errorMessage;
2119 const int relatedStylesCount {
listStylesInDatabase( ids, names, descriptions, errorMessage ) };
2120 Q_ASSERT( ids.count() == names.count() );
2121 const QString currentStyleName { mStyleManager->currentStyle() };
2122 for (
int i = 0; i < relatedStylesCount; ++i )
2124 if ( names.at( i ) == currentStyleName )
2128 errorMessage.clear();
2130 if ( ! styleXml.isEmpty() && errorMessage.isEmpty() )
2136 QgsDebugMsgLevel( QStringLiteral(
"Error retrieving style %1 from DB: %2" ).arg( ids.at( i ), errorMessage ), 2 );
2146 std::unique_ptr< QgsFeatureRenderer > defaultRenderer( mDataProvider->
createRenderer() );
2147 if ( defaultRenderer )
2163 delete mDataProvider;
2170 if ( provider.compare( QLatin1String(
"postgres" ) ) == 0 )
2172 const QString checkUnicityKey { QStringLiteral(
"checkPrimaryKeyUnicity" ) };
2174 if ( ! uri.hasParam( checkUnicityKey ) )
2176 uri.setParam( checkUnicityKey, mReadExtentFromXml ?
"0" :
"1" );
2181 std::unique_ptr< QgsScopedRuntimeProfile > profile;
2183 profile = std::make_unique< QgsScopedRuntimeProfile >( tr(
"Create %1 provider" ).arg( provider ), QStringLiteral(
"projectload" ) );
2186 mDataProvider = qobject_cast< QgsVectorDataProvider * >(
mPreloadedProvider.release() );
2190 if ( !mDataProvider )
2197 mDataProvider->setParent(
this );
2200 QgsDebugMsgLevel( QStringLiteral(
"Instantiated the data provider plugin" ), 2 );
2210 profile->switchTask( tr(
"Read layer metadata" ) );
2217 newMetadata.
combine( &mMetadata );
2220 QgsDebugMsgLevel( QStringLiteral(
"Set Data provider QgsLayerMetadata identifier[%1]" ).arg(
metadata().identifier() ), 4 );
2227 mWkbType = mDataProvider->
wkbType();
2232 for (
const QgsField &field : providerFields )
2235 if ( !field.editorWidgetSetup().isNull() && mFieldWidgetSetups.value( field.name() ).isNull() )
2237 mFieldWidgetSetups[ field.name() ] = field.editorWidgetSetup();
2239 if ( !field.alias().isEmpty() && mAttributeAliasMap.value( field.name() ).isEmpty() )
2241 mAttributeAliasMap[ field.name() ] = field.alias();
2243 if ( !mAttributeSplitPolicy.contains( field.name() ) )
2245 mAttributeSplitPolicy[ field.name() ] = field.splitPolicy();
2247 if ( !mAttributeDuplicatePolicy.contains( field.name() ) )
2249 mAttributeDuplicatePolicy[ field.name() ] = field.duplicatePolicy();
2254 profile->switchTask( tr(
"Read layer fields" ) );
2265 const thread_local QRegularExpression reg( R
"lit("[^"]+"\."([^"] + )"( \([^)]+\))?)lit" );
2266 const QRegularExpressionMatch match = reg.match(
name() );
2267 if ( match.hasMatch() )
2269 QStringList stuff = match.capturedTexts();
2270 QString lName = stuff[1];
2274 QMap<QString, QgsMapLayer *>::const_iterator it;
2275 for ( it = layers.constBegin(); it != layers.constEnd() && ( *it )->name() != lName; ++it )
2278 if ( it != layers.constEnd() && stuff.size() > 2 )
2280 lName +=
'.' + stuff[2].mid( 2, stuff[2].length() - 3 );
2283 if ( !lName.isEmpty() )
2293 else if ( provider == QLatin1String(
"ogr" ) )
2297 if (
mDataSource.right( 10 ) == QLatin1String(
"|layerid=0" ) )
2300 else if ( provider == QLatin1String(
"memory" ) )
2305 else if ( provider == QLatin1String(
"hana" ) )
2322 QDomDocument &document,
2329 QDomElement mapLayerNode = layer_node.toElement();
2331 if ( mapLayerNode.isNull() || (
"maplayer" != mapLayerNode.nodeName() ) )
2344 if ( mDataProvider )
2346 QDomElement provider = document.createElement( QStringLiteral(
"provider" ) );
2347 provider.setAttribute( QStringLiteral(
"encoding" ), mDataProvider->
encoding() );
2348 QDomText providerText = document.createTextNode(
providerType() );
2349 provider.appendChild( providerText );
2350 layer_node.appendChild( provider );
2354 mJoinBuffer->
writeXml( layer_node, document );
2357 QDomElement dependenciesElement = document.createElement( QStringLiteral(
"layerDependencies" ) );
2363 QDomElement depElem = document.createElement( QStringLiteral(
"layer" ) );
2364 depElem.setAttribute( QStringLiteral(
"id" ), dep.layerId() );
2365 dependenciesElement.appendChild( depElem );
2367 layer_node.appendChild( dependenciesElement );
2370 QDomElement dataDependenciesElement = document.createElement( QStringLiteral(
"dataDependencies" ) );
2375 QDomElement depElem = document.createElement( QStringLiteral(
"layer" ) );
2376 depElem.setAttribute( QStringLiteral(
"id" ), dep.layerId() );
2377 dataDependenciesElement.appendChild( depElem );
2379 layer_node.appendChild( dataDependenciesElement );
2382 mExpressionFieldBuffer->
writeXml( layer_node, document );
2387 QDomElement asElem = document.createElement( QStringLiteral(
"auxiliaryLayer" ) );
2388 if ( mAuxiliaryLayer )
2390 const QString pkField = mAuxiliaryLayer->joinInfo().targetFieldName();
2391 asElem.setAttribute( QStringLiteral(
"key" ), pkField );
2393 layer_node.appendChild( asElem );
2396 mServerProperties->writeXml( layer_node, document );
2400 return writeSymbology( layer_node, document, errorMsg, context );
2439 if ( categories.testFlag(
Fields ) )
2441 if ( !mExpressionFieldBuffer )
2443 mExpressionFieldBuffer->
readXml( layerNode );
2453 QDomNodeList referencedLayersNodeList = layerNode.toElement().elementsByTagName( QStringLiteral(
"referencedLayers" ) );
2454 if ( referencedLayersNodeList.size() > 0 )
2456 const QDomNodeList relationNodes { referencedLayersNodeList.at( 0 ).childNodes() };
2457 for (
int i = 0; i < relationNodes.length(); ++i )
2459 const QDomElement relationElement = relationNodes.at( i ).toElement();
2466 QDomNodeList referencingLayersNodeList = layerNode.toElement().elementsByTagName( QStringLiteral(
"referencingLayers" ) );
2467 if ( referencingLayersNodeList.size() > 0 )
2469 const QDomNodeList relationNodes { referencingLayersNodeList.at( 0 ).childNodes() };
2470 for (
int i = 0; i < relationNodes.length(); ++i )
2472 const QDomElement relationElement = relationNodes.at( i ).toElement();
2478 QDomElement layerElement = layerNode.toElement();
2482 readStyle( layerNode, errorMessage, context, categories );
2484 if ( categories.testFlag(
MapTips ) )
2486 QDomElement mapTipElem = layerNode.namedItem( QStringLiteral(
"mapTip" ) ).toElement();
2488 setMapTipsEnabled( mapTipElem.attribute( QStringLiteral(
"enabled" ), QStringLiteral(
"1" ) ).toInt() == 1 );
2492 mDisplayExpression = layerNode.namedItem( QStringLiteral(
"previewExpression" ) ).toElement().text();
2495 QString
displayField = layerNode.namedItem( QStringLiteral(
"displayfield" ) ).toElement().text();
2499 if ( mMapTipTemplate.isEmpty() && categories.testFlag(
MapTips ) )
2509 if ( categories.testFlag(
Actions ) )
2510 mActions->
readXml( layerNode );
2512 if ( categories.testFlag(
Fields ) )
2517 QDomNode aliasesNode = layerNode.namedItem( QStringLiteral(
"aliases" ) );
2518 if ( !aliasesNode.isNull() )
2520 QDomElement aliasElem;
2522 QDomNodeList aliasNodeList = aliasesNode.toElement().elementsByTagName( QStringLiteral(
"alias" ) );
2523 for (
int i = 0; i < aliasNodeList.size(); ++i )
2525 aliasElem = aliasNodeList.at( i ).toElement();
2528 if ( aliasElem.hasAttribute( QStringLiteral(
"field" ) ) )
2530 field = aliasElem.attribute( QStringLiteral(
"field" ) );
2534 int index = aliasElem.attribute( QStringLiteral(
"index" ) ).toInt();
2536 if ( index >= 0 && index <
fields().count() )
2542 if ( !aliasElem.attribute( QStringLiteral(
"name" ) ).isEmpty() )
2545 alias = context.
projectTranslator()->
translate( QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ), aliasElem.attribute( QStringLiteral(
"name" ) ) );
2546 QgsDebugMsgLevel(
"context" + QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ) +
" source " + aliasElem.attribute( QStringLiteral(
"name" ) ), 3 );
2551 alias = context.
projectTranslator()->
translate( QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ), field );
2552 QgsDebugMsgLevel(
"context" + QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ) +
" source " + field, 3 );
2554 if ( alias == aliasElem.attribute( QStringLiteral(
"field" ) ) )
2558 QgsDebugMsgLevel(
"field " + field +
" origalias " + aliasElem.attribute( QStringLiteral(
"name" ) ) +
" trans " + alias, 3 );
2559 mAttributeAliasMap.insert( field, alias );
2566 const QDomNode splitPoliciesNode = layerNode.namedItem( QStringLiteral(
"splitPolicies" ) );
2567 if ( !splitPoliciesNode.isNull() )
2569 const QDomNodeList splitPolicyNodeList = splitPoliciesNode.toElement().elementsByTagName( QStringLiteral(
"policy" ) );
2570 for (
int i = 0; i < splitPolicyNodeList.size(); ++i )
2572 const QDomElement splitPolicyElem = splitPolicyNodeList.at( i ).toElement();
2573 const QString field = splitPolicyElem.attribute( QStringLiteral(
"field" ) );
2575 mAttributeSplitPolicy.insert( field, policy );
2580 mAttributeDuplicatePolicy.clear();
2581 const QDomNode duplicatePoliciesNode = layerNode.namedItem( QStringLiteral(
"duplicatePolicies" ) );
2582 if ( !duplicatePoliciesNode.isNull() )
2584 const QDomNodeList duplicatePolicyNodeList = duplicatePoliciesNode.toElement().elementsByTagName( QStringLiteral(
"policy" ) );
2585 for (
int i = 0; i < duplicatePolicyNodeList.size(); ++i )
2587 const QDomElement duplicatePolicyElem = duplicatePolicyNodeList.at( i ).toElement();
2588 const QString field = duplicatePolicyElem.attribute( QStringLiteral(
"field" ) );
2590 mAttributeDuplicatePolicy.insert( field, policy );
2595 mDefaultExpressionMap.clear();
2596 QDomNode defaultsNode = layerNode.namedItem( QStringLiteral(
"defaults" ) );
2597 if ( !defaultsNode.isNull() )
2599 QDomNodeList defaultNodeList = defaultsNode.toElement().elementsByTagName( QStringLiteral(
"default" ) );
2600 for (
int i = 0; i < defaultNodeList.size(); ++i )
2602 QDomElement defaultElem = defaultNodeList.at( i ).toElement();
2604 QString field = defaultElem.attribute( QStringLiteral(
"field" ), QString() );
2605 QString expression = defaultElem.attribute( QStringLiteral(
"expression" ), QString() );
2606 bool applyOnUpdate = defaultElem.attribute( QStringLiteral(
"applyOnUpdate" ), QStringLiteral(
"0" ) ) == QLatin1String(
"1" );
2607 if ( field.isEmpty() || expression.isEmpty() )
2610 mDefaultExpressionMap.insert( field,
QgsDefaultValue( expression, applyOnUpdate ) );
2615 mFieldConstraints.clear();
2616 mFieldConstraintStrength.clear();
2617 QDomNode constraintsNode = layerNode.namedItem( QStringLiteral(
"constraints" ) );
2618 if ( !constraintsNode.isNull() )
2620 QDomNodeList constraintNodeList = constraintsNode.toElement().elementsByTagName( QStringLiteral(
"constraint" ) );
2621 for (
int i = 0; i < constraintNodeList.size(); ++i )
2623 QDomElement constraintElem = constraintNodeList.at( i ).toElement();
2625 QString field = constraintElem.attribute( QStringLiteral(
"field" ), QString() );
2626 int constraints = constraintElem.attribute( QStringLiteral(
"constraints" ), QStringLiteral(
"0" ) ).toInt();
2627 if ( field.isEmpty() || constraints == 0 )
2632 int uniqueStrength = constraintElem.attribute( QStringLiteral(
"unique_strength" ), QStringLiteral(
"1" ) ).toInt();
2633 int notNullStrength = constraintElem.attribute( QStringLiteral(
"notnull_strength" ), QStringLiteral(
"1" ) ).toInt();
2634 int expStrength = constraintElem.attribute( QStringLiteral(
"exp_strength" ), QStringLiteral(
"1" ) ).toInt();
2641 mFieldConstraintExpressions.clear();
2642 QDomNode constraintExpressionsNode = layerNode.namedItem( QStringLiteral(
"constraintExpressions" ) );
2643 if ( !constraintExpressionsNode.isNull() )
2645 QDomNodeList constraintNodeList = constraintExpressionsNode.toElement().elementsByTagName( QStringLiteral(
"constraint" ) );
2646 for (
int i = 0; i < constraintNodeList.size(); ++i )
2648 QDomElement constraintElem = constraintNodeList.at( i ).toElement();
2650 QString field = constraintElem.attribute( QStringLiteral(
"field" ), QString() );
2651 QString exp = constraintElem.attribute( QStringLiteral(
"exp" ), QString() );
2652 QString desc = constraintElem.attribute( QStringLiteral(
"desc" ), QString() );
2653 if ( field.isEmpty() || exp.isEmpty() )
2656 mFieldConstraintExpressions.insert( field, qMakePair( exp, desc ) );
2664 if ( categories.testFlag(
Fields ) || categories.testFlag(
Forms ) )
2668 QDomElement widgetsElem = layerNode.namedItem( QStringLiteral(
"fieldConfiguration" ) ).toElement();
2669 QDomNodeList fieldConfigurationElementList = widgetsElem.elementsByTagName( QStringLiteral(
"field" ) );
2670 for (
int i = 0; i < fieldConfigurationElementList.size(); ++i )
2672 const QDomElement fieldConfigElement = fieldConfigurationElementList.at( i ).toElement();
2673 const QDomElement fieldWidgetElement = fieldConfigElement.elementsByTagName( QStringLiteral(
"editWidget" ) ).at( 0 ).toElement();
2675 QString fieldName = fieldConfigElement.attribute( QStringLiteral(
"name" ) );
2677 if ( categories.testFlag(
Fields ) )
2681 if ( categories.testFlag(
Forms ) )
2683 const QString widgetType = fieldWidgetElement.attribute( QStringLiteral(
"type" ) );
2684 const QDomElement cfgElem = fieldConfigElement.elementsByTagName( QStringLiteral(
"config" ) ).at( 0 ).toElement();
2685 const QDomElement optionsElem = cfgElem.childNodes().at( 0 ).toElement();
2687 if ( widgetType == QLatin1String(
"ValueRelation" ) )
2689 optionsMap[ QStringLiteral(
"Value" ) ] = context.
projectTranslator()->
translate( QStringLiteral(
"project:layers:%1:fields:%2:valuerelationvalue" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text(), fieldName ), optionsMap[ QStringLiteral(
"Value" ) ].toString() );
2692 mFieldWidgetSetups[fieldName] = setup;
2699 if ( categories.testFlag(
Fields ) )
2701 const QList<QPair<QString, Qgis::FieldConfigurationFlag>> legacyConfig
2706 for (
const auto &config : legacyConfig )
2708 QDomNode excludeNode = layerNode.namedItem( config.first );
2709 if ( !excludeNode.isNull() )
2711 QDomNodeList attributeNodeList = excludeNode.toElement().elementsByTagName( QStringLiteral(
"attribute" ) );
2712 for (
int i = 0; i < attributeNodeList.size(); ++i )
2714 QString fieldName = attributeNodeList.at( i ).toElement().text();
2715 if ( !mFieldConfigurationFlags.contains( fieldName ) )
2716 mFieldConfigurationFlags[fieldName] = config.second;
2718 mFieldConfigurationFlags[fieldName].setFlag( config.second,
true );
2725 mGeometryOptions->readXml( layerNode.namedItem( QStringLiteral(
"geometryOptions" ) ) );
2727 if ( categories.testFlag(
Forms ) )
2728 mEditFormConfig.
readXml( layerNode, context );
2732 mAttributeTableConfig.
readXml( layerNode );
2733 mConditionalStyles->
readXml( layerNode, context );
2734 mStoredExpressionManager->
readXml( layerNode );
2740 QDomElement mapLayerNode = layerNode.toElement();
2742 && mapLayerNode.attribute( QStringLiteral(
"readOnly" ), QStringLiteral(
"0" ) ).toInt() == 1 )
2747 if ( categories.testFlag(
Legend ) )
2751 const QDomElement legendElem = layerNode.firstChildElement( QStringLiteral(
"legend" ) );
2752 if ( !legendElem.isNull() )
2757 mSetLegendFromStyle =
true;
2787 if ( !rendererElement.isNull() )
2805 if ( mSelectionProperties )
2806 mSelectionProperties->
readXml( node.toElement(), context );
2810 if ( categories.testFlag(
Labeling ) )
2814 QDomElement labelingElement = node.firstChildElement( QStringLiteral(
"labeling" ) );
2816 if ( labelingElement.isNull() ||
2817 ( labelingElement.attribute( QStringLiteral(
"type" ) ) == QLatin1String(
"simple" ) && labelingElement.firstChildElement( QStringLiteral(
"settings" ) ).isNull() ) )
2825 labeling = readLabelingFromCustomProperties();
2833 if ( node.toElement().hasAttribute( QStringLiteral(
"labelsEnabled" ) ) )
2834 mLabelsEnabled = node.toElement().attribute( QStringLiteral(
"labelsEnabled" ) ).toInt();
2836 mLabelsEnabled =
true;
2842 QDomNode blendModeNode = node.namedItem( QStringLiteral(
"blendMode" ) );
2843 if ( !blendModeNode.isNull() )
2845 QDomElement e = blendModeNode.toElement();
2850 QDomNode featureBlendModeNode = node.namedItem( QStringLiteral(
"featureBlendMode" ) );
2851 if ( !featureBlendModeNode.isNull() )
2853 QDomElement e = featureBlendModeNode.toElement();
2861 QDomNode layerTransparencyNode = node.namedItem( QStringLiteral(
"layerTransparency" ) );
2862 if ( !layerTransparencyNode.isNull() )
2864 QDomElement e = layerTransparencyNode.toElement();
2865 setOpacity( 1.0 - e.text().toInt() / 100.0 );
2867 QDomNode layerOpacityNode = node.namedItem( QStringLiteral(
"layerOpacity" ) );
2868 if ( !layerOpacityNode.isNull() )
2870 QDomElement e = layerOpacityNode.toElement();
2874 const bool hasScaleBasedVisibiliy { node.attributes().namedItem( QStringLiteral(
"hasScaleBasedVisibilityFlag" ) ).nodeValue() ==
'1' };
2877 const double maxScale { node.attributes().namedItem( QStringLiteral(
"maxScale" ) ).nodeValue().toDouble( &ok ) };
2882 const double minScale { node.attributes().namedItem( QStringLiteral(
"minScale" ) ).nodeValue().toDouble( &ok ) };
2888 QDomElement e = node.toElement();
2893 mSimplifyMethod.
setThreshold( e.attribute( QStringLiteral(
"simplifyDrawingTol" ), QStringLiteral(
"1" ) ).toFloat() );
2894 mSimplifyMethod.
setForceLocalOptimization( e.attribute( QStringLiteral(
"simplifyLocal" ), QStringLiteral(
"1" ) ).toInt() );
2895 mSimplifyMethod.
setMaximumScale( e.attribute( QStringLiteral(
"simplifyMaxScale" ), QStringLiteral(
"1" ) ).toFloat() );
2898 mRenderer->
setReferenceScale( e.attribute( QStringLiteral(
"symbologyReferenceScale" ), QStringLiteral(
"-1" ) ).toDouble() );
2902 if ( categories.testFlag(
Diagrams ) )
2906 delete mDiagramRenderer;
2907 mDiagramRenderer =
nullptr;
2908 QDomElement singleCatDiagramElem = node.firstChildElement( QStringLiteral(
"SingleCategoryDiagramRenderer" ) );
2909 if ( !singleCatDiagramElem.isNull() )
2912 mDiagramRenderer->
readXml( singleCatDiagramElem, context );
2914 QDomElement linearDiagramElem = node.firstChildElement( QStringLiteral(
"LinearlyInterpolatedDiagramRenderer" ) );
2915 if ( !linearDiagramElem.isNull() )
2917 if ( linearDiagramElem.hasAttribute( QStringLiteral(
"classificationAttribute" ) ) )
2920 int idx = linearDiagramElem.attribute( QStringLiteral(
"classificationAttribute" ) ).toInt();
2921 if ( idx >= 0 && idx < mFields.
count() )
2922 linearDiagramElem.setAttribute( QStringLiteral(
"classificationField" ), mFields.
at( idx ).
name() );
2926 mDiagramRenderer->
readXml( linearDiagramElem, context );
2928 QDomElement stackedDiagramElem = node.firstChildElement( QStringLiteral(
"StackedDiagramRenderer" ) );
2929 if ( !stackedDiagramElem.isNull() )
2932 mDiagramRenderer->
readXml( stackedDiagramElem, context );
2935 if ( mDiagramRenderer )
2937 QDomElement diagramSettingsElem = node.firstChildElement( QStringLiteral(
"DiagramLayerSettings" ) );
2938 if ( !diagramSettingsElem.isNull() )
2940 bool oldXPos = diagramSettingsElem.hasAttribute( QStringLiteral(
"xPosColumn" ) );
2941 bool oldYPos = diagramSettingsElem.hasAttribute( QStringLiteral(
"yPosColumn" ) );
2942 bool oldShow = diagramSettingsElem.hasAttribute( QStringLiteral(
"showColumn" ) );
2943 if ( oldXPos || oldYPos || oldShow )
2949 int xPosColumn = diagramSettingsElem.attribute( QStringLiteral(
"xPosColumn" ) ).toInt();
2950 if ( xPosColumn >= 0 && xPosColumn < mFields.
count() )
2955 int yPosColumn = diagramSettingsElem.attribute( QStringLiteral(
"yPosColumn" ) ).toInt();
2956 if ( yPosColumn >= 0 && yPosColumn < mFields.
count() )
2961 int showColumn = diagramSettingsElem.attribute( QStringLiteral(
"showColumn" ) ).toInt();
2962 if ( showColumn >= 0 && showColumn < mFields.
count() )
2965 QDomElement propertiesElem = diagramSettingsElem.ownerDocument().createElement( QStringLiteral(
"properties" ) );
2972 ddp.
writeXml( propertiesElem, defs );
2973 diagramSettingsElem.appendChild( propertiesElem );
2976 delete mDiagramLayerSettings;
2978 mDiagramLayerSettings->
readXml( diagramSettingsElem );
2984 styleChangedSignalBlocker.release();
2996 QDomElement layerElement = node.toElement();
2999 ( void )
writeStyle( node, doc, errorMessage, context, categories );
3002 mGeometryOptions->writeXml( node );
3007 if ( !legendElement.isNull() )
3008 node.appendChild( legendElement );
3017 QDomElement referencedLayersElement = doc.createElement( QStringLiteral(
"referencedLayers" ) );
3018 node.appendChild( referencedLayersElement );
3020 const QList<QgsRelation>
referencingRelations { p->relationManager()->referencingRelations(
this ) };
3023 switch ( rel.type() )
3034 QDomElement referencingLayersElement = doc.createElement( QStringLiteral(
"referencingLayers" ) );
3035 node.appendChild( referencedLayersElement );
3037 const QList<QgsRelation> referencedRelations { p->relationManager()->referencedRelations(
this ) };
3038 for (
const QgsRelation &rel : referencedRelations )
3040 switch ( rel.type() )
3053 if ( categories.testFlag(
Fields ) || categories.testFlag(
Forms ) )
3055 QDomElement fieldConfigurationElement;
3057 fieldConfigurationElement = doc.createElement( QStringLiteral(
"fieldConfiguration" ) );
3058 node.appendChild( fieldConfigurationElement );
3060 for (
const QgsField &field : std::as_const( mFields ) )
3062 QDomElement fieldElement = doc.createElement( QStringLiteral(
"field" ) );
3063 fieldElement.setAttribute( QStringLiteral(
"name" ), field.name() );
3064 fieldConfigurationElement.appendChild( fieldElement );
3066 if ( categories.testFlag(
Fields ) )
3068 fieldElement.setAttribute( QStringLiteral(
"configurationFlags" ),
qgsFlagValueToKeys( field.configurationFlags() ) );
3071 if ( categories.testFlag(
Forms ) )
3076 QDomElement editWidgetElement = doc.createElement( QStringLiteral(
"editWidget" ) );
3077 fieldElement.appendChild( editWidgetElement );
3078 editWidgetElement.setAttribute( QStringLiteral(
"type" ), field.editorWidgetSetup().type() );
3079 QDomElement editWidgetConfigElement = doc.createElement( QStringLiteral(
"config" ) );
3082 editWidgetElement.appendChild( editWidgetConfigElement );
3088 if ( categories.testFlag(
Fields ) )
3091 QDomElement aliasElem = doc.createElement( QStringLiteral(
"aliases" ) );
3092 for (
const QgsField &field : std::as_const( mFields ) )
3094 QDomElement aliasEntryElem = doc.createElement( QStringLiteral(
"alias" ) );
3095 aliasEntryElem.setAttribute( QStringLiteral(
"field" ), field.name() );
3096 aliasEntryElem.setAttribute( QStringLiteral(
"index" ), mFields.
indexFromName( field.name() ) );
3097 aliasEntryElem.setAttribute( QStringLiteral(
"name" ), field.alias() );
3098 aliasElem.appendChild( aliasEntryElem );
3100 node.appendChild( aliasElem );
3104 QDomElement splitPoliciesElement = doc.createElement( QStringLiteral(
"splitPolicies" ) );
3105 for (
const QgsField &field : std::as_const( mFields ) )
3107 QDomElement splitPolicyElem = doc.createElement( QStringLiteral(
"policy" ) );
3108 splitPolicyElem.setAttribute( QStringLiteral(
"field" ), field.name() );
3109 splitPolicyElem.setAttribute( QStringLiteral(
"policy" ),
qgsEnumValueToKey( field.splitPolicy() ) );
3110 splitPoliciesElement.appendChild( splitPolicyElem );
3112 node.appendChild( splitPoliciesElement );
3117 QDomElement duplicatePoliciesElement = doc.createElement( QStringLiteral(
"duplicatePolicies" ) );
3118 for (
const QgsField &field : std::as_const( mFields ) )
3120 QDomElement duplicatePolicyElem = doc.createElement( QStringLiteral(
"policy" ) );
3121 duplicatePolicyElem.setAttribute( QStringLiteral(
"field" ), field.name() );
3122 duplicatePolicyElem.setAttribute( QStringLiteral(
"policy" ),
qgsEnumValueToKey( field.duplicatePolicy() ) );
3123 duplicatePoliciesElement.appendChild( duplicatePolicyElem );
3125 node.appendChild( duplicatePoliciesElement );
3129 QDomElement defaultsElem = doc.createElement( QStringLiteral(
"defaults" ) );
3130 for (
const QgsField &field : std::as_const( mFields ) )
3132 QDomElement defaultElem = doc.createElement( QStringLiteral(
"default" ) );
3133 defaultElem.setAttribute( QStringLiteral(
"field" ), field.name() );
3134 defaultElem.setAttribute( QStringLiteral(
"expression" ), field.defaultValueDefinition().expression() );
3135 defaultElem.setAttribute( QStringLiteral(
"applyOnUpdate" ), field.defaultValueDefinition().applyOnUpdate() ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
3136 defaultsElem.appendChild( defaultElem );
3138 node.appendChild( defaultsElem );
3141 QDomElement constraintsElem = doc.createElement( QStringLiteral(
"constraints" ) );
3142 for (
const QgsField &field : std::as_const( mFields ) )
3144 QDomElement constraintElem = doc.createElement( QStringLiteral(
"constraint" ) );
3145 constraintElem.setAttribute( QStringLiteral(
"field" ), field.name() );
3146 constraintElem.setAttribute( QStringLiteral(
"constraints" ), field.constraints().constraints() );
3151 constraintsElem.appendChild( constraintElem );
3153 node.appendChild( constraintsElem );
3156 QDomElement constraintExpressionsElem = doc.createElement( QStringLiteral(
"constraintExpressions" ) );
3157 for (
const QgsField &field : std::as_const( mFields ) )
3159 QDomElement constraintExpressionElem = doc.createElement( QStringLiteral(
"constraint" ) );
3160 constraintExpressionElem.setAttribute( QStringLiteral(
"field" ), field.name() );
3161 constraintExpressionElem.setAttribute( QStringLiteral(
"exp" ), field.constraints().constraintExpression() );
3162 constraintExpressionElem.setAttribute( QStringLiteral(
"desc" ), field.constraints().constraintDescription() );
3163 constraintExpressionsElem.appendChild( constraintExpressionElem );
3165 node.appendChild( constraintExpressionsElem );
3168 if ( !mExpressionFieldBuffer )
3176 mExpressionFieldBuffer->
writeXml( node, doc );
3181 if ( categories.testFlag(
Actions ) )
3186 mAttributeTableConfig.
writeXml( node );
3187 mConditionalStyles->
writeXml( node, doc, context );
3188 mStoredExpressionManager->
writeXml( node );
3191 if ( categories.testFlag(
Forms ) )
3192 mEditFormConfig.
writeXml( node, context );
3196 node.toElement().setAttribute( QStringLiteral(
"readOnly" ), mReadOnly );
3201 QDomElement prevExpElem = doc.createElement( QStringLiteral(
"previewExpression" ) );
3202 QDomText prevExpText = doc.createTextNode( mDisplayExpression );
3203 prevExpElem.appendChild( prevExpText );
3204 node.appendChild( prevExpElem );
3208 if ( categories.testFlag(
MapTips ) )
3210 QDomElement mapTipElem = doc.createElement( QStringLiteral(
"mapTip" ) );
3211 mapTipElem.setAttribute( QStringLiteral(
"enabled" ),
mapTipsEnabled() );
3212 QDomText mapTipText = doc.createTextNode( mMapTipTemplate );
3213 mapTipElem.appendChild( mapTipText );
3214 node.toElement().appendChild( mapTipElem );
3225 QDomElement mapLayerNode = node.toElement();
3238 QDomElement rendererElement = mRenderer->
save( doc, context );
3239 node.appendChild( rendererElement );
3241 if ( mSelectionProperties )
3243 mSelectionProperties->
writeXml( mapLayerNode, doc, context );
3247 if ( categories.testFlag(
Labeling ) )
3251 QDomElement labelingElement = mLabeling->
save( doc, context );
3252 node.appendChild( labelingElement );
3254 mapLayerNode.setAttribute( QStringLiteral(
"labelsEnabled" ), mLabelsEnabled ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
3260 mapLayerNode.setAttribute( QStringLiteral(
"simplifyDrawingHints" ), QString::number(
static_cast< int >( mSimplifyMethod.
simplifyHints() ) ) );
3261 mapLayerNode.setAttribute( QStringLiteral(
"simplifyAlgorithm" ), QString::number(
static_cast< int >( mSimplifyMethod.
simplifyAlgorithm() ) ) );
3262 mapLayerNode.setAttribute( QStringLiteral(
"simplifyDrawingTol" ), QString::number( mSimplifyMethod.
threshold() ) );
3263 mapLayerNode.setAttribute( QStringLiteral(
"simplifyLocal" ), mSimplifyMethod.
forceLocalOptimization() ? 1 : 0 );
3264 mapLayerNode.setAttribute( QStringLiteral(
"simplifyMaxScale" ), QString::number( mSimplifyMethod.
maximumScale() ) );
3276 QDomElement blendModeElem = doc.createElement( QStringLiteral(
"blendMode" ) );
3278 blendModeElem.appendChild( blendModeText );
3279 node.appendChild( blendModeElem );
3282 QDomElement featureBlendModeElem = doc.createElement( QStringLiteral(
"featureBlendMode" ) );
3284 featureBlendModeElem.appendChild( featureBlendModeText );
3285 node.appendChild( featureBlendModeElem );
3291 QDomElement layerOpacityElem = doc.createElement( QStringLiteral(
"layerOpacity" ) );
3292 QDomText layerOpacityText = doc.createTextNode( QString::number(
opacity() ) );
3293 layerOpacityElem.appendChild( layerOpacityText );
3294 node.appendChild( layerOpacityElem );
3295 mapLayerNode.setAttribute( QStringLiteral(
"hasScaleBasedVisibilityFlag" ),
hasScaleBasedVisibility() ? 1 : 0 );
3296 mapLayerNode.setAttribute( QStringLiteral(
"maxScale" ),
maximumScale() );
3297 mapLayerNode.setAttribute( QStringLiteral(
"minScale" ),
minimumScale() );
3299 mapLayerNode.setAttribute( QStringLiteral(
"symbologyReferenceScale" ), mRenderer ? mRenderer->
referenceScale() : -1 );
3302 if ( categories.testFlag(
Diagrams ) && mDiagramRenderer )
3304 mDiagramRenderer->
writeXml( mapLayerNode, doc, context );
3305 if ( mDiagramLayerSettings )
3306 mDiagramLayerSettings->
writeXml( mapLayerNode, doc );
3317 QDomElement nameElem = node.firstChildElement( QStringLiteral(
"Name" ) );
3318 if ( nameElem.isNull() )
3320 errorMessage = QStringLiteral(
"Warning: Name element not found within NamedLayer while it's required." );
3336 readSldLabeling( node );
3338 styleChangedSignalBlocker.release();
3348 Q_UNUSED( errorMessage )
3350 QVariantMap localProps = QVariantMap( props );
3359 QDomElement nameNode = doc.createElement( QStringLiteral(
"se:Name" ) );
3360 nameNode.appendChild( doc.createTextNode(
name() ) );
3361 node.appendChild( nameNode );
3363 QDomElement userStyleElem = doc.createElement( QStringLiteral(
"UserStyle" ) );
3364 node.appendChild( userStyleElem );
3366 QDomElement nameElem = doc.createElement( QStringLiteral(
"se:Name" ) );
3367 nameElem.appendChild( doc.createTextNode(
name() ) );
3369 userStyleElem.appendChild( nameElem );
3371 QDomElement featureTypeStyleElem = doc.createElement( QStringLiteral(
"se:FeatureTypeStyle" ) );
3372 userStyleElem.appendChild( featureTypeStyleElem );
3374 mRenderer->
toSld( doc, featureTypeStyleElem, localProps );
3377 mLabeling->
toSld( featureTypeStyleElem, localProps );
3388 if ( !mEditBuffer || !mDataProvider )
3393 if ( mGeometryOptions->isActive() )
3394 mGeometryOptions->apply( geom );
3403 if ( !skipDefaultValue && !mDefaultValueOnUpdateFields.isEmpty() )
3404 updateDefaultValues( fid );
3414 bool result =
false;
3416 switch (
fields().fieldOrigin( field ) )
3428 if ( mEditBuffer && mDataProvider )
3437 if ( result && !skipDefaultValues && !mDefaultValueOnUpdateFields.isEmpty() )
3455 for (
auto it = newValues.constBegin(); it != newValues.constEnd(); ++it )
3457 const int field = it.key();
3458 const QVariant newValue = it.value();
3461 if ( oldValues.contains( field ) )
3462 oldValue = oldValues[field];
3467 newValuesJoin[field] = newValue;
3468 oldValuesJoin[field] = oldValue;
3475 newValuesNotJoin[field] = newValue;
3476 oldValuesNotJoin[field] = oldValue;
3485 if ( ! newValuesJoin.isEmpty() && mJoinBuffer )
3490 if ( ! newValuesNotJoin.isEmpty() )
3492 if ( mEditBuffer && mDataProvider )
3498 if ( result && !skipDefaultValues && !mDefaultValueOnUpdateFields.isEmpty() )
3510 if ( !mEditBuffer || !mDataProvider )
3520 if ( attIndex < 0 || attIndex >=
fields().count() )
3524 mFields[ attIndex ].setAlias( QString() );
3525 if ( mAttributeAliasMap.contains(
name ) )
3527 mAttributeAliasMap.remove(
name );
3529 mEditFormConfig.setFields( mFields );
3538 if ( index < 0 || index >=
fields().count() )
3545 if ( mExpressionFieldBuffer )
3561 if ( !mEditBuffer || !mDataProvider )
3579 if ( attIndex < 0 || attIndex >=
fields().count() )
3584 mAttributeAliasMap.insert(
name, aliasString );
3585 mFields[ attIndex ].setAlias( aliasString );
3586 mEditFormConfig.setFields( mFields );
3594 if ( index < 0 || index >=
fields().count() )
3604 if ( index >= 0 && index < mFields.
count() )
3614 return mAttributeAliasMap;
3621 if ( index < 0 || index >=
fields().count() )
3626 mAttributeSplitPolicy.insert(
name, policy );
3627 mFields[ index ].setSplitPolicy( policy );
3628 mEditFormConfig.setFields( mFields );
3636 if ( index < 0 || index >=
fields().count() )
3641 mAttributeDuplicatePolicy.insert(
name, policy );
3642 mFields[ index ].setDuplicatePolicy( policy );
3643 mEditFormConfig.setFields( mFields );
3652 QSet<QString> excludeList;
3653 QMap< QString, Qgis::FieldConfigurationFlags >::const_iterator flagsIt = mFieldConfigurationFlags.constBegin();
3654 for ( ; flagsIt != mFieldConfigurationFlags.constEnd(); ++flagsIt )
3658 excludeList << flagsIt.key();
3668 QMap< QString, Qgis::FieldConfigurationFlags >::iterator flagsIt = mFieldConfigurationFlags.begin();
3669 for ( ; flagsIt != mFieldConfigurationFlags.end(); ++flagsIt )
3680 QSet<QString> excludeList;
3681 QMap< QString, Qgis::FieldConfigurationFlags >::const_iterator flagsIt = mFieldConfigurationFlags.constBegin();
3682 for ( ; flagsIt != mFieldConfigurationFlags.constEnd(); ++flagsIt )
3686 excludeList << flagsIt.key();
3696 QMap< QString, Qgis::FieldConfigurationFlags >::iterator flagsIt = mFieldConfigurationFlags.begin();
3697 for ( ; flagsIt != mFieldConfigurationFlags.end(); ++flagsIt )
3708 if ( index < 0 || index >=
fields().count() )
3717 if ( !mEditBuffer || !mDataProvider )
3727 bool deleted =
false;
3730 QList<int> attrList = qgis::setToList( qgis::listToSet( attrs ) );
3732 std::sort( attrList.begin(), attrList.end(), std::greater<int>() );
3734 for (
int attr : std::as_const( attrList ) )
3752 if ( context && context->
cascade )
3755 const bool hasRelationsOrJoins = !relations.empty() || mJoinBuffer->
containsJoins();
3756 if ( hasRelationsOrJoins )
3761 if ( handledFeatureIds.contains( fid ) )
3769 handledFeatureIds << fid;
3781 switch ( relation.strength() )
3789 while ( relatedFeaturesIt.
nextFeature( childFeature ) )
3791 childFeatureIds.insert( childFeature.
id() );
3793 if ( childFeatureIds.count() > 0 )
3795 relation.referencingLayer()->startEditing();
3796 relation.referencingLayer()->deleteFeatures( childFeatureIds, context );
3823 bool res = deleteFeatureCascade( fid, context );
3843 res = deleteFeatureCascade( fid, context ) && res;
3852 mSelectedFeatureIds.subtract( fids );
3872 if ( !mDataProvider )
3873 return pkAttributesList;
3876 for (
int i = 0; i < mFields.
count(); ++i )
3880 pkAttributesList << i;
3883 return pkAttributesList;
3890 if ( !mDataProvider )
3903 if ( mEditBuffer && !deletedFeatures.empty() )
3905 if ( addedFeatures.size() > deletedFeatures.size() )
3911 if ( ( !mEditBuffer || addedFeatures.empty() ) && mDataProvider && mDataProvider->
empty() )
3924 mCommitErrors.clear();
3926 if ( !mDataProvider )
3928 mCommitErrors << tr(
"ERROR: no provider" );
3934 mCommitErrors << tr(
"ERROR: layer not editable" );
3940 if ( !mAllowCommit )
3943 mCommitChangesActive =
true;
3945 bool success =
false;
3951 mCommitChangesActive =
false;
3953 if ( !mDeletedFids.empty() )
3956 mDeletedFids.clear();
4001 return mCommitErrors;
4016 if ( !mDataProvider )
4018 mCommitErrors << tr(
"ERROR: no provider" );
4044 mEditBuffer =
nullptr;
4049 if ( rollbackExtent )
4062 return mSelectedFeatureIds.size();
4070 return mSelectedFeatureIds;
4078 features.reserve( mSelectedFeatureIds.count() );
4085 features.push_back( f );
4095 if ( mSelectedFeatureIds.isEmpty() )
4101 if ( mSelectedFeatureIds.count() == 1 )
4102 request.
setFilterFid( *mSelectedFeatureIds.constBegin() );
4113 if ( !mEditBuffer || !mDataProvider )
4116 if ( mGeometryOptions->isActive() )
4118 for (
auto feature = features.begin(); feature != features.end(); ++feature )
4121 mGeometryOptions->apply( geom );
4148 if ( exp.isField() )
4171 if ( !mDisplayExpression.isEmpty() || mFields.
isEmpty() )
4173 return mDisplayExpression;
4178 if ( !candidateName.isEmpty() )
4201 return ( mEditBuffer && mDataProvider );
4213bool QgsVectorLayer::isReadOnly()
const
4217 return mDataSourceReadOnly || mReadOnly;
4225 if ( readonly && mEditBuffer )
4229 if ( !readonly && mDataSourceReadOnly )
4232 mReadOnly = readonly;
4241 if ( ! mDataProvider )
4244 if ( mDataSourceReadOnly )
4255 return mEditBuffer && mEditBuffer->
isModified();
4262 bool auxiliaryField =
false;
4266 return auxiliaryField;
4273 auxiliaryField =
true;
4276 return auxiliaryField;
4292 if ( r != mRenderer )
4296 mSymbolFeatureCounted =
false;
4297 mSymbolFeatureCountMap.clear();
4298 mSymbolFeatureIdMap.clear();
4303 if ( refreshRate <= 0 )
4305 mRefreshRendererTimer->stop();
4306 mRefreshRendererTimer->setInterval( 0 );
4310 mRefreshRendererTimer->setInterval( 1000 / refreshRate );
4311 mRefreshRendererTimer->start();
4326 mRendererGenerators << generator;
4334 for (
int i = mRendererGenerators.count() - 1; i >= 0; --i )
4336 if ( mRendererGenerators.at( i )->id() ==
id )
4338 delete mRendererGenerators.at( i );
4339 mRendererGenerators.removeAt( i );
4349 QList< const QgsFeatureRendererGenerator * > res;
4359 if ( !mDataProvider )
4365 QString ignoredError;
4369 mEditCommandActive =
true;
4377 if ( !mDataProvider )
4382 mEditCommandActive =
false;
4383 if ( !mDeletedFids.isEmpty() )
4387 mSelectedFeatureIds.subtract( mDeletedFids );
4390 mDeletedFids.clear();
4399 if ( !mDataProvider )
4410 std::unique_ptr< QUndoCommand > command = std::make_unique< QUndoCommand >();
4411 command->setObsolete(
true );
4414 mEditCommandActive =
false;
4415 mDeletedFids.clear();
4423 return mJoinBuffer->
addJoin( joinInfo );
4430 return mJoinBuffer->
removeJoin( joinLayerId );
4471 if ( oi < 0 || oi >= mExpressionFieldBuffer->
expressions().size() )
4474 return mExpressionFieldBuffer->
expressions().at( oi ).cachedExpression.expression();
4490 if ( !mDataProvider )
4495 mFields = mDataProvider->
fields();
4505 if ( mExpressionFieldBuffer )
4509 for (
auto aliasIt = mAttributeAliasMap.constBegin(); aliasIt != mAttributeAliasMap.constEnd(); ++aliasIt )
4515 mFields[ index ].setAlias( aliasIt.value() );
4518 for (
auto splitPolicyIt = mAttributeSplitPolicy.constBegin(); splitPolicyIt != mAttributeSplitPolicy.constEnd(); ++splitPolicyIt )
4520 int index = mFields.
lookupField( splitPolicyIt.key() );
4524 mFields[ index ].setSplitPolicy( splitPolicyIt.value() );
4527 for (
auto duplicatePolicyIt = mAttributeDuplicatePolicy.constBegin(); duplicatePolicyIt != mAttributeDuplicatePolicy.constEnd(); ++duplicatePolicyIt )
4529 int index = mFields.
lookupField( duplicatePolicyIt.key() );
4533 mFields[ index ].setDuplicatePolicy( duplicatePolicyIt.value() );
4537 QMap< QString, Qgis::FieldConfigurationFlags >::const_iterator flagsIt = mFieldConfigurationFlags.constBegin();
4538 for ( ; flagsIt != mFieldConfigurationFlags.constEnd(); ++flagsIt )
4544 mFields[index].setConfigurationFlags( flagsIt.value() );
4548 mDefaultValueOnUpdateFields.clear();
4549 QMap< QString, QgsDefaultValue >::const_iterator defaultIt = mDefaultExpressionMap.constBegin();
4550 for ( ; defaultIt != mDefaultExpressionMap.constEnd(); ++defaultIt )
4552 int index = mFields.
lookupField( defaultIt.key() );
4556 mFields[ index ].setDefaultValueDefinition( defaultIt.value() );
4557 if ( defaultIt.value().applyOnUpdate() )
4558 mDefaultValueOnUpdateFields.insert( index );
4561 QMap< QString, QgsFieldConstraints::Constraints >::const_iterator constraintIt = mFieldConstraints.constBegin();
4562 for ( ; constraintIt != mFieldConstraints.constEnd(); ++constraintIt )
4564 int index = mFields.
lookupField( constraintIt.key() );
4577 mFields[ index ].setConstraints( constraints );
4580 QMap< QString, QPair< QString, QString > >::const_iterator constraintExpIt = mFieldConstraintExpressions.constBegin();
4581 for ( ; constraintExpIt != mFieldConstraintExpressions.constEnd(); ++constraintExpIt )
4583 int index = mFields.
lookupField( constraintExpIt.key() );
4594 mFields[ index ].setConstraints( constraints );
4598 for ( ; constraintStrengthIt != mFieldConstraintStrength.constEnd(); ++constraintStrengthIt )
4600 int index = mFields.
lookupField( constraintStrengthIt.key().first );
4610 constraints.
setConstraintStrength( constraintStrengthIt.key().second, constraintStrengthIt.value() );
4611 mFields[ index ].setConstraints( constraints );
4614 auto fieldWidgetIterator = mFieldWidgetSetups.constBegin();
4615 for ( ; fieldWidgetIterator != mFieldWidgetSetups.constEnd(); ++ fieldWidgetIterator )
4617 int index = mFields.
indexOf( fieldWidgetIterator.key() );
4621 mFields[index].setEditorWidgetSetup( fieldWidgetIterator.value() );
4624 if ( oldFields != mFields )
4627 mEditFormConfig.setFields( mFields );
4636 if ( index < 0 || index >= mFields.
count() || !mDataProvider )
4640 if ( expression.isEmpty() )
4644 std::unique_ptr< QgsExpressionContext > tempContext;
4649 evalContext = tempContext.get();
4684 if ( index < 0 || index >= mFields.
count() )
4689 mDefaultExpressionMap.insert( mFields.
at( index ).
name(), definition );
4693 mDefaultExpressionMap.remove( mFields.
at( index ).
name() );
4702 if ( index < 0 || index >= mFields.
count() )
4713 if ( !mDataProvider )
4728 if ( mEditBuffer && ! mDataProvider->
transaction() )
4732 for (
const QVariant &v : constUniqueValues )
4734 vals << v.toString();
4738 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
4739 while ( addedIt.hasNext() && ( limit < 0 ||
uniqueValues.count() < limit ) )
4742 QVariant v = addedIt.value().attribute( index );
4745 QString vs = v.toString();
4746 if ( !vals.contains( vs ) )
4755 while ( it.hasNext() && ( limit < 0 ||
uniqueValues.count() < limit ) )
4758 QVariant v = it.value().value( index );
4761 QString vs = v.toString();
4762 if ( !vals.contains( vs ) )
4795 .setSubsetOfAttributes( attList ) );
4798 QVariant currentValue;
4799 QHash<QString, QVariant> val;
4803 val.insert( currentValue.toString(), currentValue );
4804 if ( limit >= 0 && val.size() >= limit )
4810 return qgis::listToSet( val.values() );
4814 Q_ASSERT_X(
false,
"QgsVectorLayer::uniqueValues()",
"Unknown source of the field!" );
4822 QStringList results;
4823 if ( !mDataProvider )
4838 if ( mEditBuffer && ! mDataProvider->
transaction() )
4841 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
4842 while ( addedIt.hasNext() && ( limit < 0 || results.count() < limit ) && ( !feedback || !feedback->
isCanceled() ) )
4845 QVariant v = addedIt.value().attribute( index );
4848 QString vs = v.toString();
4849 if ( vs.contains( substring, Qt::CaseInsensitive ) && !results.contains( vs ) )
4857 while ( it.hasNext() && ( limit < 0 || results.count() < limit ) && ( !feedback || !feedback->
isCanceled() ) )
4860 QVariant v = it.value().value( index );
4863 QString vs = v.toString();
4864 if ( vs.contains( substring, Qt::CaseInsensitive ) && !results.contains( vs ) )
4895 QString fieldName = mFields.
at( index ).
name();
4896 request.
setFilterExpression( QStringLiteral(
"\"%1\" ILIKE '%%2%'" ).arg( fieldName, substring ) );
4900 QString currentValue;
4903 currentValue = f.
attribute( index ).toString();
4904 if ( !results.contains( currentValue ) )
4905 results << currentValue;
4907 if ( ( limit >= 0 && results.size() >= limit ) || ( feedback && feedback->
isCanceled() ) )
4917 Q_ASSERT_X(
false,
"QgsVectorLayer::uniqueStringsMatching()",
"Unknown source of the field!" );
4926 minimumOrMaximumValue( index, &minimum,
nullptr );
4935 minimumOrMaximumValue( index,
nullptr, &maximum );
4943 minimumOrMaximumValue( index, &minimum, &maximum );
4946void QgsVectorLayer::minimumOrMaximumValue(
int index, QVariant *minimum, QVariant *maximum )
const
4951 *minimum = QVariant();
4953 *maximum = QVariant();
4955 if ( !mDataProvider )
4975 if ( mEditBuffer && ! mDataProvider->
transaction() )
4978 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
4979 while ( addedIt.hasNext() )
4982 const QVariant v = addedIt.value().attribute( index );
4990 while ( it.hasNext() )
4993 const QVariant v = it.value().value( index );
5029 .setSubsetOfAttributes( attList ) );
5032 bool firstValue =
true;
5035 const QVariant currentValue = f.
attribute( index );
5042 *minimum = currentValue;
5044 *maximum = currentValue;
5049 if ( minimum && currentValue.isValid() &&
qgsVariantLessThan( currentValue, *minimum ) )
5050 *minimum = currentValue;
5052 *maximum = currentValue;
5059 Q_ASSERT_X(
false,
"QgsVectorLayer::minimumOrMaximumValue()",
"Unknown source of the field!" );
5062void QgsVectorLayer::createEditBuffer()
5098void QgsVectorLayer::clearEditBuffer()
5103 mEditBuffer =
nullptr;
5118 if ( !mDataProvider )
5121 *
error = tr(
"Layer is invalid" );
5127 if ( attrIndex >= 0 )
5134 bool providerOk =
false;
5135 QVariant val = mDataProvider->
aggregate(
aggregate, attrIndex, parameters, context, providerOk, fids );
5149 c.setFidsFilter( *fids );
5150 c.setParameters( parameters );
5151 bool aggregateOk =
false;
5152 const QVariant result =
c.calculate(
aggregate, fieldOrExpression, context, &aggregateOk, feedback );
5155 if ( !aggregateOk &&
error )
5178 return mFeatureBlendMode;
5181void QgsVectorLayer::readSldLabeling(
const QDomNode &node )
5188 QDomElement element = node.toElement();
5189 if ( element.isNull() )
5192 QDomElement userStyleElem = element.firstChildElement( QStringLiteral(
"UserStyle" ) );
5193 if ( userStyleElem.isNull() )
5195 QgsDebugMsgLevel( QStringLiteral(
"Info: UserStyle element not found." ), 4 );
5199 QDomElement featTypeStyleElem = userStyleElem.firstChildElement( QStringLiteral(
"FeatureTypeStyle" ) );
5200 if ( featTypeStyleElem.isNull() )
5202 QgsDebugMsgLevel( QStringLiteral(
"Info: FeatureTypeStyle element not found." ), 4 );
5207 QDomElement mergedFeatTypeStyle = featTypeStyleElem.cloneNode(
false ).toElement();
5212 bool needRuleBasedLabeling =
false;
5215 while ( !featTypeStyleElem.isNull() )
5217 QDomElement ruleElem = featTypeStyleElem.firstChildElement( QStringLiteral(
"Rule" ) );
5218 while ( !ruleElem.isNull() )
5222 bool hasTextSymbolizer =
false;
5223 bool hasRuleBased =
false;
5224 QDomElement ruleChildElem = ruleElem.firstChildElement();
5225 while ( !ruleChildElem.isNull() )
5228 if ( ruleChildElem.localName() == QLatin1String(
"Filter" ) ||
5229 ruleChildElem.localName() == QLatin1String(
"MinScaleDenominator" ) ||
5230 ruleChildElem.localName() == QLatin1String(
"MaxScaleDenominator" ) )
5232 hasRuleBased =
true;
5235 else if ( ruleChildElem.localName() == QLatin1String(
"TextSymbolizer" ) )
5237 QgsDebugMsgLevel( QStringLiteral(
"Info: TextSymbolizer element found" ), 4 );
5238 hasTextSymbolizer =
true;
5241 ruleChildElem = ruleChildElem.nextSiblingElement();
5244 if ( hasTextSymbolizer )
5249 mergedFeatTypeStyle.appendChild( ruleElem.cloneNode().toElement() );
5253 QgsDebugMsgLevel( QStringLiteral(
"Info: Filter or Min/MaxScaleDenominator element found: need a RuleBasedLabeling" ), 4 );
5254 needRuleBasedLabeling =
true;
5259 if ( ruleCount > 1 )
5261 QgsDebugMsgLevel( QStringLiteral(
"Info: More Rule elements found: need a RuleBasedLabeling" ), 4 );
5262 needRuleBasedLabeling =
true;
5266 if ( ruleCount == 0 )
5268 needRuleBasedLabeling =
false;
5271 ruleElem = ruleElem.nextSiblingElement( QStringLiteral(
"Rule" ) );
5273 featTypeStyleElem = featTypeStyleElem.nextSiblingElement( QStringLiteral(
"FeatureTypeStyle" ) );
5276 if ( ruleCount == 0 )
5278 QgsDebugMsgLevel( QStringLiteral(
"Info: No TextSymbolizer element." ), 4 );
5282 QDomElement ruleElem = mergedFeatTypeStyle.firstChildElement( QStringLiteral(
"Rule" ) );
5284 if ( needRuleBasedLabeling )
5288 while ( !ruleElem.isNull() )
5291 QString label, description, filterExp;
5292 int scaleMinDenom = 0, scaleMaxDenom = 0;
5296 QDomElement childElem = ruleElem.firstChildElement();
5297 while ( !childElem.isNull() )
5299 if ( childElem.localName() == QLatin1String(
"Name" ) )
5303 if ( label.isEmpty() )
5304 label = childElem.firstChild().nodeValue();
5306 else if ( childElem.localName() == QLatin1String(
"Description" ) )
5309 QDomElement titleElem = childElem.firstChildElement( QStringLiteral(
"Title" ) );
5310 if ( !titleElem.isNull() )
5312 label = titleElem.firstChild().nodeValue();
5315 QDomElement abstractElem = childElem.firstChildElement( QStringLiteral(
"Abstract" ) );
5316 if ( !abstractElem.isNull() )
5318 description = abstractElem.firstChild().nodeValue();
5321 else if ( childElem.localName() == QLatin1String(
"Abstract" ) )
5324 description = childElem.firstChild().nodeValue();
5326 else if ( childElem.localName() == QLatin1String(
"Title" ) )
5329 label = childElem.firstChild().nodeValue();
5331 else if ( childElem.localName() == QLatin1String(
"Filter" ) )
5347 else if ( childElem.localName() == QLatin1String(
"MinScaleDenominator" ) )
5350 int v = childElem.firstChild().nodeValue().toInt( &ok );
5354 else if ( childElem.localName() == QLatin1String(
"MaxScaleDenominator" ) )
5357 int v = childElem.firstChild().nodeValue().toInt( &ok );
5361 else if ( childElem.localName() == QLatin1String(
"TextSymbolizer" ) )
5363 readSldTextSymbolizer( childElem, settings );
5366 childElem = childElem.nextSiblingElement();
5372 ruleElem = ruleElem.nextSiblingElement();
5382 QDomElement textSymbolizerElem = ruleElem.firstChildElement( QStringLiteral(
"TextSymbolizer" ) );
5384 if ( readSldTextSymbolizer( textSymbolizerElem, s ) )
5392bool QgsVectorLayer::readSldTextSymbolizer(
const QDomNode &node,
QgsPalLayerSettings &settings )
const
5396 if ( node.localName() != QLatin1String(
"TextSymbolizer" ) )
5398 QgsDebugMsgLevel( QStringLiteral(
"Not a TextSymbolizer element: %1" ).arg( node.localName() ), 3 );
5401 QDomElement textSymbolizerElem = node.toElement();
5403 QDomElement labelElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Label" ) );
5404 if ( !labelElem.isNull() )
5406 QDomElement propertyNameElem = labelElem.firstChildElement( QStringLiteral(
"PropertyName" ) );
5407 if ( !propertyNameElem.isNull() )
5412 QString labelAttribute = propertyNameElem.text();
5416 int fieldIndex = mFields.
lookupField( labelAttribute );
5417 if ( fieldIndex == -1 )
5433 QgsDebugMsgLevel( QStringLiteral(
"Info: PropertyName element not found." ), 4 );
5444 if ( textSymbolizerElem.hasAttribute( QStringLiteral(
"uom" ) ) )
5449 QString fontFamily = QStringLiteral(
"Sans-Serif" );
5450 int fontPointSize = 10;
5452 int fontWeight = -1;
5453 bool fontItalic =
false;
5454 bool fontUnderline =
false;
5457 QDomElement fontElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Font" ) );
5458 if ( !fontElem.isNull() )
5461 for ( QgsStringMap::iterator it = fontSvgParams.begin(); it != fontSvgParams.end(); ++it )
5463 QgsDebugMsgLevel( QStringLiteral(
"found fontSvgParams %1: %2" ).arg( it.key(), it.value() ), 4 );
5465 if ( it.key() == QLatin1String(
"font-family" ) )
5467 fontFamily = it.value();
5469 else if ( it.key() == QLatin1String(
"font-style" ) )
5471 fontItalic = ( it.value() == QLatin1String(
"italic" ) ) || ( it.value() == QLatin1String(
"Italic" ) );
5473 else if ( it.key() == QLatin1String(
"font-size" ) )
5476 int fontSize = it.value().toInt( &ok );
5479 fontPointSize = fontSize;
5480 fontUnitSize = sldUnitSize;
5483 else if ( it.key() == QLatin1String(
"font-weight" ) )
5485 if ( ( it.value() == QLatin1String(
"bold" ) ) || ( it.value() == QLatin1String(
"Bold" ) ) )
5486 fontWeight = QFont::Bold;
5488 else if ( it.key() == QLatin1String(
"font-underline" ) )
5490 fontUnderline = ( it.value() == QLatin1String(
"underline" ) ) || ( it.value() == QLatin1String(
"Underline" ) );
5496 QFont font( fontFamily, fontPointSize, fontWeight, fontItalic );
5497 font.setUnderline( fontUnderline );
5499 format.
setSize( fontPointSize );
5503 QDomElement fillElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Fill" ) );
5505 Qt::BrushStyle textBrush = Qt::SolidPattern;
5507 if ( textColor.isValid() )
5509 QgsDebugMsgLevel( QStringLiteral(
"Info: textColor %1." ).arg( QVariant( textColor ).toString() ), 4 );
5516 QDomElement haloElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Halo" ) );
5517 if ( !haloElem.isNull() )
5522 QDomElement radiusElem = haloElem.firstChildElement( QStringLiteral(
"Radius" ) );
5523 if ( !radiusElem.isNull() )
5526 double bufferSize = radiusElem.text().toDouble( &ok );
5529 bufferSettings.
setSize( bufferSize );
5534 QDomElement haloFillElem = haloElem.firstChildElement( QStringLiteral(
"Fill" ) );
5536 Qt::BrushStyle bufferBrush = Qt::SolidPattern;
5538 if ( bufferColor.isValid() )
5540 QgsDebugMsgLevel( QStringLiteral(
"Info: bufferColor %1." ).arg( QVariant( bufferColor ).toString() ), 4 );
5541 bufferSettings.
setColor( bufferColor );
5546 QDomElement labelPlacementElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"LabelPlacement" ) );
5547 if ( !labelPlacementElem.isNull() )
5550 QDomElement pointPlacementElem = labelPlacementElem.firstChildElement( QStringLiteral(
"PointPlacement" ) );
5551 if ( !pointPlacementElem.isNull() )
5559 QDomElement displacementElem = pointPlacementElem.firstChildElement( QStringLiteral(
"Displacement" ) );
5560 if ( !displacementElem.isNull() )
5562 QDomElement displacementXElem = displacementElem.firstChildElement( QStringLiteral(
"DisplacementX" ) );
5563 if ( !displacementXElem.isNull() )
5566 double xOffset = displacementXElem.text().toDouble( &ok );
5573 QDomElement displacementYElem = displacementElem.firstChildElement( QStringLiteral(
"DisplacementY" ) );
5574 if ( !displacementYElem.isNull() )
5577 double yOffset = displacementYElem.text().toDouble( &ok );
5585 QDomElement anchorPointElem = pointPlacementElem.firstChildElement( QStringLiteral(
"AnchorPoint" ) );
5586 if ( !anchorPointElem.isNull() )
5588 QDomElement anchorPointXElem = anchorPointElem.firstChildElement( QStringLiteral(
"AnchorPointX" ) );
5589 if ( !anchorPointXElem.isNull() )
5592 double xOffset = anchorPointXElem.text().toDouble( &ok );
5599 QDomElement anchorPointYElem = anchorPointElem.firstChildElement( QStringLiteral(
"AnchorPointY" ) );
5600 if ( !anchorPointYElem.isNull() )
5603 double yOffset = anchorPointYElem.text().toDouble( &ok );
5612 QDomElement rotationElem = pointPlacementElem.firstChildElement( QStringLiteral(
"Rotation" ) );
5613 if ( !rotationElem.isNull() )
5616 double rotation = rotationElem.text().toDouble( &ok );
5626 QDomElement linePlacementElem = labelPlacementElem.firstChildElement( QStringLiteral(
"LinePlacement" ) );
5627 if ( !linePlacementElem.isNull() )
5636 QDomElement vendorOptionElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"VendorOption" ) );
5637 while ( !vendorOptionElem.isNull() && vendorOptionElem.localName() == QLatin1String(
"VendorOption" ) )
5639 QString optionName = vendorOptionElem.attribute( QStringLiteral(
"name" ) );
5640 QString optionValue;
5641 if ( vendorOptionElem.firstChild().nodeType() == QDomNode::TextNode )
5643 optionValue = vendorOptionElem.firstChild().nodeValue();
5647 if ( vendorOptionElem.firstChild().nodeType() == QDomNode::ElementNode &&
5648 vendorOptionElem.firstChild().localName() == QLatin1String(
"Literal" ) )