606 bool matches = exp.
evaluate( context ).toBool();
610 newSelection << feat.
id();
614 newSelection << feat.
id();
635 newSelection = mSelectedFeatureIds + ids;
639 newSelection = mSelectedFeatureIds - ids;
643 newSelection = mSelectedFeatureIds.intersect( ids );
647 QgsFeatureIds deselectedFeatures = mSelectedFeatureIds - newSelection;
648 mSelectedFeatureIds = newSelection;
649 mPreviousSelectedFeatureIds.clear();
659 if ( !intersectingIds.isEmpty() )
661 QgsDebugMsgLevel( QStringLiteral(
"Trying to select and deselect the same item at the same time. Unsure what to do. Selecting dubious items." ), 3 );
664 mSelectedFeatureIds -= deselectIds;
665 mSelectedFeatureIds += selectIds;
666 mPreviousSelectedFeatureIds.clear();
676 ids.subtract( mSelectedFeatureIds );
695 .setFilterRect( rect )
697 .setNoAttributes() );
705 if ( mSelectedFeatureIds.contains( fet.
id() ) )
707 deselectIds << fet.
id();
711 selectIds << fet.
id();
722 if ( mSelectedFeatureIds.isEmpty() )
727 mPreviousSelectedFeatureIds = previous;
734 if ( mPreviousSelectedFeatureIds.isEmpty() || !mSelectedFeatureIds.empty() )
745 return mDataProvider;
753 return mDataProvider;
761 return mSelectionProperties;
768 return mTemporalProperties;
775 return mElevationProperties;
791 if (
isValid() && mDataProvider && mDataProvider->
encoding() != encoding )
802 delete mDiagramRenderer;
803 mDiagramRenderer = r;
827 if ( !
isValid() || !
isSpatial() || mSelectedFeatureIds.isEmpty() || !mDataProvider )
839 .setFilterFids( mSelectedFeatureIds )
840 .setNoAttributes() );
853 .setNoAttributes() );
857 if ( mSelectedFeatureIds.contains( fet.
id() ) )
868 if ( retval.
width() == 0.0 || retval.
height() == 0.0 )
877 retval.
set( -1.0, -1.0, 1.0, 1.0 );
889 return mLabelsEnabled &&
static_cast< bool >( mLabeling );
896 mLabelsEnabled = enabled;
904 if ( !mDiagramRenderer || !mDiagramLayerSettings )
907 QList<QgsDiagramSettings> settingList = mDiagramRenderer->
diagramSettings();
908 if ( !settingList.isEmpty() )
910 return settingList.at( 0 ).enabled;
919 if ( !mSymbolFeatureCounted )
922 return mSymbolFeatureCountMap.value( legendKey, -1 );
929 if ( !mSymbolFeatureCounted )
932 return mSymbolFeatureIdMap.value( legendKey,
QgsFeatureIds() );
938 if ( ( mSymbolFeatureCounted || mFeatureCounter ) && !( storeSymbolFids && mSymbolFeatureIdMap.isEmpty() ) )
939 return mFeatureCounter;
941 mSymbolFeatureCountMap.clear();
942 mSymbolFeatureIdMap.clear();
947 return mFeatureCounter;
949 if ( !mDataProvider )
952 return mFeatureCounter;
957 return mFeatureCounter;
960 if ( !mFeatureCounter || ( storeSymbolFids && mSymbolFeatureIdMap.isEmpty() ) )
963 connect( mFeatureCounter, &
QgsTask::taskCompleted,
this, &QgsVectorLayer::onFeatureCounterCompleted, Qt::UniqueConnection );
964 connect( mFeatureCounter, &
QgsTask::taskTerminated,
this, &QgsVectorLayer::onFeatureCounterTerminated, Qt::UniqueConnection );
968 return mFeatureCounter;
976 if ( force || !mReadExtentFromXml || ( mReadExtentFromXml && mXmlExtent.
isNull() ) )
977 mValidExtent =
false;
992 if ( !mDefaultValueOnUpdateFields.isEmpty() )
997 int size = mFields.
size();
998 for (
int idx : std::as_const( mDefaultValueOnUpdateFields ) )
1000 if ( idx < 0 || idx >= size )
1019 if ( !mValidExtent && mLazyExtent && mReadExtentFromXml && !mXmlExtent.
isNull() )
1021 updateExtent( mXmlExtent );
1022 mValidExtent =
true;
1023 mLazyExtent =
false;
1026 if ( !mValidExtent && mLazyExtent && mDataProvider && mDataProvider->
isValid() )
1029 updateExtent( mDataProvider->
extent() );
1030 mValidExtent =
true;
1031 mLazyExtent =
false;
1034 QgsDebugMsgLevel( QStringLiteral(
"Extent of layer: %1" ).arg( mExtent.toString() ), 3 );
1040 if ( !
isValid() || !mDataProvider )
1042 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider" ), 3 );
1046 if ( !mEditBuffer ||
1060 if ( mEditBuffer && !mDataProvider->
transaction() )
1063 for ( QgsFeatureMap::const_iterator it = addedFeatures.constBegin(); it != addedFeatures.constEnd(); ++it )
1065 if ( it->hasGeometry() )
1076 .setNoAttributes() );
1089 if ( rect.xMinimum() > rect.xMaximum() && rect.yMinimum() > rect.yMaximum() )
1095 updateExtent( rect );
1096 mValidExtent =
true;
1115 if ( !
isValid() || !mDataProvider )
1117 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider" ), 3 );
1118 return customProperty( QStringLiteral(
"storedSubsetString" ) ).toString();
1127 if ( !
isValid() || !mDataProvider )
1129 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider or while editing" ), 3 );
1133 else if ( mEditBuffer )
1165 double maximumSimplificationScale = mSimplifyMethod.
maximumScale();
1168 return !( maximumSimplificationScale > 1 && renderContext.
rendererScale() <= maximumSimplificationScale );
1177 return mConditionalStyles;
1185 if ( !
isValid() || !mDataProvider )
1197 if ( feature.isValid() )
1198 return feature.geometry();
1207 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1211 if ( mGeometryOptions->isActive() )
1214 mGeometryOptions->apply( geom );
1218 bool success = mEditBuffer->
addFeature( feature );
1225 success = mJoinBuffer->
addFeature( feature );
1235 if ( !mEditBuffer || !mDataProvider )
1241 if ( currentFeature.
isValid() )
1243 bool hasChanged =
false;
1244 bool hasError =
false;
1256 QgsDebugMsgLevel( QStringLiteral(
"geometry of feature %1 could not be changed." ).arg( updatedFeature.
id() ), 3 );
1263 for (
int attr = 0; attr < fa.count(); ++attr )
1273 QgsDebugMsgLevel( QStringLiteral(
"attribute %1 of feature %2 could not be changed." ).arg( attr ).arg( updatedFeature.
id() ), 3 );
1278 if ( hasChanged && !mDefaultValueOnUpdateFields.isEmpty() && !skipDefaultValues )
1279 updateDefaultValues( updatedFeature.
id(), updatedFeature );
1285 QgsDebugMsgLevel( QStringLiteral(
"feature %1 could not be retrieved" ).arg( updatedFeature.
id() ), 3 );
1295 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1299 bool result = utils.
insertVertex( x, y, atFeatureId, beforeVertex );
1310 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1314 bool result = utils.
insertVertex( point, atFeatureId, beforeVertex );
1325 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1329 bool result = utils.
moveVertex( x, y, atFeatureId, atVertex );
1340 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1344 bool result = utils.
moveVertex( p, atFeatureId, atVertex );
1355 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1382 int count = mSelectedFeatureIds.size();
1395 *deletedCount = deleted;
1398 return deleted == count;
1401static const QgsPointSequence vectorPointXY2pointSequence(
const QVector<QgsPointXY> &points )
1404 pts.reserve( points.size() );
1405 QVector<QgsPointXY>::const_iterator it = points.constBegin();
1406 while ( it != points.constEnd() )
1417 return addRing( vectorPointXY2pointSequence( ring ), featureId );
1424 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1431 if ( !mSelectedFeatureIds.isEmpty() )
1433 result = utils.
addRing( ring, mSelectedFeatureIds, featureId );
1449 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1470 if ( !mSelectedFeatureIds.isEmpty() )
1472 result = utils.
addRing(
static_cast< QgsCurve *
>( ring->
clone() ), mSelectedFeatureIds, featureId );
1490 pts.reserve( points.size() );
1491 for ( QList<QgsPointXY>::const_iterator it = points.constBegin(); it != points.constEnd() ; ++it )
1498#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
1503 return addPart( vectorPointXY2pointSequence( points ) );
1511 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1516 if ( mSelectedFeatureIds.empty() )
1521 else if ( mSelectedFeatureIds.size() > 1 )
1539 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1544 if ( mSelectedFeatureIds.empty() )
1549 else if ( mSelectedFeatureIds.size() > 1 )
1568 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1583 return splitParts( vectorPointXY2pointSequence( splitLine ), topologicalEditing );
1590 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1594 return utils.
splitParts( splitLine, topologicalEditing );
1601 return splitFeatures( vectorPointXY2pointSequence( splitLine ), topologicalEditing );
1610 bool preserveCircular =
false;
1611 return splitFeatures( &splitLineString, topologyTestPoints, preserveCircular, topologicalEditing );
1618 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1622 return utils.
splitFeatures( curve, topologyTestPoints, preserveCircular, topologicalEditing );
1629 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1647 if ( !
isValid() || !mEditBuffer || !mDataProvider )
1658 if ( !
mValid || !mEditBuffer || !mDataProvider )
1683 if ( !
isValid() || !mDataProvider )
1717 if ( mDataProvider )
1733 if ( !mRenderer->
accept( visitor ) )
1737 if ( !mLabeling->
accept( visitor ) )
1750 QDomNode pkeyNode = layer_node.namedItem( QStringLiteral(
"provider" ) );
1752 if ( pkeyNode.isNull() )
1758 QDomElement pkeyElt = pkeyNode.toElement();
1768 else if (
mDataSource.contains( QLatin1String(
"dbname=" ) ) )
1777 const QDomElement elem = layer_node.toElement();
1791 if ( elem.hasAttribute( QStringLiteral(
"wkbType" ) ) )
1792 mWkbType =
qgsEnumKeyToValue( elem.attribute( QStringLiteral(
"wkbType" ) ), mWkbType );
1795 QDomElement pkeyElem = pkeyNode.toElement();
1796 if ( !pkeyElem.isNull() )
1798 QString encodingString = pkeyElem.attribute( QStringLiteral(
"encoding" ) );
1799 if ( mDataProvider && !encodingString.isEmpty() )
1806 mJoinBuffer->
readXml( layer_node );
1811 mSetLegendFromStyle =
false;
1821 QDomNode depsNode = layer_node.namedItem( QStringLiteral(
"dataDependencies" ) );
1822 QDomNodeList depsNodes = depsNode.childNodes();
1823 QSet<QgsMapLayerDependency> sources;
1824 for (
int i = 0; i < depsNodes.count(); i++ )
1826 QString
source = depsNodes.at( i ).toElement().attribute( QStringLiteral(
"id" ) );
1831 if ( !mSetLegendFromStyle )
1837 mReadExtentFromXml =
true;
1839 if ( mReadExtentFromXml )
1841 const QDomNode extentNode = layer_node.namedItem( QStringLiteral(
"extent" ) );
1842 if ( !extentNode.isNull() )
1849 const QDomNode asNode = layer_node.namedItem( QStringLiteral(
"auxiliaryLayer" ) );
1850 const QDomElement asElem = asNode.toElement();
1851 if ( !asElem.isNull() )
1853 mAuxiliaryLayerKey = asElem.attribute( QStringLiteral(
"key" ) );
1857 mServerProperties->readXml( layer_node );
1864void QgsVectorLayer::setDataSourcePrivate(
const QString &dataSource,
const QString &baseName,
const QString &provider,
1873 setDataProvider( provider, options,
flags );
1883 bool loadDefaultStyleFlag =
false;
1886 loadDefaultStyleFlag =
true;
1892 std::unique_ptr< QgsScopedRuntimeProfile > profile;
1894 profile = std::make_unique< QgsScopedRuntimeProfile >( tr(
"Load layer style" ), QStringLiteral(
"projectload" ) );
1896 bool defaultLoadedFlag =
false;
1904 mSetLegendFromStyle =
false;
1909 if ( !defaultLoadedFlag && loadDefaultStyleFlag )
1917 std::unique_ptr< QgsFeatureRenderer > defaultRenderer( mDataProvider->
createRenderer() );
1918 if ( defaultRenderer )
1920 defaultLoadedFlag =
true;
1926 if ( !defaultLoadedFlag &&
isSpatial() )
1932 if ( !mSetLegendFromStyle )
1937 std::unique_ptr< QgsAbstractVectorLayerLabeling > defaultLabeling( mDataProvider->
createLabeling() );
1938 if ( defaultLabeling )
1945 styleChangedSignalBlocker.release();
1962 QStringList ids, names, descriptions;
1963 QString errorMessage;
1965 const int relatedStylesCount {
listStylesInDatabase( ids, names, descriptions, errorMessage ) };
1966 Q_ASSERT( ids.count() == names.count() );
1967 const QString currentStyleName { mStyleManager->currentStyle() };
1968 for (
int i = 0; i < relatedStylesCount; ++i )
1970 if ( names.at( i ) == currentStyleName )
1974 errorMessage.clear();
1976 if ( ! styleXml.isEmpty() && errorMessage.isEmpty() )
1982 QgsDebugMsgLevel( QStringLiteral(
"Error retrieving style %1 from DB: %2" ).arg( ids.at( i ), errorMessage ), 2 );
1992 std::unique_ptr< QgsFeatureRenderer > defaultRenderer( mDataProvider->
createRenderer() );
1993 if ( defaultRenderer )
2009 delete mDataProvider;
2016 if ( provider.compare( QLatin1String(
"postgres" ) ) == 0 )
2018 const QString checkUnicityKey { QStringLiteral(
"checkPrimaryKeyUnicity" ) };
2020 if ( ! uri.hasParam( checkUnicityKey ) )
2022 uri.setParam( checkUnicityKey, mReadExtentFromXml ?
"0" :
"1" );
2027 std::unique_ptr< QgsScopedRuntimeProfile > profile;
2029 profile = std::make_unique< QgsScopedRuntimeProfile >( tr(
"Create %1 provider" ).arg( provider ), QStringLiteral(
"projectload" ) );
2032 mDataProvider = qobject_cast< QgsVectorDataProvider * >(
mPreloadedProvider.release() );
2036 if ( !mDataProvider )
2043 mDataProvider->setParent(
this );
2046 QgsDebugMsgLevel( QStringLiteral(
"Instantiated the data provider plugin" ), 2 );
2056 profile->switchTask( tr(
"Read layer metadata" ) );
2063 newMetadata.
combine( &mMetadata );
2066 QgsDebugMsgLevel( QStringLiteral(
"Set Data provider QgsLayerMetadata identifier[%1]" ).arg(
metadata().identifier() ), 4 );
2073 mWkbType = mDataProvider->
wkbType();
2078 for (
const QgsField &field : providerFields )
2081 if ( !field.editorWidgetSetup().isNull() && mFieldWidgetSetups.value( field.name() ).isNull() )
2083 mFieldWidgetSetups[ field.name() ] = field.editorWidgetSetup();
2085 if ( !field.alias().isEmpty() && mAttributeAliasMap.value( field.name() ).isEmpty() )
2087 mAttributeAliasMap[ field.name() ] = field.alias();
2089 if ( !mAttributeSplitPolicy.contains( field.name() ) )
2091 mAttributeSplitPolicy[ field.name() ] = field.splitPolicy();
2096 profile->switchTask( tr(
"Read layer fields" ) );
2107 const thread_local QRegularExpression reg( R
"lit("[^"]+"\."([^"] + )"( \([^)]+\))?)lit" );
2108 const QRegularExpressionMatch match = reg.match(
name() );
2109 if ( match.hasMatch() )
2111 QStringList stuff = match.capturedTexts();
2112 QString lName = stuff[1];
2116 QMap<QString, QgsMapLayer *>::const_iterator it;
2117 for ( it = layers.constBegin(); it != layers.constEnd() && ( *it )->name() != lName; ++it )
2120 if ( it != layers.constEnd() && stuff.size() > 2 )
2122 lName +=
'.' + stuff[2].mid( 2, stuff[2].length() - 3 );
2125 if ( !lName.isEmpty() )
2135 else if ( provider == QLatin1String(
"ogr" ) )
2139 if (
mDataSource.right( 10 ) == QLatin1String(
"|layerid=0" ) )
2142 else if ( provider == QLatin1String(
"memory" ) )
2147 else if ( provider == QLatin1String(
"hana" ) )
2164 QDomDocument &document,
2171 QDomElement mapLayerNode = layer_node.toElement();
2173 if ( mapLayerNode.isNull() || (
"maplayer" != mapLayerNode.nodeName() ) )
2186 if ( mDataProvider )
2188 QDomElement provider = document.createElement( QStringLiteral(
"provider" ) );
2189 provider.setAttribute( QStringLiteral(
"encoding" ), mDataProvider->
encoding() );
2190 QDomText providerText = document.createTextNode(
providerType() );
2191 provider.appendChild( providerText );
2192 layer_node.appendChild( provider );
2196 mJoinBuffer->
writeXml( layer_node, document );
2199 QDomElement dependenciesElement = document.createElement( QStringLiteral(
"layerDependencies" ) );
2205 QDomElement depElem = document.createElement( QStringLiteral(
"layer" ) );
2206 depElem.setAttribute( QStringLiteral(
"id" ), dep.layerId() );
2207 dependenciesElement.appendChild( depElem );
2209 layer_node.appendChild( dependenciesElement );
2212 QDomElement dataDependenciesElement = document.createElement( QStringLiteral(
"dataDependencies" ) );
2217 QDomElement depElem = document.createElement( QStringLiteral(
"layer" ) );
2218 depElem.setAttribute( QStringLiteral(
"id" ), dep.layerId() );
2219 dataDependenciesElement.appendChild( depElem );
2221 layer_node.appendChild( dataDependenciesElement );
2224 mExpressionFieldBuffer->
writeXml( layer_node, document );
2229 QDomElement asElem = document.createElement( QStringLiteral(
"auxiliaryLayer" ) );
2230 if ( mAuxiliaryLayer )
2232 const QString pkField = mAuxiliaryLayer->joinInfo().targetFieldName();
2233 asElem.setAttribute( QStringLiteral(
"key" ), pkField );
2235 layer_node.appendChild( asElem );
2238 mServerProperties->writeXml( layer_node, document );
2242 return writeSymbology( layer_node, document, errorMsg, context );
2281 if ( categories.testFlag(
Fields ) )
2283 if ( !mExpressionFieldBuffer )
2285 mExpressionFieldBuffer->
readXml( layerNode );
2297 QDomNodeList referencedLayersNodeList = layerNode.toElement().elementsByTagName( QStringLiteral(
"referencedLayers" ) );
2298 if ( referencedLayersNodeList.size() > 0 )
2300 const QDomNodeList relationNodes { referencedLayersNodeList.at( 0 ).childNodes() };
2301 for (
int i = 0; i < relationNodes.length(); ++i )
2303 const QDomElement relationElement = relationNodes.at( i ).toElement();
2310 QDomNodeList referencingLayersNodeList = layerNode.toElement().elementsByTagName( QStringLiteral(
"referencingLayers" ) );
2311 if ( referencingLayersNodeList.size() > 0 )
2313 const QDomNodeList relationNodes { referencingLayersNodeList.at( 0 ).childNodes() };
2314 for (
int i = 0; i < relationNodes.length(); ++i )
2316 const QDomElement relationElement = relationNodes.at( i ).toElement();
2322 QDomElement layerElement = layerNode.toElement();
2326 readStyle( layerNode, errorMessage, context, categories );
2328 if ( categories.testFlag(
MapTips ) )
2330 QDomElement mapTipElem = layerNode.namedItem( QStringLiteral(
"mapTip" ) ).toElement();
2332 setMapTipsEnabled( mapTipElem.attribute( QStringLiteral(
"enabled" ), QStringLiteral(
"1" ) ).toInt() == 1 );
2336 mDisplayExpression = layerNode.namedItem( QStringLiteral(
"previewExpression" ) ).toElement().text();
2339 QString
displayField = layerNode.namedItem( QStringLiteral(
"displayfield" ) ).toElement().text();
2343 if ( mMapTipTemplate.isEmpty() && categories.testFlag(
MapTips ) )
2353 if ( categories.testFlag(
Actions ) )
2354 mActions->
readXml( layerNode );
2356 if ( categories.testFlag(
Fields ) )
2361 QDomNode aliasesNode = layerNode.namedItem( QStringLiteral(
"aliases" ) );
2362 if ( !aliasesNode.isNull() )
2364 QDomElement aliasElem;
2366 QDomNodeList aliasNodeList = aliasesNode.toElement().elementsByTagName( QStringLiteral(
"alias" ) );
2367 for (
int i = 0; i < aliasNodeList.size(); ++i )
2369 aliasElem = aliasNodeList.at( i ).toElement();
2372 if ( aliasElem.hasAttribute( QStringLiteral(
"field" ) ) )
2374 field = aliasElem.attribute( QStringLiteral(
"field" ) );
2378 int index = aliasElem.attribute( QStringLiteral(
"index" ) ).toInt();
2380 if ( index >= 0 && index <
fields().count() )
2386 if ( !aliasElem.attribute( QStringLiteral(
"name" ) ).isEmpty() )
2389 alias = context.
projectTranslator()->
translate( QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ), aliasElem.attribute( QStringLiteral(
"name" ) ) );
2390 QgsDebugMsgLevel(
"context" + QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ) +
" source " + aliasElem.attribute( QStringLiteral(
"name" ) ), 3 );
2395 alias = context.
projectTranslator()->
translate( QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ), field );
2396 QgsDebugMsgLevel(
"context" + QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ) +
" source " + field, 3 );
2398 if ( alias == aliasElem.attribute( QStringLiteral(
"field" ) ) )
2402 QgsDebugMsgLevel(
"field " + field +
" origalias " + aliasElem.attribute( QStringLiteral(
"name" ) ) +
" trans " + alias, 3 );
2403 mAttributeAliasMap.insert( field, alias );
2410 const QDomNode splitPoliciesNode = layerNode.namedItem( QStringLiteral(
"splitPolicies" ) );
2411 if ( !splitPoliciesNode.isNull() )
2413 const QDomNodeList splitPolicyNodeList = splitPoliciesNode.toElement().elementsByTagName( QStringLiteral(
"policy" ) );
2414 for (
int i = 0; i < splitPolicyNodeList.size(); ++i )
2416 const QDomElement splitPolicyElem = splitPolicyNodeList.at( i ).toElement();
2417 const QString field = splitPolicyElem.attribute( QStringLiteral(
"field" ) );
2419 mAttributeSplitPolicy.insert( field, policy );
2424 mDefaultExpressionMap.clear();
2425 QDomNode defaultsNode = layerNode.namedItem( QStringLiteral(
"defaults" ) );
2426 if ( !defaultsNode.isNull() )
2428 QDomNodeList defaultNodeList = defaultsNode.toElement().elementsByTagName( QStringLiteral(
"default" ) );
2429 for (
int i = 0; i < defaultNodeList.size(); ++i )
2431 QDomElement defaultElem = defaultNodeList.at( i ).toElement();
2433 QString field = defaultElem.attribute( QStringLiteral(
"field" ), QString() );
2434 QString expression = defaultElem.attribute( QStringLiteral(
"expression" ), QString() );
2435 bool applyOnUpdate = defaultElem.attribute( QStringLiteral(
"applyOnUpdate" ), QStringLiteral(
"0" ) ) == QLatin1String(
"1" );
2436 if ( field.isEmpty() || expression.isEmpty() )
2439 mDefaultExpressionMap.insert( field,
QgsDefaultValue( expression, applyOnUpdate ) );
2444 mFieldConstraints.clear();
2445 mFieldConstraintStrength.clear();
2446 QDomNode constraintsNode = layerNode.namedItem( QStringLiteral(
"constraints" ) );
2447 if ( !constraintsNode.isNull() )
2449 QDomNodeList constraintNodeList = constraintsNode.toElement().elementsByTagName( QStringLiteral(
"constraint" ) );
2450 for (
int i = 0; i < constraintNodeList.size(); ++i )
2452 QDomElement constraintElem = constraintNodeList.at( i ).toElement();
2454 QString field = constraintElem.attribute( QStringLiteral(
"field" ), QString() );
2455 int constraints = constraintElem.attribute( QStringLiteral(
"constraints" ), QStringLiteral(
"0" ) ).toInt();
2456 if ( field.isEmpty() || constraints == 0 )
2459 mFieldConstraints.insert( field,
static_cast< QgsFieldConstraints::Constraints
>( constraints ) );
2461 int uniqueStrength = constraintElem.attribute( QStringLiteral(
"unique_strength" ), QStringLiteral(
"1" ) ).toInt();
2462 int notNullStrength = constraintElem.attribute( QStringLiteral(
"notnull_strength" ), QStringLiteral(
"1" ) ).toInt();
2463 int expStrength = constraintElem.attribute( QStringLiteral(
"exp_strength" ), QStringLiteral(
"1" ) ).toInt();
2470 mFieldConstraintExpressions.clear();
2471 QDomNode constraintExpressionsNode = layerNode.namedItem( QStringLiteral(
"constraintExpressions" ) );
2472 if ( !constraintExpressionsNode.isNull() )
2474 QDomNodeList constraintNodeList = constraintExpressionsNode.toElement().elementsByTagName( QStringLiteral(
"constraint" ) );
2475 for (
int i = 0; i < constraintNodeList.size(); ++i )
2477 QDomElement constraintElem = constraintNodeList.at( i ).toElement();
2479 QString field = constraintElem.attribute( QStringLiteral(
"field" ), QString() );
2480 QString exp = constraintElem.attribute( QStringLiteral(
"exp" ), QString() );
2481 QString desc = constraintElem.attribute( QStringLiteral(
"desc" ), QString() );
2482 if ( field.isEmpty() || exp.isEmpty() )
2485 mFieldConstraintExpressions.insert( field, qMakePair( exp, desc ) );
2493 if ( categories.testFlag(
Fields ) || categories.testFlag(
Forms ) )
2497 QDomElement widgetsElem = layerNode.namedItem( QStringLiteral(
"fieldConfiguration" ) ).toElement();
2498 QDomNodeList fieldConfigurationElementList = widgetsElem.elementsByTagName( QStringLiteral(
"field" ) );
2499 for (
int i = 0; i < fieldConfigurationElementList.size(); ++i )
2501 const QDomElement fieldConfigElement = fieldConfigurationElementList.at( i ).toElement();
2502 const QDomElement fieldWidgetElement = fieldConfigElement.elementsByTagName( QStringLiteral(
"editWidget" ) ).at( 0 ).toElement();
2504 QString fieldName = fieldConfigElement.attribute( QStringLiteral(
"name" ) );
2506 if ( categories.testFlag(
Fields ) )
2510 if ( categories.testFlag(
Forms ) )
2512 const QString widgetType = fieldWidgetElement.attribute( QStringLiteral(
"type" ) );
2513 const QDomElement cfgElem = fieldConfigElement.elementsByTagName( QStringLiteral(
"config" ) ).at( 0 ).toElement();
2514 const QDomElement optionsElem = cfgElem.childNodes().at( 0 ).toElement();
2516 if ( widgetType == QLatin1String(
"ValueRelation" ) )
2518 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() );
2521 mFieldWidgetSetups[fieldName] = setup;
2528 if ( categories.testFlag(
Fields ) )
2530 const QList<QPair<QString, Qgis::FieldConfigurationFlag>> legacyConfig
2535 for (
const auto &config : legacyConfig )
2537 QDomNode excludeNode = layerNode.namedItem( config.first );
2538 if ( !excludeNode.isNull() )
2540 QDomNodeList attributeNodeList = excludeNode.toElement().elementsByTagName( QStringLiteral(
"attribute" ) );
2541 for (
int i = 0; i < attributeNodeList.size(); ++i )
2543 QString fieldName = attributeNodeList.at( i ).toElement().text();
2544 if ( !mFieldConfigurationFlags.contains( fieldName ) )
2545 mFieldConfigurationFlags[fieldName] = config.second;
2547 mFieldConfigurationFlags[fieldName].setFlag( config.second,
true );
2554 mGeometryOptions->readXml( layerNode.namedItem( QStringLiteral(
"geometryOptions" ) ) );
2556 if ( categories.testFlag(
Forms ) )
2557 mEditFormConfig.
readXml( layerNode, context );
2561 mAttributeTableConfig.
readXml( layerNode );
2562 mConditionalStyles->
readXml( layerNode, context );
2563 mStoredExpressionManager->
readXml( layerNode );
2569 QDomElement mapLayerNode = layerNode.toElement();
2571 && mapLayerNode.attribute( QStringLiteral(
"readOnly" ), QStringLiteral(
"0" ) ).toInt() == 1 )
2576 if ( categories.testFlag(
Legend ) )
2580 const QDomElement legendElem = layerNode.firstChildElement( QStringLiteral(
"legend" ) );
2581 if ( !legendElem.isNull() )
2586 mSetLegendFromStyle =
true;
2616 if ( !rendererElement.isNull() )
2634 if ( mSelectionProperties )
2635 mSelectionProperties->
readXml( node.toElement(), context );
2639 if ( categories.testFlag(
Labeling ) )
2643 QDomElement labelingElement = node.firstChildElement( QStringLiteral(
"labeling" ) );
2645 if ( labelingElement.isNull() ||
2646 ( labelingElement.attribute( QStringLiteral(
"type" ) ) == QLatin1String(
"simple" ) && labelingElement.firstChildElement( QStringLiteral(
"settings" ) ).isNull() ) )
2654 labeling = readLabelingFromCustomProperties();
2662 if ( node.toElement().hasAttribute( QStringLiteral(
"labelsEnabled" ) ) )
2663 mLabelsEnabled = node.toElement().attribute( QStringLiteral(
"labelsEnabled" ) ).toInt();
2665 mLabelsEnabled =
true;
2671 QDomNode blendModeNode = node.namedItem( QStringLiteral(
"blendMode" ) );
2672 if ( !blendModeNode.isNull() )
2674 QDomElement e = blendModeNode.toElement();
2679 QDomNode featureBlendModeNode = node.namedItem( QStringLiteral(
"featureBlendMode" ) );
2680 if ( !featureBlendModeNode.isNull() )
2682 QDomElement e = featureBlendModeNode.toElement();
2690 QDomNode layerTransparencyNode = node.namedItem( QStringLiteral(
"layerTransparency" ) );
2691 if ( !layerTransparencyNode.isNull() )
2693 QDomElement e = layerTransparencyNode.toElement();
2694 setOpacity( 1.0 - e.text().toInt() / 100.0 );
2696 QDomNode layerOpacityNode = node.namedItem( QStringLiteral(
"layerOpacity" ) );
2697 if ( !layerOpacityNode.isNull() )
2699 QDomElement e = layerOpacityNode.toElement();
2703 const bool hasScaleBasedVisibiliy { node.attributes().namedItem( QStringLiteral(
"hasScaleBasedVisibilityFlag" ) ).nodeValue() ==
'1' };
2706 const double maxScale { node.attributes().namedItem( QStringLiteral(
"maxScale" ) ).nodeValue().toDouble( &ok ) };
2711 const double minScale { node.attributes().namedItem( QStringLiteral(
"minScale" ) ).nodeValue().toDouble( &ok ) };
2717 QDomElement e = node.toElement();
2720 mSimplifyMethod.
setSimplifyHints(
static_cast< QgsVectorSimplifyMethod::SimplifyHints
>( e.attribute( QStringLiteral(
"simplifyDrawingHints" ), QStringLiteral(
"1" ) ).toInt() ) );
2722 mSimplifyMethod.
setThreshold( e.attribute( QStringLiteral(
"simplifyDrawingTol" ), QStringLiteral(
"1" ) ).toFloat() );
2723 mSimplifyMethod.
setForceLocalOptimization( e.attribute( QStringLiteral(
"simplifyLocal" ), QStringLiteral(
"1" ) ).toInt() );
2724 mSimplifyMethod.
setMaximumScale( e.attribute( QStringLiteral(
"simplifyMaxScale" ), QStringLiteral(
"1" ) ).toFloat() );
2727 mRenderer->
setReferenceScale( e.attribute( QStringLiteral(
"symbologyReferenceScale" ), QStringLiteral(
"-1" ) ).toDouble() );
2731 if ( categories.testFlag(
Diagrams ) )
2735 delete mDiagramRenderer;
2736 mDiagramRenderer =
nullptr;
2737 QDomElement singleCatDiagramElem = node.firstChildElement( QStringLiteral(
"SingleCategoryDiagramRenderer" ) );
2738 if ( !singleCatDiagramElem.isNull() )
2741 mDiagramRenderer->
readXml( singleCatDiagramElem, context );
2743 QDomElement linearDiagramElem = node.firstChildElement( QStringLiteral(
"LinearlyInterpolatedDiagramRenderer" ) );
2744 if ( !linearDiagramElem.isNull() )
2746 if ( linearDiagramElem.hasAttribute( QStringLiteral(
"classificationAttribute" ) ) )
2749 int idx = linearDiagramElem.attribute( QStringLiteral(
"classificationAttribute" ) ).toInt();
2750 if ( idx >= 0 && idx < mFields.
count() )
2751 linearDiagramElem.setAttribute( QStringLiteral(
"classificationField" ), mFields.
at( idx ).
name() );
2755 mDiagramRenderer->
readXml( linearDiagramElem, context );
2758 if ( mDiagramRenderer )
2760 QDomElement diagramSettingsElem = node.firstChildElement( QStringLiteral(
"DiagramLayerSettings" ) );
2761 if ( !diagramSettingsElem.isNull() )
2763 bool oldXPos = diagramSettingsElem.hasAttribute( QStringLiteral(
"xPosColumn" ) );
2764 bool oldYPos = diagramSettingsElem.hasAttribute( QStringLiteral(
"yPosColumn" ) );
2765 bool oldShow = diagramSettingsElem.hasAttribute( QStringLiteral(
"showColumn" ) );
2766 if ( oldXPos || oldYPos || oldShow )
2772 int xPosColumn = diagramSettingsElem.attribute( QStringLiteral(
"xPosColumn" ) ).toInt();
2773 if ( xPosColumn >= 0 && xPosColumn < mFields.
count() )
2778 int yPosColumn = diagramSettingsElem.attribute( QStringLiteral(
"yPosColumn" ) ).toInt();
2779 if ( yPosColumn >= 0 && yPosColumn < mFields.
count() )
2784 int showColumn = diagramSettingsElem.attribute( QStringLiteral(
"showColumn" ) ).toInt();
2785 if ( showColumn >= 0 && showColumn < mFields.
count() )
2788 QDomElement propertiesElem = diagramSettingsElem.ownerDocument().createElement( QStringLiteral(
"properties" ) );
2795 ddp.
writeXml( propertiesElem, defs );
2796 diagramSettingsElem.appendChild( propertiesElem );
2799 delete mDiagramLayerSettings;
2801 mDiagramLayerSettings->
readXml( diagramSettingsElem );
2807 styleChangedSignalBlocker.release();
2819 QDomElement layerElement = node.toElement();
2822 ( void )
writeStyle( node, doc, errorMessage, context, categories );
2825 mGeometryOptions->writeXml( node );
2830 if ( !legendElement.isNull() )
2831 node.appendChild( legendElement );
2838 QDomElement referencedLayersElement = doc.createElement( QStringLiteral(
"referencedLayers" ) );
2839 node.appendChild( referencedLayersElement );
2844 switch ( rel.type() )
2855 QDomElement referencingLayersElement = doc.createElement( QStringLiteral(
"referencingLayers" ) );
2856 node.appendChild( referencedLayersElement );
2859 for (
const QgsRelation &rel : referencedRelations )
2861 switch ( rel.type() )
2873 if ( categories.testFlag(
Fields ) || categories.testFlag(
Forms ) )
2875 QDomElement fieldConfigurationElement;
2877 fieldConfigurationElement = doc.createElement( QStringLiteral(
"fieldConfiguration" ) );
2878 node.appendChild( fieldConfigurationElement );
2880 for (
const QgsField &field : std::as_const( mFields ) )
2882 QDomElement fieldElement = doc.createElement( QStringLiteral(
"field" ) );
2883 fieldElement.setAttribute( QStringLiteral(
"name" ), field.name() );
2884 fieldConfigurationElement.appendChild( fieldElement );
2886 if ( categories.testFlag(
Fields ) )
2888 fieldElement.setAttribute( QStringLiteral(
"configurationFlags" ),
qgsFlagValueToKeys( field.configurationFlags() ) );
2891 if ( categories.testFlag(
Forms ) )
2896 QDomElement editWidgetElement = doc.createElement( QStringLiteral(
"editWidget" ) );
2897 fieldElement.appendChild( editWidgetElement );
2898 editWidgetElement.setAttribute( QStringLiteral(
"type" ), field.editorWidgetSetup().type() );
2899 QDomElement editWidgetConfigElement = doc.createElement( QStringLiteral(
"config" ) );
2902 editWidgetElement.appendChild( editWidgetConfigElement );
2908 if ( categories.testFlag(
Fields ) )
2911 QDomElement aliasElem = doc.createElement( QStringLiteral(
"aliases" ) );
2912 for (
const QgsField &field : std::as_const( mFields ) )
2914 QDomElement aliasEntryElem = doc.createElement( QStringLiteral(
"alias" ) );
2915 aliasEntryElem.setAttribute( QStringLiteral(
"field" ), field.name() );
2916 aliasEntryElem.setAttribute( QStringLiteral(
"index" ), mFields.
indexFromName( field.name() ) );
2917 aliasEntryElem.setAttribute( QStringLiteral(
"name" ), field.alias() );
2918 aliasElem.appendChild( aliasEntryElem );
2920 node.appendChild( aliasElem );
2924 QDomElement splitPoliciesElement = doc.createElement( QStringLiteral(
"splitPolicies" ) );
2925 for (
const QgsField &field : std::as_const( mFields ) )
2927 QDomElement splitPolicyElem = doc.createElement( QStringLiteral(
"policy" ) );
2928 splitPolicyElem.setAttribute( QStringLiteral(
"field" ), field.name() );
2929 splitPolicyElem.setAttribute( QStringLiteral(
"policy" ),
qgsEnumValueToKey( field.splitPolicy() ) );
2930 splitPoliciesElement.appendChild( splitPolicyElem );
2932 node.appendChild( splitPoliciesElement );
2936 QDomElement defaultsElem = doc.createElement( QStringLiteral(
"defaults" ) );
2937 for (
const QgsField &field : std::as_const( mFields ) )
2939 QDomElement defaultElem = doc.createElement( QStringLiteral(
"default" ) );
2940 defaultElem.setAttribute( QStringLiteral(
"field" ), field.name() );
2941 defaultElem.setAttribute( QStringLiteral(
"expression" ), field.defaultValueDefinition().expression() );
2942 defaultElem.setAttribute( QStringLiteral(
"applyOnUpdate" ), field.defaultValueDefinition().applyOnUpdate() ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
2943 defaultsElem.appendChild( defaultElem );
2945 node.appendChild( defaultsElem );
2948 QDomElement constraintsElem = doc.createElement( QStringLiteral(
"constraints" ) );
2949 for (
const QgsField &field : std::as_const( mFields ) )
2951 QDomElement constraintElem = doc.createElement( QStringLiteral(
"constraint" ) );
2952 constraintElem.setAttribute( QStringLiteral(
"field" ), field.name() );
2953 constraintElem.setAttribute( QStringLiteral(
"constraints" ), field.constraints().constraints() );
2957 constraintsElem.appendChild( constraintElem );
2959 node.appendChild( constraintsElem );
2962 QDomElement constraintExpressionsElem = doc.createElement( QStringLiteral(
"constraintExpressions" ) );
2963 for (
const QgsField &field : std::as_const( mFields ) )
2965 QDomElement constraintExpressionElem = doc.createElement( QStringLiteral(
"constraint" ) );
2966 constraintExpressionElem.setAttribute( QStringLiteral(
"field" ), field.name() );
2967 constraintExpressionElem.setAttribute( QStringLiteral(
"exp" ), field.constraints().constraintExpression() );
2968 constraintExpressionElem.setAttribute( QStringLiteral(
"desc" ), field.constraints().constraintDescription() );
2969 constraintExpressionsElem.appendChild( constraintExpressionElem );
2971 node.appendChild( constraintExpressionsElem );
2974 if ( !mExpressionFieldBuffer )
2982 mExpressionFieldBuffer->
writeXml( node, doc );
2987 if ( categories.testFlag(
Actions ) )
2992 mAttributeTableConfig.
writeXml( node );
2993 mConditionalStyles->
writeXml( node, doc, context );
2994 mStoredExpressionManager->
writeXml( node );
2997 if ( categories.testFlag(
Forms ) )
2998 mEditFormConfig.
writeXml( node, context );
3002 node.toElement().setAttribute( QStringLiteral(
"readOnly" ), mReadOnly );
3007 QDomElement prevExpElem = doc.createElement( QStringLiteral(
"previewExpression" ) );
3008 QDomText prevExpText = doc.createTextNode( mDisplayExpression );
3009 prevExpElem.appendChild( prevExpText );
3010 node.appendChild( prevExpElem );
3014 if ( categories.testFlag(
MapTips ) )
3016 QDomElement mapTipElem = doc.createElement( QStringLiteral(
"mapTip" ) );
3017 mapTipElem.setAttribute( QStringLiteral(
"enabled" ),
mapTipsEnabled() );
3018 QDomText mapTipText = doc.createTextNode( mMapTipTemplate );
3019 mapTipElem.appendChild( mapTipText );
3020 node.toElement().appendChild( mapTipElem );
3031 QDomElement mapLayerNode = node.toElement();
3044 QDomElement rendererElement = mRenderer->
save( doc, context );
3045 node.appendChild( rendererElement );
3047 if ( mSelectionProperties )
3049 mSelectionProperties->
writeXml( mapLayerNode, doc, context );
3053 if ( categories.testFlag(
Labeling ) )
3057 QDomElement labelingElement = mLabeling->
save( doc, context );
3058 node.appendChild( labelingElement );
3060 mapLayerNode.setAttribute( QStringLiteral(
"labelsEnabled" ), mLabelsEnabled ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
3066 mapLayerNode.setAttribute( QStringLiteral(
"simplifyDrawingHints" ), QString::number( mSimplifyMethod.
simplifyHints() ) );
3067 mapLayerNode.setAttribute( QStringLiteral(
"simplifyAlgorithm" ), QString::number( mSimplifyMethod.
simplifyAlgorithm() ) );
3068 mapLayerNode.setAttribute( QStringLiteral(
"simplifyDrawingTol" ), QString::number( mSimplifyMethod.
threshold() ) );
3069 mapLayerNode.setAttribute( QStringLiteral(
"simplifyLocal" ), mSimplifyMethod.
forceLocalOptimization() ? 1 : 0 );
3070 mapLayerNode.setAttribute( QStringLiteral(
"simplifyMaxScale" ), QString::number( mSimplifyMethod.
maximumScale() ) );
3082 QDomElement blendModeElem = doc.createElement( QStringLiteral(
"blendMode" ) );
3084 blendModeElem.appendChild( blendModeText );
3085 node.appendChild( blendModeElem );
3088 QDomElement featureBlendModeElem = doc.createElement( QStringLiteral(
"featureBlendMode" ) );
3090 featureBlendModeElem.appendChild( featureBlendModeText );
3091 node.appendChild( featureBlendModeElem );
3097 QDomElement layerOpacityElem = doc.createElement( QStringLiteral(
"layerOpacity" ) );
3098 QDomText layerOpacityText = doc.createTextNode( QString::number(
opacity() ) );
3099 layerOpacityElem.appendChild( layerOpacityText );
3100 node.appendChild( layerOpacityElem );
3101 mapLayerNode.setAttribute( QStringLiteral(
"hasScaleBasedVisibilityFlag" ),
hasScaleBasedVisibility() ? 1 : 0 );
3102 mapLayerNode.setAttribute( QStringLiteral(
"maxScale" ),
maximumScale() );
3103 mapLayerNode.setAttribute( QStringLiteral(
"minScale" ),
minimumScale() );
3105 mapLayerNode.setAttribute( QStringLiteral(
"symbologyReferenceScale" ), mRenderer ? mRenderer->
referenceScale() : -1 );
3108 if ( categories.testFlag(
Diagrams ) && mDiagramRenderer )
3110 mDiagramRenderer->
writeXml( mapLayerNode, doc, context );
3111 if ( mDiagramLayerSettings )
3112 mDiagramLayerSettings->
writeXml( mapLayerNode, doc );
3123 QDomElement nameElem = node.firstChildElement( QStringLiteral(
"Name" ) );
3124 if ( nameElem.isNull() )
3126 errorMessage = QStringLiteral(
"Warning: Name element not found within NamedLayer while it's required." );
3142 readSldLabeling( node );
3144 styleChangedSignalBlocker.release();
3154 Q_UNUSED( errorMessage )
3156 QVariantMap localProps = QVariantMap( props );
3165 QDomElement nameNode = doc.createElement( QStringLiteral(
"se:Name" ) );
3166 nameNode.appendChild( doc.createTextNode(
name() ) );
3167 node.appendChild( nameNode );
3169 QDomElement userStyleElem = doc.createElement( QStringLiteral(
"UserStyle" ) );
3170 node.appendChild( userStyleElem );
3172 QDomElement nameElem = doc.createElement( QStringLiteral(
"se:Name" ) );
3173 nameElem.appendChild( doc.createTextNode(
name() ) );
3175 userStyleElem.appendChild( nameElem );
3177 QDomElement featureTypeStyleElem = doc.createElement( QStringLiteral(
"se:FeatureTypeStyle" ) );
3178 userStyleElem.appendChild( featureTypeStyleElem );
3180 mRenderer->
toSld( doc, featureTypeStyleElem, localProps );
3183 mLabeling->
toSld( featureTypeStyleElem, localProps );
3194 if ( !mEditBuffer || !mDataProvider )
3199 if ( mGeometryOptions->isActive() )
3200 mGeometryOptions->apply( geom );
3209 if ( !skipDefaultValue && !mDefaultValueOnUpdateFields.isEmpty() )
3210 updateDefaultValues( fid );
3220 bool result =
false;
3222 switch (
fields().fieldOrigin( field ) )
3234 if ( mEditBuffer && mDataProvider )
3243 if ( result && !skipDefaultValues && !mDefaultValueOnUpdateFields.isEmpty() )
3244 updateDefaultValues( fid );
3261 for (
auto it = newValues.constBegin(); it != newValues.constEnd(); ++it )
3263 const int field = it.key();
3264 const QVariant newValue = it.value();
3267 if ( oldValues.contains( field ) )
3268 oldValue = oldValues[field];
3273 newValuesJoin[field] = newValue;
3274 oldValuesJoin[field] = oldValue;
3281 newValuesNotJoin[field] = newValue;
3282 oldValuesNotJoin[field] = oldValue;
3291 if ( ! newValuesJoin.isEmpty() && mJoinBuffer )
3296 if ( ! newValuesNotJoin.isEmpty() )
3298 if ( mEditBuffer && mDataProvider )
3304 if ( result && !skipDefaultValues && !mDefaultValueOnUpdateFields.isEmpty() )
3306 updateDefaultValues( fid );
3316 if ( !mEditBuffer || !mDataProvider )
3326 if ( attIndex < 0 || attIndex >=
fields().count() )
3330 mFields[ attIndex ].setAlias( QString() );
3331 if ( mAttributeAliasMap.contains(
name ) )
3333 mAttributeAliasMap.remove(
name );
3335 mEditFormConfig.setFields( mFields );
3344 if ( index < 0 || index >=
fields().count() )
3351 if ( mExpressionFieldBuffer )
3367 if ( !mEditBuffer || !mDataProvider )
3385 if ( attIndex < 0 || attIndex >=
fields().count() )
3390 mAttributeAliasMap.insert(
name, aliasString );
3391 mFields[ attIndex ].setAlias( aliasString );
3392 mEditFormConfig.setFields( mFields );
3400 if ( index < 0 || index >=
fields().count() )
3410 if ( index >= 0 && index < mFields.
count() )
3420 return mAttributeAliasMap;
3427 if ( index < 0 || index >=
fields().count() )
3432 mAttributeSplitPolicy.insert(
name, policy );
3433 mFields[ index ].setSplitPolicy( policy );
3434 mEditFormConfig.setFields( mFields );
3442 QSet<QString> excludeList;
3443 QMap< QString, Qgis::FieldConfigurationFlags >::const_iterator flagsIt = mFieldConfigurationFlags.constBegin();
3444 for ( ; flagsIt != mFieldConfigurationFlags.constEnd(); ++flagsIt )
3448 excludeList << flagsIt.key();
3458 QMap< QString, Qgis::FieldConfigurationFlags >::iterator flagsIt = mFieldConfigurationFlags.begin();
3459 for ( ; flagsIt != mFieldConfigurationFlags.end(); ++flagsIt )
3470 QSet<QString> excludeList;
3471 QMap< QString, Qgis::FieldConfigurationFlags >::const_iterator flagsIt = mFieldConfigurationFlags.constBegin();
3472 for ( ; flagsIt != mFieldConfigurationFlags.constEnd(); ++flagsIt )
3476 excludeList << flagsIt.key();
3486 QMap< QString, Qgis::FieldConfigurationFlags >::iterator flagsIt = mFieldConfigurationFlags.begin();
3487 for ( ; flagsIt != mFieldConfigurationFlags.end(); ++flagsIt )
3498 if ( index < 0 || index >=
fields().count() )
3507 if ( !mEditBuffer || !mDataProvider )
3517 bool deleted =
false;
3520 QList<int> attrList = qgis::setToList( qgis::listToSet( attrs ) );
3522 std::sort( attrList.begin(), attrList.end(), std::greater<int>() );
3524 for (
int attr : std::as_const( attrList ) )
3542 if ( context && context->
cascade )
3545 const bool hasRelationsOrJoins = !relations.empty() || mJoinBuffer->
containsJoins();
3546 if ( hasRelationsOrJoins )
3551 if ( handledFeatureIds.contains( fid ) )
3559 handledFeatureIds << fid;
3571 switch ( relation.strength() )
3579 while ( relatedFeaturesIt.
nextFeature( childFeature ) )
3581 childFeatureIds.insert( childFeature.
id() );
3583 if ( childFeatureIds.count() > 0 )
3585 relation.referencingLayer()->startEditing();
3586 relation.referencingLayer()->deleteFeatures( childFeatureIds, context );
3613 bool res = deleteFeatureCascade( fid, context );
3633 res = deleteFeatureCascade( fid, context ) && res;
3642 mSelectedFeatureIds.subtract( fids );
3662 if ( !mDataProvider )
3663 return pkAttributesList;
3666 for (
int i = 0; i < mFields.
count(); ++i )
3670 pkAttributesList << i;
3673 return pkAttributesList;
3680 if ( !mDataProvider )
3693 if ( mEditBuffer && !deletedFeatures.empty() )
3695 if ( addedFeatures.size() > deletedFeatures.size() )
3701 if ( ( !mEditBuffer || addedFeatures.empty() ) && mDataProvider && mDataProvider->
empty() )
3714 mCommitErrors.clear();
3716 if ( !mDataProvider )
3718 mCommitErrors << tr(
"ERROR: no provider" );
3724 mCommitErrors << tr(
"ERROR: layer not editable" );
3730 if ( !mAllowCommit )
3733 mCommitChangesActive =
true;
3735 bool success =
false;
3741 mCommitChangesActive =
false;
3743 if ( !mDeletedFids.empty() )
3746 mDeletedFids.clear();
3787 return mCommitErrors;
3802 if ( !mDataProvider )
3804 mCommitErrors << tr(
"ERROR: no provider" );
3830 mEditBuffer =
nullptr;
3835 if ( rollbackExtent )
3848 return mSelectedFeatureIds.size();
3856 return mSelectedFeatureIds;
3864 features.reserve( mSelectedFeatureIds.count() );
3871 features.push_back( f );
3881 if ( mSelectedFeatureIds.isEmpty() )
3887 if ( mSelectedFeatureIds.count() == 1 )
3888 request.
setFilterFid( *mSelectedFeatureIds.constBegin() );
3899 if ( !mEditBuffer || !mDataProvider )
3902 if ( mGeometryOptions->isActive() )
3904 for (
auto feature = features.begin(); feature != features.end(); ++feature )
3907 mGeometryOptions->apply( geom );
3934 if ( exp.isField() )
3957 if ( !mDisplayExpression.isEmpty() || mFields.
isEmpty() )
3959 return mDisplayExpression;
3964 if ( !candidateName.isEmpty() )
3987 return ( mEditBuffer && mDataProvider );
3999bool QgsVectorLayer::isReadOnly()
const
4003 return mDataSourceReadOnly || mReadOnly;
4011 if ( readonly && mEditBuffer )
4015 if ( !readonly && mDataSourceReadOnly )
4018 mReadOnly = readonly;
4027 if ( ! mDataProvider )
4030 if ( mDataSourceReadOnly )
4041 return mEditBuffer && mEditBuffer->
isModified();
4048 bool auxiliaryField =
false;
4052 return auxiliaryField;
4059 auxiliaryField =
true;
4062 return auxiliaryField;
4075 if ( r != mRenderer )
4079 mSymbolFeatureCounted =
false;
4080 mSymbolFeatureCountMap.clear();
4081 mSymbolFeatureIdMap.clear();
4086 if ( refreshRate <= 0 )
4088 mRefreshRendererTimer->stop();
4089 mRefreshRendererTimer->setInterval( 0 );
4093 mRefreshRendererTimer->setInterval( 1000 / refreshRate );
4094 mRefreshRendererTimer->start();
4109 mRendererGenerators << generator;
4117 for (
int i = mRendererGenerators.count() - 1; i >= 0; --i )
4119 if ( mRendererGenerators.at( i )->id() ==
id )
4121 delete mRendererGenerators.at( i );
4122 mRendererGenerators.removeAt( i );
4132 QList< const QgsFeatureRendererGenerator * > res;
4142 if ( !mDataProvider )
4148 QString ignoredError;
4152 mEditCommandActive =
true;
4160 if ( !mDataProvider )
4165 mEditCommandActive =
false;
4166 if ( !mDeletedFids.isEmpty() )
4170 mSelectedFeatureIds.subtract( mDeletedFids );
4173 mDeletedFids.clear();
4182 if ( !mDataProvider )
4193 std::unique_ptr< QUndoCommand > command = std::make_unique< QUndoCommand >();
4194 command->setObsolete(
true );
4197 mEditCommandActive =
false;
4198 mDeletedFids.clear();
4206 return mJoinBuffer->
addJoin( joinInfo );
4213 return mJoinBuffer->
removeJoin( joinLayerId );
4254 if ( oi < 0 || oi >= mExpressionFieldBuffer->
expressions().size() )
4257 return mExpressionFieldBuffer->
expressions().at( oi ).cachedExpression.expression();
4273 if ( !mDataProvider )
4278 mFields = mDataProvider->
fields();
4288 if ( mExpressionFieldBuffer )
4292 for (
auto aliasIt = mAttributeAliasMap.constBegin(); aliasIt != mAttributeAliasMap.constEnd(); ++aliasIt )
4298 mFields[ index ].setAlias( aliasIt.value() );
4301 for (
auto splitPolicyIt = mAttributeSplitPolicy.constBegin(); splitPolicyIt != mAttributeSplitPolicy.constEnd(); ++splitPolicyIt )
4303 int index = mFields.
lookupField( splitPolicyIt.key() );
4307 mFields[ index ].setSplitPolicy( splitPolicyIt.value() );
4311 QMap< QString, Qgis::FieldConfigurationFlags >::const_iterator flagsIt = mFieldConfigurationFlags.constBegin();
4312 for ( ; flagsIt != mFieldConfigurationFlags.constEnd(); ++flagsIt )
4318 mFields[index].setConfigurationFlags( flagsIt.value() );
4322 mDefaultValueOnUpdateFields.clear();
4323 QMap< QString, QgsDefaultValue >::const_iterator defaultIt = mDefaultExpressionMap.constBegin();
4324 for ( ; defaultIt != mDefaultExpressionMap.constEnd(); ++defaultIt )
4326 int index = mFields.
lookupField( defaultIt.key() );
4330 mFields[ index ].setDefaultValueDefinition( defaultIt.value() );
4331 if ( defaultIt.value().applyOnUpdate() )
4332 mDefaultValueOnUpdateFields.insert( index );
4335 QMap< QString, QgsFieldConstraints::Constraints >::const_iterator constraintIt = mFieldConstraints.constBegin();
4336 for ( ; constraintIt != mFieldConstraints.constEnd(); ++constraintIt )
4338 int index = mFields.
lookupField( constraintIt.key() );
4351 mFields[ index ].setConstraints( constraints );
4354 QMap< QString, QPair< QString, QString > >::const_iterator constraintExpIt = mFieldConstraintExpressions.constBegin();
4355 for ( ; constraintExpIt != mFieldConstraintExpressions.constEnd(); ++constraintExpIt )
4357 int index = mFields.
lookupField( constraintExpIt.key() );
4368 mFields[ index ].setConstraints( constraints );
4372 for ( ; constraintStrengthIt != mFieldConstraintStrength.constEnd(); ++constraintStrengthIt )
4374 int index = mFields.
lookupField( constraintStrengthIt.key().first );
4384 constraints.
setConstraintStrength( constraintStrengthIt.key().second, constraintStrengthIt.value() );
4385 mFields[ index ].setConstraints( constraints );
4388 auto fieldWidgetIterator = mFieldWidgetSetups.constBegin();
4389 for ( ; fieldWidgetIterator != mFieldWidgetSetups.constEnd(); ++ fieldWidgetIterator )
4391 int index = mFields.
indexOf( fieldWidgetIterator.key() );
4395 mFields[index].setEditorWidgetSetup( fieldWidgetIterator.value() );
4398 if ( oldFields != mFields )
4401 mEditFormConfig.setFields( mFields );
4410 if ( index < 0 || index >= mFields.
count() || !mDataProvider )
4414 if ( expression.isEmpty() )
4418 std::unique_ptr< QgsExpressionContext > tempContext;
4423 evalContext = tempContext.get();
4458 if ( index < 0 || index >= mFields.
count() )
4463 mDefaultExpressionMap.insert( mFields.
at( index ).
name(), definition );
4467 mDefaultExpressionMap.remove( mFields.
at( index ).
name() );
4476 if ( index < 0 || index >= mFields.
count() )
4487 if ( !mDataProvider )
4502 if ( mEditBuffer && ! mDataProvider->
transaction() )
4506 for (
const QVariant &v : constUniqueValues )
4508 vals << v.toString();
4512 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
4513 while ( addedIt.hasNext() && ( limit < 0 ||
uniqueValues.count() < limit ) )
4516 QVariant v = addedIt.value().attribute( index );
4519 QString vs = v.toString();
4520 if ( !vals.contains( vs ) )
4529 while ( it.hasNext() && ( limit < 0 ||
uniqueValues.count() < limit ) )
4532 QVariant v = it.value().value( index );
4535 QString vs = v.toString();
4536 if ( !vals.contains( vs ) )
4569 .setSubsetOfAttributes( attList ) );
4572 QVariant currentValue;
4573 QHash<QString, QVariant> val;
4577 val.insert( currentValue.toString(), currentValue );
4578 if ( limit >= 0 && val.size() >= limit )
4584 return qgis::listToSet( val.values() );
4588 Q_ASSERT_X(
false,
"QgsVectorLayer::uniqueValues()",
"Unknown source of the field!" );
4596 QStringList results;
4597 if ( !mDataProvider )
4612 if ( mEditBuffer && ! mDataProvider->
transaction() )
4615 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
4616 while ( addedIt.hasNext() && ( limit < 0 || results.count() < limit ) && ( !feedback || !feedback->
isCanceled() ) )
4619 QVariant v = addedIt.value().attribute( index );
4622 QString vs = v.toString();
4623 if ( vs.contains( substring, Qt::CaseInsensitive ) && !results.contains( vs ) )
4631 while ( it.hasNext() && ( limit < 0 || results.count() < limit ) && ( !feedback || !feedback->
isCanceled() ) )
4634 QVariant v = it.value().value( index );
4637 QString vs = v.toString();
4638 if ( vs.contains( substring, Qt::CaseInsensitive ) && !results.contains( vs ) )
4669 QString fieldName = mFields.
at( index ).
name();
4670 request.
setFilterExpression( QStringLiteral(
"\"%1\" ILIKE '%%2%'" ).arg( fieldName, substring ) );
4674 QString currentValue;
4677 currentValue = f.
attribute( index ).toString();
4678 if ( !results.contains( currentValue ) )
4679 results << currentValue;
4681 if ( ( limit >= 0 && results.size() >= limit ) || ( feedback && feedback->
isCanceled() ) )
4691 Q_ASSERT_X(
false,
"QgsVectorLayer::uniqueStringsMatching()",
"Unknown source of the field!" );
4700 minimumOrMaximumValue( index, &minimum,
nullptr );
4709 minimumOrMaximumValue( index,
nullptr, &maximum );
4717 minimumOrMaximumValue( index, &minimum, &maximum );
4720void QgsVectorLayer::minimumOrMaximumValue(
int index, QVariant *minimum, QVariant *maximum )
const
4725 *minimum = QVariant();
4727 *maximum = QVariant();
4729 if ( !mDataProvider )
4749 if ( mEditBuffer && ! mDataProvider->
transaction() )
4752 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
4753 while ( addedIt.hasNext() )
4756 const QVariant v = addedIt.value().attribute( index );
4764 while ( it.hasNext() )
4767 const QVariant v = it.value().value( index );
4803 .setSubsetOfAttributes( attList ) );
4806 bool firstValue =
true;
4809 const QVariant currentValue = f.
attribute( index );
4816 *minimum = currentValue;
4818 *maximum = currentValue;
4823 if ( minimum && currentValue.isValid() &&
qgsVariantLessThan( currentValue, *minimum ) )
4824 *minimum = currentValue;
4826 *maximum = currentValue;
4833 Q_ASSERT_X(
false,
"QgsVectorLayer::minimumOrMaximumValue()",
"Unknown source of the field!" );
4836void QgsVectorLayer::createEditBuffer()
4872void QgsVectorLayer::clearEditBuffer()
4877 mEditBuffer =
nullptr;
4892 if ( !mDataProvider )
4895 *
error = tr(
"Layer is invalid" );
4901 if ( attrIndex >= 0 )
4908 bool providerOk =
false;
4909 QVariant val = mDataProvider->
aggregate(
aggregate, attrIndex, parameters, context, providerOk, fids );
4923 c.setFidsFilter( *fids );
4924 c.setParameters( parameters );
4925 bool aggregateOk =
false;
4926 const QVariant result =
c.calculate(
aggregate, fieldOrExpression, context, &aggregateOk, feedback );
4929 if ( !aggregateOk &&
error )
4952 return mFeatureBlendMode;
4955void QgsVectorLayer::readSldLabeling(
const QDomNode &node )
4962 QDomElement element = node.toElement();
4963 if ( element.isNull() )
4966 QDomElement userStyleElem = element.firstChildElement( QStringLiteral(
"UserStyle" ) );
4967 if ( userStyleElem.isNull() )
4969 QgsDebugMsgLevel( QStringLiteral(
"Info: UserStyle element not found." ), 4 );
4973 QDomElement featTypeStyleElem = userStyleElem.firstChildElement( QStringLiteral(
"FeatureTypeStyle" ) );
4974 if ( featTypeStyleElem.isNull() )
4976 QgsDebugMsgLevel( QStringLiteral(
"Info: FeatureTypeStyle element not found." ), 4 );
4981 QDomElement mergedFeatTypeStyle = featTypeStyleElem.cloneNode(
false ).toElement();
4986 bool needRuleBasedLabeling =
false;
4989 while ( !featTypeStyleElem.isNull() )
4991 QDomElement ruleElem = featTypeStyleElem.firstChildElement( QStringLiteral(
"Rule" ) );
4992 while ( !ruleElem.isNull() )
4996 bool hasTextSymbolizer =
false;
4997 bool hasRuleBased =
false;
4998 QDomElement ruleChildElem = ruleElem.firstChildElement();
4999 while ( !ruleChildElem.isNull() )
5002 if ( ruleChildElem.localName() == QLatin1String(
"Filter" ) ||
5003 ruleChildElem.localName() == QLatin1String(
"MinScaleDenominator" ) ||
5004 ruleChildElem.localName() == QLatin1String(
"MaxScaleDenominator" ) )
5006 hasRuleBased =
true;
5009 else if ( ruleChildElem.localName() == QLatin1String(
"TextSymbolizer" ) )
5011 QgsDebugMsgLevel( QStringLiteral(
"Info: TextSymbolizer element found" ), 4 );
5012 hasTextSymbolizer =
true;
5015 ruleChildElem = ruleChildElem.nextSiblingElement();
5018 if ( hasTextSymbolizer )
5023 mergedFeatTypeStyle.appendChild( ruleElem.cloneNode().toElement() );
5027 QgsDebugMsgLevel( QStringLiteral(
"Info: Filter or Min/MaxScaleDenominator element found: need a RuleBasedLabeling" ), 4 );
5028 needRuleBasedLabeling =
true;
5033 if ( ruleCount > 1 )
5035 QgsDebugMsgLevel( QStringLiteral(
"Info: More Rule elements found: need a RuleBasedLabeling" ), 4 );
5036 needRuleBasedLabeling =
true;
5040 if ( ruleCount == 0 )
5042 needRuleBasedLabeling =
false;
5045 ruleElem = ruleElem.nextSiblingElement( QStringLiteral(
"Rule" ) );
5047 featTypeStyleElem = featTypeStyleElem.nextSiblingElement( QStringLiteral(
"FeatureTypeStyle" ) );
5050 if ( ruleCount == 0 )
5052 QgsDebugMsgLevel( QStringLiteral(
"Info: No TextSymbolizer element." ), 4 );
5056 QDomElement ruleElem = mergedFeatTypeStyle.firstChildElement( QStringLiteral(
"Rule" ) );
5058 if ( needRuleBasedLabeling )
5062 while ( !ruleElem.isNull() )
5065 QString label, description, filterExp;
5066 int scaleMinDenom = 0, scaleMaxDenom = 0;
5070 QDomElement childElem = ruleElem.firstChildElement();
5071 while ( !childElem.isNull() )
5073 if ( childElem.localName() == QLatin1String(
"Name" ) )
5077 if ( label.isEmpty() )
5078 label = childElem.firstChild().nodeValue();
5080 else if ( childElem.localName() == QLatin1String(
"Description" ) )
5083 QDomElement titleElem = childElem.firstChildElement( QStringLiteral(
"Title" ) );
5084 if ( !titleElem.isNull() )
5086 label = titleElem.firstChild().nodeValue();
5089 QDomElement abstractElem = childElem.firstChildElement( QStringLiteral(
"Abstract" ) );
5090 if ( !abstractElem.isNull() )
5092 description = abstractElem.firstChild().nodeValue();
5095 else if ( childElem.localName() == QLatin1String(
"Abstract" ) )
5098 description = childElem.firstChild().nodeValue();
5100 else if ( childElem.localName() == QLatin1String(
"Title" ) )
5103 label = childElem.firstChild().nodeValue();
5105 else if ( childElem.localName() == QLatin1String(
"Filter" ) )
5121 else if ( childElem.localName() == QLatin1String(
"MinScaleDenominator" ) )
5124 int v = childElem.firstChild().nodeValue().toInt( &ok );
5128 else if ( childElem.localName() == QLatin1String(
"MaxScaleDenominator" ) )
5131 int v = childElem.firstChild().nodeValue().toInt( &ok );
5135 else if ( childElem.localName() == QLatin1String(
"TextSymbolizer" ) )
5137 readSldTextSymbolizer( childElem, settings );
5140 childElem = childElem.nextSiblingElement();
5146 ruleElem = ruleElem.nextSiblingElement();
5156 QDomElement textSymbolizerElem = ruleElem.firstChildElement( QStringLiteral(
"TextSymbolizer" ) );
5158 if ( readSldTextSymbolizer( textSymbolizerElem, s ) )
5166bool QgsVectorLayer::readSldTextSymbolizer(
const QDomNode &node,
QgsPalLayerSettings &settings )
const
5170 if ( node.localName() != QLatin1String(
"TextSymbolizer" ) )
5172 QgsDebugMsgLevel( QStringLiteral(
"Not a TextSymbolizer element: %1" ).arg( node.localName() ), 3 );
5175 QDomElement textSymbolizerElem = node.toElement();
5177 QDomElement labelElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Label" ) );
5178 if ( !labelElem.isNull() )
5180 QDomElement propertyNameElem = labelElem.firstChildElement( QStringLiteral(
"PropertyName" ) );
5181 if ( !propertyNameElem.isNull() )
5186 QString labelAttribute = propertyNameElem.text();
5190 int fieldIndex = mFields.
lookupField( labelAttribute );
5191 if ( fieldIndex == -1 )
5207 QgsDebugMsgLevel( QStringLiteral(
"Info: PropertyName element not found." ), 4 );
5218 if ( textSymbolizerElem.hasAttribute( QStringLiteral(
"uom" ) ) )
5223 QString fontFamily = QStringLiteral(
"Sans-Serif" );
5224 int fontPointSize = 10;
5226 int fontWeight = -1;
5227 bool fontItalic =
false;
5228 bool fontUnderline =
false;
5231 QDomElement fontElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Font" ) );
5232 if ( !fontElem.isNull() )
5235 for ( QgsStringMap::iterator it = fontSvgParams.begin(); it != fontSvgParams.end(); ++it )
5237 QgsDebugMsgLevel( QStringLiteral(
"found fontSvgParams %1: %2" ).arg( it.key(), it.value() ), 4 );
5239 if ( it.key() == QLatin1String(
"font-family" ) )
5241 fontFamily = it.value();
5243 else if ( it.key() == QLatin1String(
"font-style" ) )
5245 fontItalic = ( it.value() == QLatin1String(
"italic" ) ) || ( it.value() == QLatin1String(
"Italic" ) );
5247 else if ( it.key() == QLatin1String(
"font-size" ) )
5250 int fontSize = it.value().toInt( &ok );
5253 fontPointSize = fontSize;
5254 fontUnitSize = sldUnitSize;
5257 else if ( it.key() == QLatin1String(
"font-weight" ) )
5259 if ( ( it.value() == QLatin1String(
"bold" ) ) || ( it.value() == QLatin1String(
"Bold" ) ) )
5260 fontWeight = QFont::Bold;
5262 else if ( it.key() == QLatin1String(
"font-underline" ) )
5264 fontUnderline = ( it.value() == QLatin1String(
"underline" ) ) || ( it.value() == QLatin1String(
"Underline" ) );
5270 QFont font( fontFamily, fontPointSize, fontWeight, fontItalic );
5271 font.setUnderline( fontUnderline );
5273 format.
setSize( fontPointSize );
5277 QDomElement fillElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Fill" ) );
5279 Qt::BrushStyle textBrush = Qt::SolidPattern;
5281 if ( textColor.isValid() )
5283 QgsDebugMsgLevel( QStringLiteral(
"Info: textColor %1." ).arg( QVariant( textColor ).toString() ), 4 );
5290 QDomElement haloElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Halo" ) );
5291 if ( !haloElem.isNull() )
5296 QDomElement radiusElem = haloElem.firstChildElement( QStringLiteral(
"Radius" ) );
5297 if ( !radiusElem.isNull() )
5300 double bufferSize = radiusElem.text().toDouble( &ok );
5303 bufferSettings.
setSize( bufferSize );
5308 QDomElement haloFillElem = haloElem.firstChildElement( QStringLiteral(
"Fill" ) );
5310 Qt::BrushStyle bufferBrush = Qt::SolidPattern;
5312 if ( bufferColor.isValid() )
5314 QgsDebugMsgLevel( QStringLiteral(
"Info: bufferColor %1." ).arg( QVariant( bufferColor ).toString() ), 4 );
5315 bufferSettings.
setColor( bufferColor );
5320 QDomElement labelPlacementElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"LabelPlacement" ) );
5321 if ( !labelPlacementElem.isNull() )
5324 QDomElement pointPlacementElem = labelPlacementElem.firstChildElement( QStringLiteral(
"PointPlacement" ) );
5325 if ( !pointPlacementElem.isNull() )
5333 QDomElement displacementElem = pointPlacementElem.firstChildElement( QStringLiteral(
"Displacement" ) );
5334 if ( !displacementElem.isNull() )
5336 QDomElement displacementXElem = displacementElem.firstChildElement( QStringLiteral(
"DisplacementX" ) );
5337 if ( !displacementXElem.isNull() )
5340 double xOffset = displacementXElem.text().toDouble( &ok );
5347 QDomElement displacementYElem = displacementElem.firstChildElement( QStringLiteral(
"DisplacementY" ) );
5348 if ( !displacementYElem.isNull() )
5351 double yOffset = displacementYElem.text().toDouble( &ok );
5359 QDomElement anchorPointElem = pointPlacementElem.firstChildElement( QStringLiteral(
"AnchorPoint" ) );
5360 if ( !anchorPointElem.isNull() )
5362 QDomElement anchorPointXElem = anchorPointElem.firstChildElement( QStringLiteral(
"AnchorPointX" ) );
5363 if ( !anchorPointXElem.isNull() )
5366 double xOffset = anchorPointXElem.text().toDouble( &ok );
5373 QDomElement anchorPointYElem = anchorPointElem.firstChildElement( QStringLiteral(
"AnchorPointY" ) );
5374 if ( !anchorPointYElem.isNull() )
5377 double yOffset = anchorPointYElem.text().toDouble( &ok );
5386 QDomElement rotationElem = pointPlacementElem.firstChildElement( QStringLiteral(
"Rotation" ) );
5387 if ( !rotationElem.isNull() )
5390 double rotation = rotationElem.text().toDouble( &ok );
5400 QDomElement linePlacementElem = labelPlacementElem.firstChildElement( QStringLiteral(
"LinePlacement" ) );
5401 if ( !linePlacementElem.isNull() )
5410 QDomElement vendorOptionElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"VendorOption" ) );
5411 while ( !vendorOptionElem.isNull() && vendorOptionElem.localName() == QLatin1String(
"VendorOption" ) )
5413 QString optionName = vendorOptionElem.attribute( QStringLiteral(
"name" ) );
5414 QString optionValue;
5415 if ( vendorOptionElem.firstChild().nodeType() == QDomNode::TextNode )
5417 optionValue = vendorOptionElem.firstChild().nodeValue();
5421 if ( vendorOptionElem.firstChild().nodeType() == QDomNode::ElementNode &&
5422 vendorOptionElem.firstChild().localName() == QLatin1String(
"Literal" ) )
5425 optionValue = vendorOptionElem.firstChild().firstChild().nodeValue();
5429 QgsDebugError( QStringLiteral(
"unexpected child of %1 named %2" ).arg( vendorOptionElem.localName(), optionName ) );
5433 if ( !optionName.isEmpty() && !optionValue.isEmpty() )
5435 vendorOptions[ optionName ] = optionValue;
5438 vendorOptionElem = vendorOptionElem.nextSiblingElement();
5440 if ( !vendorOptions.isEmpty() )
5442 for ( QgsStringMap::iterator it = vendorOptions.begin(); it != vendorOptions.end(); ++it )
5444 if ( it.key() == QLatin1String(
"underlineText" ) && it.value() == QLatin1String(
"true" ) )
5446 font.setUnderline(
true );
5449 else if ( it.key() == QLatin1String(
"strikethroughText" ) && it.value() == QLatin1String(
"true" ) )
5451 font.setStrikeOut(
true );
5454 else if ( it.key() == QLatin1String(
"maxDisplacement" ) )
5458 else if ( it.key() == QLatin1String(
"followLine" ) && it.value() == QLatin1String(
"true" ) )
5469 else if ( it.key() == QLatin1String(
"maxAngleDelta" ) )
5472 double angle = it.value().toDouble( &ok );
5480 else if ( it.key() == QLatin1String(
"conflictResolution" ) && it.value() == QLatin1String(
"false" ) )
5484 else if ( it.key() == QLatin1String(
"forceLeftToRight" ) && it.value() == QLatin1String(
"false" ) )
5488 else if ( it.key() == QLatin1String(
"group" ) && it.value() == QLatin1String(
"yes" ) )
5492 else if ( it.key() == QLatin1String(
"labelAllGroup" ) && it.value() == QLatin1String(
"true" ) )
5508 return mEditFormConfig;
5519 mEditFormConfig.onRelationsLoaded();
5529 if ( config.isEmpty() )
5565 if ( !mDiagramLayerSettings )
5567 *mDiagramLayerSettings = s;
5575 QString myMetadata = QStringLiteral(
"<html><head></head>\n<body>\n" );
5580 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Information from provider" ) + QStringLiteral(
"</h1>\n<hr>\n" );
5581 myMetadata += QLatin1String(
"<table class=\"list-view\">\n" );
5586 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Storage" ) + QStringLiteral(
"</td><td>" ) +
storageType() + QStringLiteral(
"</td></tr>\n" );
5592 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Comment" ) + QStringLiteral(
"</td><td>" ) +
dataComment() + QStringLiteral(
"</td></tr>\n" );
5599 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Encoding" ) + QStringLiteral(
"</td><td>" ) + provider->
encoding() + QStringLiteral(
"</td></tr>\n" );
5614 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Geometry" ) + QStringLiteral(
"</td><td>" ) + typeString + QStringLiteral(
"</td></tr>\n" );
5618 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Extent" ) + QStringLiteral(
"</td><td>" ) +
extent().
toString() + QStringLiteral(
"</td></tr>\n" );
5622 QLocale locale = QLocale();
5623 locale.setNumberOptions( locale.numberOptions() &= ~QLocale::NumberOption::OmitGroupSeparator );
5624 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" )
5625 + tr(
"Feature count" ) + QStringLiteral(
"</td><td>" )
5627 + QStringLiteral(
"</td></tr>\n" );
5630 myMetadata += QLatin1String(
"</table>\n<br><br>" );
5639 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Identification" ) + QStringLiteral(
"</h1>\n<hr>\n" );
5640 myMetadata += htmlFormatter.identificationSectionHtml( );
5641 myMetadata += QLatin1String(
"<br><br>\n" );
5644 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Extent" ) + QStringLiteral(
"</h1>\n<hr>\n" );
5645 myMetadata += htmlFormatter.extentSectionHtml(
isSpatial() );
5646 myMetadata += QLatin1String(
"<br><br>\n" );