30 #include <QPainterPath> 32 #include <QProgressDialog> 36 #include <QStringBuilder> 38 #include <QUndoCommand> 101 #ifdef TESTPROVIDERLIB 107 const QString &qmlStyle,
108 const QString &sldStyle,
109 const QString &styleName,
110 const QString &styleDescription,
111 const QString &uiFileContent,
125 QStringList &descriptions,
143 const QString &baseName,
144 const QString &providerKey,
147 , mAuxiliaryLayer( nullptr )
148 , mAuxiliaryLayerKey( QString() )
149 , mReadExtentFromXml( options.readExtentFromXml )
157 mGeometryOptions = qgis::make_unique<QgsGeometryOptions>();
162 mJoinBuffer->setParent(
this );
167 if ( !vectorLayerPath.isEmpty() && !
mProviderKey.isEmpty() )
182 mSimplifyMethod.
setThreshold( settings.
value( QStringLiteral(
"qgis/simplifyDrawingTol" ), mSimplifyMethod.
threshold() ).toFloat() );
195 delete mDataProvider;
198 delete mExpressionFieldBuffer;
200 delete mDiagramLayerSettings;
201 delete mDiagramRenderer;
206 delete mConditionalStyles;
208 if ( mFeatureCounter )
209 mFeatureCounter->
cancel();
222 QList<QgsVectorLayerJoinInfo> joins =
vectorJoins();
223 const auto constJoins = joins;
245 for (
const QgsAction &action : constActions )
281 auto constraintIt = constraints.constBegin();
282 for ( ; constraintIt != constraints.constEnd(); ++ constraintIt )
358 p.setPen( QColor( 50, 100, 120, 200 ) );
359 p.setBrush( QColor( 200, 200, 210, 120 ) );
360 p.drawEllipse( x - m, y - m, m * 2 + 1, m * 2 + 1 );
364 p.setPen( QColor( 255, 0, 0 ) );
365 p.drawLine( x - m, y + m, x + m, y - m );
366 p.drawLine( x - m, y - m, x + m, y + m );
372 mSelectedFeatureIds.insert( fid );
379 mSelectedFeatureIds.unite( featureIds );
386 mSelectedFeatureIds.remove( fid );
393 mSelectedFeatureIds.subtract( featureIds );
406 .setFilterRect( rect )
408 .setNoAttributes() );
413 newSelection << feat.
id();
442 newSelection << feat.
id();
464 bool matches = exp.
evaluate( &context ).toBool();
468 newSelection << feat.
id();
472 newSelection << feat.
id();
491 newSelection = mSelectedFeatureIds + ids;
495 newSelection = mSelectedFeatureIds - ids;
499 newSelection = mSelectedFeatureIds.intersect( ids );
503 QgsFeatureIds deselectedFeatures = mSelectedFeatureIds - newSelection;
504 mSelectedFeatureIds = newSelection;
512 if ( !intersectingIds.isEmpty() )
514 QgsDebugMsgLevel( QStringLiteral(
"Trying to select and deselect the same item at the same time. Unsure what to do. Selecting dubious items." ), 3 );
517 mSelectedFeatureIds -= deselectIds;
518 mSelectedFeatureIds += selectIds;
526 ids.subtract( mSelectedFeatureIds );
541 .setFilterRect( rect )
543 .setNoAttributes() );
551 if ( mSelectedFeatureIds.contains( fet.
id() ) )
553 deselectIds << fet.
id();
557 selectIds << fet.
id();
566 if ( mSelectedFeatureIds.isEmpty() )
574 return mDataProvider;
579 return mDataProvider;
584 if (
mValid && mDataProvider && mDataProvider->
encoding() != encoding )
593 delete mDiagramRenderer;
594 mDiagramRenderer = r;
623 .setFilterFids( mSelectedFeatureIds )
624 .setNoAttributes() );
637 .setNoAttributes() );
641 if ( mSelectedFeatureIds.contains( fet.
id() ) )
652 if ( retval.
width() == 0.0 || retval.
height() == 0.0 )
661 retval.
set( -1.0, -1.0, 1.0, 1.0 );
670 return mLabelsEnabled &&
static_cast< bool >( mLabeling );
675 mLabelsEnabled = enabled;
680 if ( !mDiagramRenderer || !mDiagramLayerSettings )
683 QList<QgsDiagramSettings> settingList = mDiagramRenderer->
diagramSettings();
684 if ( !settingList.isEmpty() )
686 return settingList.at( 0 ).enabled;
693 if ( !mSymbolFeatureCounted )
696 return mSymbolFeatureCountMap.value( legendKey );
703 if ( mSymbolFeatureCounted || mFeatureCounter )
704 return mFeatureCounter;
706 mSymbolFeatureCountMap.clear();
711 return mFeatureCounter;
713 if ( !mDataProvider )
716 return mFeatureCounter;
721 return mFeatureCounter;
724 if ( !mFeatureCounter )
733 return mFeatureCounter;
739 if ( force || !mReadExtentFromXml || ( mReadExtentFromXml && mXmlExtent.
isNull() ) )
740 mValidExtent =
false;
751 if ( !mDefaultValueOnUpdateFields.isEmpty() )
756 int size = mFields.
size();
757 for (
int idx : qgis::as_const( mDefaultValueOnUpdateFields ) )
759 if ( idx < 0 || idx >= size )
777 if ( !mValidExtent && mLazyExtent && mDataProvider && !mDataProvider->
hasMetadata() && mReadExtentFromXml && !mXmlExtent.
isNull() )
784 if ( !mValidExtent && mLazyExtent && mDataProvider && mDataProvider->
isValid() )
801 if ( !
mValid || !mDataProvider )
803 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider" ), 3 );
825 if ( it->hasGeometry() )
836 .setNoAttributes() );
871 if ( !
mValid || !mDataProvider )
873 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider" ), 3 );
881 if ( !
mValid || !mDataProvider || mEditBuffer )
883 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider or while editing" ), 3 );
910 double maximumSimplificationScale = mSimplifyMethod.
maximumScale();
913 return !( maximumSimplificationScale > 1 && renderContext.
rendererScale() <= maximumSimplificationScale );
920 return mConditionalStyles;
925 if ( !
mValid || !mDataProvider )
943 if ( !
mValid || !mEditBuffer || !mDataProvider )
947 if ( mGeometryOptions->isActive() )
950 mGeometryOptions->apply( geom );
954 bool success = mEditBuffer->
addFeature( feature );
969 if ( !mEditBuffer || !mDataProvider )
975 if ( currentFeature.
isValid() )
977 bool hasChanged =
false;
978 bool hasError =
false;
990 QgsDebugMsgLevel( QStringLiteral(
"geometry of feature %1 could not be changed." ).arg( updatedFeature.
id() ), 3 );
997 for (
int attr = 0; attr < fa.count(); ++attr )
999 if ( fa.at( attr ) != ca.at( attr ) )
1007 QgsDebugMsgLevel( QStringLiteral(
"attribute %1 of feature %2 could not be changed." ).arg( attr ).arg( updatedFeature.
id() ), 3 );
1012 if ( hasChanged && !mDefaultValueOnUpdateFields.isEmpty() && !skipDefaultValues )
1013 updateDefaultValues( updatedFeature.
id(), updatedFeature );
1019 QgsDebugMsgLevel( QStringLiteral(
"feature %1 could not be retrieved" ).arg( updatedFeature.
id() ), 3 );
1027 if ( !
mValid || !mEditBuffer || !mDataProvider )
1031 bool result = utils.
insertVertex( x, y, atFeatureId, beforeVertex );
1040 if ( !
mValid || !mEditBuffer || !mDataProvider )
1044 bool result = utils.
insertVertex( point, atFeatureId, beforeVertex );
1053 if ( !
mValid || !mEditBuffer || !mDataProvider )
1057 bool result = utils.
moveVertex( x, y, atFeatureId, atVertex );
1066 if ( !
mValid || !mEditBuffer || !mDataProvider )
1070 bool result = utils.
moveVertex( p, atFeatureId, atVertex );
1079 if ( !
mValid || !mEditBuffer || !mDataProvider )
1104 int count = mSelectedFeatureIds.size();
1118 *deletedCount = deleted;
1121 return deleted == count;
1126 if ( !
mValid || !mEditBuffer || !mDataProvider )
1127 return QgsGeometry::OperationResult::LayerNotEditable;
1133 if ( !mSelectedFeatureIds.isEmpty() )
1135 result = utils.
addRing( ring, mSelectedFeatureIds, featureId );
1138 if ( result != QgsGeometry::OperationResult::Success )
1149 if ( !
mValid || !mEditBuffer || !mDataProvider )
1152 return QgsGeometry::OperationResult::LayerNotEditable;
1157 return QgsGeometry::OperationResult::InvalidInputGeometryType;
1163 return QgsGeometry::OperationResult::AddRingNotClosed;
1170 if ( !mSelectedFeatureIds.isEmpty() )
1172 result = utils.
addRing( static_cast< QgsCurve * >( ring->
clone() ), mSelectedFeatureIds, featureId );
1175 if ( result != QgsGeometry::OperationResult::Success )
1187 if ( !
mValid || !mEditBuffer || !mDataProvider )
1188 return QgsGeometry::OperationResult::LayerNotEditable;
1192 if ( mSelectedFeatureIds.empty() )
1194 QgsDebugMsgLevel( QStringLiteral(
"Number of selected features < 1" ), 3 );
1195 return QgsGeometry::OperationResult::SelectionIsEmpty;
1197 else if ( mSelectedFeatureIds.size() > 1 )
1199 QgsDebugMsgLevel( QStringLiteral(
"Number of selected features > 1" ), 3 );
1200 return QgsGeometry::OperationResult::SelectionIsGreaterThanOne;
1206 if ( result == QgsGeometry::OperationResult::Success )
1213 if ( !
mValid || !mEditBuffer || !mDataProvider )
1214 return QgsGeometry::OperationResult::LayerNotEditable;
1218 if ( mSelectedFeatureIds.empty() )
1221 return QgsGeometry::OperationResult::SelectionIsEmpty;
1223 else if ( mSelectedFeatureIds.size() > 1 )
1226 return QgsGeometry::OperationResult::SelectionIsGreaterThanOne;
1232 if ( result == QgsGeometry::OperationResult::Success )
1239 if ( !
mValid || !mEditBuffer || !mDataProvider )
1240 return QgsGeometry::OperationResult::LayerNotEditable;
1244 if ( mSelectedFeatureIds.empty() )
1247 return QgsGeometry::OperationResult::SelectionIsEmpty;
1249 else if ( mSelectedFeatureIds.size() > 1 )
1252 return QgsGeometry::OperationResult::SelectionIsGreaterThanOne;
1258 if ( result == QgsGeometry::OperationResult::Success )
1265 if ( !
mValid || !mEditBuffer || !mDataProvider )
1266 return QgsGeometry::OperationResult::LayerNotEditable;
1271 if ( result == QgsGeometry::OperationResult::Success )
1278 if ( !
mValid || !mEditBuffer || !mDataProvider )
1279 return QgsGeometry::OperationResult::LayerNotEditable;
1282 return utils.
splitParts( splitLine, topologicalEditing );
1287 if ( !
mValid || !mEditBuffer || !mDataProvider )
1288 return QgsGeometry::OperationResult::LayerNotEditable;
1291 return utils.
splitFeatures( splitLine, topologicalEditing );
1296 if ( !
mValid || !mEditBuffer || !mDataProvider )
1305 if ( !
mValid || !mEditBuffer || !mDataProvider )
1314 if ( mLabeling == labeling )
1323 if ( !
mValid || !mDataProvider )
1385 if ( mDataProvider )
1394 QDomNode pkeyNode = layer_node.namedItem( QStringLiteral(
"provider" ) );
1396 if ( pkeyNode.isNull() )
1402 QDomElement pkeyElt = pkeyNode.toElement();
1412 else if (
mDataSource.contains( QLatin1String(
"dbname=" ) ) )
1425 const QDomElement elem = layer_node.toElement();
1428 if ( elem.hasAttribute( QStringLiteral(
"wkbType" ) ) )
1429 mWkbType =
qgsEnumKeyToValue( elem.attribute( QStringLiteral(
"wkbType" ) ), mWkbType );
1432 QDomElement pkeyElem = pkeyNode.toElement();
1433 if ( !pkeyElem.isNull() )
1435 QString encodingString = pkeyElem.attribute( QStringLiteral(
"encoding" ) );
1436 if ( mDataProvider && !encodingString.isEmpty() )
1443 mJoinBuffer->
readXml( layer_node );
1455 QDomNode depsNode = layer_node.namedItem( QStringLiteral(
"dataDependencies" ) );
1456 QDomNodeList depsNodes = depsNode.childNodes();
1457 QSet<QgsMapLayerDependency> sources;
1458 for (
int i = 0; i < depsNodes.count(); i++ )
1460 QString
source = depsNodes.at( i ).toElement().attribute( QStringLiteral(
"id" ) );
1466 QDomElement legendElem = layer_node.firstChildElement( QStringLiteral(
"legend" ) );
1467 if ( !legendElem.isNull() )
1468 legend->
readXml( legendElem, context );
1472 if ( mReadExtentFromXml )
1474 QDomNode extentNode = layer_node.namedItem( QStringLiteral(
"extent" ) );
1475 if ( !extentNode.isNull() )
1482 const QDomNode asNode = layer_node.namedItem( QStringLiteral(
"auxiliaryLayer" ) );
1483 const QDomElement asElem = asNode.toElement();
1484 if ( !asElem.isNull() )
1486 mAuxiliaryLayerKey = asElem.attribute( QStringLiteral(
"key" ) );
1497 setDataSource( dataSource, baseName, provider, options, loadDefaultStyleFlag );
1506 setDataProvider( provider, options );
1520 bool defaultLoadedFlag =
false;
1525 std::unique_ptr< QgsFeatureRenderer > defaultRenderer( mDataProvider->
createRenderer() );
1526 if ( defaultRenderer )
1528 defaultLoadedFlag =
true;
1535 if ( !defaultLoadedFlag && loadDefaultStyleFlag )
1541 if ( !defaultLoadedFlag &&
isSpatial() )
1551 std::unique_ptr< QgsAbstractVectorLayerLabeling > defaultLabeling( mDataProvider->
createLabeling() );
1552 if ( defaultLabeling )
1569 std::unique_ptr< QgsFeatureRenderer > defaultRenderer( mDataProvider->
createRenderer() );
1570 if ( defaultRenderer )
1585 delete mDataProvider;
1592 if ( provider.compare( QLatin1String(
"postgres" ) ) == 0 )
1594 const QString checkUnicityKey { QStringLiteral(
"checkPrimaryKeyUnicity" ) };
1596 if ( ! uri.
hasParam( checkUnicityKey ) )
1598 uri.
setParam( checkUnicityKey, mReadExtentFromXml ?
"0" :
"1" );
1604 if ( !mDataProvider )
1611 mDataProvider->setParent(
this );
1614 QgsDebugMsgLevel( QStringLiteral(
"Instantiated the data provider plugin" ), 2 );
1626 QgsDebugMsgLevel( QStringLiteral(
"Set Data provider QgsLayerMetadata identifier[%1]" ).arg(
metadata().identifier() ), 4 );
1633 mWkbType = mDataProvider->
wkbType();
1642 QRegExp reg( R
"lit("[^"]+"\."([^"] + )"( \([^)]+\))?)lit" ); 1643 if ( reg.indexIn(
name() ) >= 0 )
1645 QStringList stuff = reg.capturedTexts();
1646 QString lName = stuff[1];
1650 QMap<QString, QgsMapLayer *>::const_iterator it;
1651 for ( it = layers.constBegin(); it != layers.constEnd() && ( *it )->name() != lName; ++it )
1654 if ( it != layers.constEnd() && stuff.size() > 2 )
1656 lName +=
'.' + stuff[2].mid( 2, stuff[2].length() - 3 );
1659 if ( !lName.isEmpty() )
1669 else if ( provider == QLatin1String(
"ogr" ) )
1673 if (
mDataSource.right( 10 ) == QLatin1String(
"|layerid=0" ) )
1676 else if ( provider == QStringLiteral(
"memory" ) )
1693 QDomDocument &document,
1698 QDomElement mapLayerNode = layer_node.toElement();
1700 if ( mapLayerNode.isNull() || (
"maplayer" != mapLayerNode.nodeName() ) )
1706 mapLayerNode.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"vector" ) );
1713 if ( mDataProvider )
1715 QDomElement provider = document.createElement( QStringLiteral(
"provider" ) );
1716 provider.setAttribute( QStringLiteral(
"encoding" ), mDataProvider->
encoding() );
1717 QDomText providerText = document.createTextNode(
providerType() );
1718 provider.appendChild( providerText );
1719 layer_node.appendChild( provider );
1723 mJoinBuffer->
writeXml( layer_node, document );
1726 QDomElement dependenciesElement = document.createElement( QStringLiteral(
"layerDependencies" ) );
1732 QDomElement depElem = document.createElement( QStringLiteral(
"layer" ) );
1733 depElem.setAttribute( QStringLiteral(
"id" ), dep.layerId() );
1734 dependenciesElement.appendChild( depElem );
1736 layer_node.appendChild( dependenciesElement );
1739 QDomElement dataDependenciesElement = document.createElement( QStringLiteral(
"dataDependencies" ) );
1744 QDomElement depElem = document.createElement( QStringLiteral(
"layer" ) );
1745 depElem.setAttribute( QStringLiteral(
"id" ), dep.layerId() );
1746 dataDependenciesElement.appendChild( depElem );
1748 layer_node.appendChild( dataDependenciesElement );
1753 QDomElement legendElement =
legend()->
writeXml( document, context );
1754 if ( !legendElement.isNull() )
1755 layer_node.appendChild( legendElement );
1759 mExpressionFieldBuffer->
writeXml( layer_node, document );
1764 QDomElement asElem = document.createElement( QStringLiteral(
"auxiliaryLayer" ) );
1765 if ( mAuxiliaryLayer )
1767 const QString pkField = mAuxiliaryLayer->joinInfo().targetFieldName();
1768 asElem.setAttribute( QStringLiteral(
"key" ), pkField );
1770 layer_node.appendChild( asElem );
1774 return writeSymbology( layer_node, document, errorMsg, context );
1779 QString src( source );
1791 QStringList theURIParts = src.split(
'|' );
1793 src = theURIParts.join( QStringLiteral(
"|" ) );
1797 QStringList theURIParts = src.split(
'?' );
1799 src = theURIParts.join( QStringLiteral(
"?" ) );
1801 else if (
providerType() == QLatin1String(
"delimitedtext" ) )
1803 QUrl urlSource = QUrl::fromEncoded( src.toLatin1() );
1805 urlDest.setQueryItems( urlSource.queryItems() );
1806 src = QString::fromLatin1( urlDest.toEncoded() );
1808 else if (
providerType() == QLatin1String(
"memory" ) )
1823 QString src( source );
1825 if ( provider == QLatin1String(
"spatialite" ) )
1831 else if ( provider == QLatin1String(
"ogr" ) )
1833 QStringList theURIParts = src.split(
'|' );
1835 src = theURIParts.join( QStringLiteral(
"|" ) );
1837 else if ( provider == QLatin1String(
"gpx" ) )
1839 QStringList theURIParts = src.split(
'?' );
1841 src = theURIParts.join( QStringLiteral(
"?" ) );
1843 else if ( provider == QLatin1String(
"delimitedtext" ) )
1845 QUrl urlSource = QUrl::fromEncoded( src.toLatin1() );
1847 if ( !src.startsWith( QLatin1String(
"file:" ) ) )
1849 QUrl file = QUrl::fromLocalFile( src.left( src.indexOf(
'?' ) ) );
1850 urlSource.setScheme( QStringLiteral(
"file" ) );
1851 urlSource.setPath( file.path() );
1854 QUrl urlDest = QUrl::fromLocalFile( context.
pathResolver().
readPath( urlSource.toLocalFile() ) );
1855 urlDest.setQueryItems( urlSource.queryItems() );
1856 src = QString::fromLatin1( urlDest.toEncoded() );
1880 if ( categories.testFlag(
Fields ) )
1882 if ( !mExpressionFieldBuffer )
1884 mExpressionFieldBuffer->
readXml( layerNode );
1889 QDomElement layerElement = layerNode.toElement();
1893 readStyle( layerNode, errorMessage, context, categories );
1895 if ( categories.testFlag(
MapTips ) )
1896 mMapTipTemplate = layerNode.namedItem( QStringLiteral(
"mapTip" ) ).toElement().text();
1899 mDisplayExpression = layerNode.namedItem( QStringLiteral(
"previewExpression" ) ).toElement().text();
1902 QString
displayField = layerNode.namedItem( QStringLiteral(
"displayfield" ) ).toElement().text();
1906 if ( mMapTipTemplate.isEmpty() && categories.testFlag(
MapTips ) )
1907 mMapTipTemplate = displayField;
1916 if ( categories.testFlag(
Actions ) )
1917 mActions->
readXml( layerNode );
1919 if ( categories.testFlag(
Fields ) )
1921 mAttributeAliasMap.clear();
1922 QDomNode aliasesNode = layerNode.namedItem( QStringLiteral(
"aliases" ) );
1923 if ( !aliasesNode.isNull() )
1925 QDomElement aliasElem;
1927 QDomNodeList aliasNodeList = aliasesNode.toElement().elementsByTagName( QStringLiteral(
"alias" ) );
1928 for (
int i = 0; i < aliasNodeList.size(); ++i )
1930 aliasElem = aliasNodeList.at( i ).toElement();
1933 if ( aliasElem.hasAttribute( QStringLiteral(
"field" ) ) )
1935 field = aliasElem.attribute( QStringLiteral(
"field" ) );
1939 int index = aliasElem.attribute( QStringLiteral(
"index" ) ).toInt();
1941 if ( index >= 0 && index <
fields().count() )
1947 if ( !aliasElem.attribute( QStringLiteral(
"name" ) ).isEmpty() )
1950 alias = context.
projectTranslator()->
translate( QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ), aliasElem.attribute( QStringLiteral(
"name" ) ) );
1951 QgsDebugMsgLevel(
"context" + QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ) +
" source " + aliasElem.attribute( QStringLiteral(
"name" ) ), 3 );
1956 alias = context.
projectTranslator()->
translate( QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ), field );
1957 QgsDebugMsgLevel(
"context" + QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ) +
" source " + field, 3 );
1959 if ( alias == aliasElem.attribute( QStringLiteral(
"field" ) ) )
1963 QgsDebugMsgLevel(
"field " + field +
" origalias " + aliasElem.attribute( QStringLiteral(
"name" ) ) +
" trans " + alias, 3 );
1964 mAttributeAliasMap.insert( field, alias );
1969 mDefaultExpressionMap.clear();
1970 QDomNode defaultsNode = layerNode.namedItem( QStringLiteral(
"defaults" ) );
1971 if ( !defaultsNode.isNull() )
1973 QDomNodeList defaultNodeList = defaultsNode.toElement().elementsByTagName( QStringLiteral(
"default" ) );
1974 for (
int i = 0; i < defaultNodeList.size(); ++i )
1976 QDomElement defaultElem = defaultNodeList.at( i ).toElement();
1978 QString field = defaultElem.attribute( QStringLiteral(
"field" ), QString() );
1979 QString expression = defaultElem.attribute( QStringLiteral(
"expression" ), QString() );
1980 bool applyOnUpdate = defaultElem.attribute( QStringLiteral(
"applyOnUpdate" ), QStringLiteral(
"0" ) ) == QLatin1String(
"1" );
1981 if ( field.isEmpty() || expression.isEmpty() )
1984 mDefaultExpressionMap.insert( field,
QgsDefaultValue( expression, applyOnUpdate ) );
1989 mFieldConstraints.clear();
1990 mFieldConstraintStrength.clear();
1991 QDomNode constraintsNode = layerNode.namedItem( QStringLiteral(
"constraints" ) );
1992 if ( !constraintsNode.isNull() )
1994 QDomNodeList constraintNodeList = constraintsNode.toElement().elementsByTagName( QStringLiteral(
"constraint" ) );
1995 for (
int i = 0; i < constraintNodeList.size(); ++i )
1997 QDomElement constraintElem = constraintNodeList.at( i ).toElement();
1999 QString field = constraintElem.attribute( QStringLiteral(
"field" ), QString() );
2000 int constraints = constraintElem.attribute( QStringLiteral(
"constraints" ), QStringLiteral(
"0" ) ).toInt();
2001 if ( field.isEmpty() || constraints == 0 )
2004 mFieldConstraints.insert( field, static_cast< QgsFieldConstraints::Constraints >( constraints ) );
2006 int uniqueStrength = constraintElem.attribute( QStringLiteral(
"unique_strength" ), QStringLiteral(
"1" ) ).toInt();
2007 int notNullStrength = constraintElem.attribute( QStringLiteral(
"notnull_strength" ), QStringLiteral(
"1" ) ).toInt();
2008 int expStrength = constraintElem.attribute( QStringLiteral(
"exp_strength" ), QStringLiteral(
"1" ) ).toInt();
2015 mFieldConstraintExpressions.clear();
2016 QDomNode constraintExpressionsNode = layerNode.namedItem( QStringLiteral(
"constraintExpressions" ) );
2017 if ( !constraintExpressionsNode.isNull() )
2019 QDomNodeList constraintNodeList = constraintExpressionsNode.toElement().elementsByTagName( QStringLiteral(
"constraint" ) );
2020 for (
int i = 0; i < constraintNodeList.size(); ++i )
2022 QDomElement constraintElem = constraintNodeList.at( i ).toElement();
2024 QString field = constraintElem.attribute( QStringLiteral(
"field" ), QString() );
2025 QString exp = constraintElem.attribute( QStringLiteral(
"exp" ), QString() );
2026 QString desc = constraintElem.attribute( QStringLiteral(
"desc" ), QString() );
2027 if ( field.isEmpty() || exp.isEmpty() )
2030 mFieldConstraintExpressions.insert( field, qMakePair( exp, desc ) );
2037 mExcludeAttributesWMS.clear();
2038 QDomNode excludeWMSNode = layerNode.namedItem( QStringLiteral(
"excludeAttributesWMS" ) );
2039 if ( !excludeWMSNode.isNull() )
2041 QDomNodeList attributeNodeList = excludeWMSNode.toElement().elementsByTagName( QStringLiteral(
"attribute" ) );
2042 for (
int i = 0; i < attributeNodeList.size(); ++i )
2044 mExcludeAttributesWMS.insert( attributeNodeList.at( i ).toElement().text() );
2048 mExcludeAttributesWFS.clear();
2049 QDomNode excludeWFSNode = layerNode.namedItem( QStringLiteral(
"excludeAttributesWFS" ) );
2050 if ( !excludeWFSNode.isNull() )
2052 QDomNodeList attributeNodeList = excludeWFSNode.toElement().elementsByTagName( QStringLiteral(
"attribute" ) );
2053 for (
int i = 0; i < attributeNodeList.size(); ++i )
2055 mExcludeAttributesWFS.insert( attributeNodeList.at( i ).toElement().text() );
2060 QDomElement widgetsElem = layerNode.namedItem( QStringLiteral(
"fieldConfiguration" ) ).toElement();
2061 QDomNodeList fieldConfigurationElementList = widgetsElem.elementsByTagName( QStringLiteral(
"field" ) );
2062 for (
int i = 0; i < fieldConfigurationElementList.size(); ++i )
2064 const QDomElement fieldConfigElement = fieldConfigurationElementList.at( i ).toElement();
2065 const QDomElement fieldWidgetElement = fieldConfigElement.elementsByTagName( QStringLiteral(
"editWidget" ) ).at( 0 ).toElement();
2067 QString fieldName = fieldConfigElement.attribute( QStringLiteral(
"name" ) );
2069 const QString widgetType = fieldWidgetElement.attribute( QStringLiteral(
"type" ) );
2070 const QDomElement cfgElem = fieldConfigElement.elementsByTagName( QStringLiteral(
"config" ) ).at( 0 ).toElement();
2071 const QDomElement optionsElem = cfgElem.childNodes().at( 0 ).toElement();
2073 if ( widgetType == QStringLiteral(
"ValueRelation" ) )
2075 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() );
2078 mFieldWidgetSetups[fieldName] = setup;
2083 mGeometryOptions->readXml( layerNode.namedItem( QStringLiteral(
"geometryOptions" ) ) );
2085 if ( categories.testFlag(
Forms ) )
2086 mEditFormConfig.
readXml( layerNode, context );
2090 mAttributeTableConfig.
readXml( layerNode );
2091 mConditionalStyles->
readXml( layerNode, context );
2097 QDomElement mapLayerNode = layerNode.toElement();
2099 && mapLayerNode.attribute( QStringLiteral(
"readOnly" ), QStringLiteral(
"0" ) ).toInt() == 1 )
2119 if ( !rendererElement.isNull() )
2139 if ( categories.testFlag(
Labeling ) )
2141 QDomElement labelingElement = node.firstChildElement( QStringLiteral(
"labeling" ) );
2143 if ( labelingElement.isNull() ||
2144 ( labelingElement.attribute( QStringLiteral(
"type" ) ) == QLatin1String(
"simple" ) && labelingElement.firstChildElement( QStringLiteral(
"settings" ) ).isNull() ) )
2152 labeling = readLabelingFromCustomProperties();
2160 if ( node.toElement().hasAttribute( QStringLiteral(
"labelsEnabled" ) ) )
2161 mLabelsEnabled = node.toElement().attribute( QStringLiteral(
"labelsEnabled" ) ).toInt();
2163 mLabelsEnabled =
true;
2169 QDomNode blendModeNode = node.namedItem( QStringLiteral(
"blendMode" ) );
2170 if ( !blendModeNode.isNull() )
2172 QDomElement e = blendModeNode.toElement();
2177 QDomNode featureBlendModeNode = node.namedItem( QStringLiteral(
"featureBlendMode" ) );
2178 if ( !featureBlendModeNode.isNull() )
2180 QDomElement e = featureBlendModeNode.toElement();
2188 QDomNode layerTransparencyNode = node.namedItem( QStringLiteral(
"layerTransparency" ) );
2189 if ( !layerTransparencyNode.isNull() )
2191 QDomElement e = layerTransparencyNode.toElement();
2192 setOpacity( 1.0 - e.text().toInt() / 100.0 );
2194 QDomNode layerOpacityNode = node.namedItem( QStringLiteral(
"layerOpacity" ) );
2195 if ( !layerOpacityNode.isNull() )
2197 QDomElement e = layerOpacityNode.toElement();
2204 QDomElement e = node.toElement();
2207 mSimplifyMethod.
setSimplifyHints( static_cast< QgsVectorSimplifyMethod::SimplifyHints >( e.attribute( QStringLiteral(
"simplifyDrawingHints" ), QStringLiteral(
"1" ) ).toInt() ) );
2208 mSimplifyMethod.
setSimplifyAlgorithm( static_cast< QgsVectorSimplifyMethod::SimplifyAlgorithm >( e.attribute( QStringLiteral(
"simplifyAlgorithm" ), QStringLiteral(
"0" ) ).toInt() ) );
2209 mSimplifyMethod.
setThreshold( e.attribute( QStringLiteral(
"simplifyDrawingTol" ), QStringLiteral(
"1" ) ).toFloat() );
2210 mSimplifyMethod.
setForceLocalOptimization( e.attribute( QStringLiteral(
"simplifyLocal" ), QStringLiteral(
"1" ) ).toInt() );
2211 mSimplifyMethod.
setMaximumScale( e.attribute( QStringLiteral(
"simplifyMaxScale" ), QStringLiteral(
"1" ) ).toFloat() );
2215 if ( categories.testFlag(
Diagrams ) )
2217 delete mDiagramRenderer;
2218 mDiagramRenderer =
nullptr;
2219 QDomElement singleCatDiagramElem = node.firstChildElement( QStringLiteral(
"SingleCategoryDiagramRenderer" ) );
2220 if ( !singleCatDiagramElem.isNull() )
2223 mDiagramRenderer->
readXml( singleCatDiagramElem, context );
2225 QDomElement linearDiagramElem = node.firstChildElement( QStringLiteral(
"LinearlyInterpolatedDiagramRenderer" ) );
2226 if ( !linearDiagramElem.isNull() )
2228 if ( linearDiagramElem.hasAttribute( QStringLiteral(
"classificationAttribute" ) ) )
2231 int idx = linearDiagramElem.attribute( QStringLiteral(
"classificationAttribute" ) ).toInt();
2232 if ( idx >= 0 && idx < mFields.
count() )
2233 linearDiagramElem.setAttribute( QStringLiteral(
"classificationField" ), mFields.
at( idx ).
name() );
2237 mDiagramRenderer->
readXml( linearDiagramElem, context );
2240 if ( mDiagramRenderer )
2242 QDomElement diagramSettingsElem = node.firstChildElement( QStringLiteral(
"DiagramLayerSettings" ) );
2243 if ( !diagramSettingsElem.isNull() )
2245 bool oldXPos = diagramSettingsElem.hasAttribute( QStringLiteral(
"xPosColumn" ) );
2246 bool oldYPos = diagramSettingsElem.hasAttribute( QStringLiteral(
"yPosColumn" ) );
2247 bool oldShow = diagramSettingsElem.hasAttribute( QStringLiteral(
"showColumn" ) );
2248 if ( oldXPos || oldYPos || oldShow )
2254 int xPosColumn = diagramSettingsElem.attribute( QStringLiteral(
"xPosColumn" ) ).toInt();
2255 if ( xPosColumn >= 0 && xPosColumn < mFields.
count() )
2260 int yPosColumn = diagramSettingsElem.attribute( QStringLiteral(
"yPosColumn" ) ).toInt();
2261 if ( yPosColumn >= 0 && yPosColumn < mFields.
count() )
2266 int showColumn = diagramSettingsElem.attribute( QStringLiteral(
"showColumn" ) ).toInt();
2267 if ( showColumn >= 0 && showColumn < mFields.
count() )
2270 QDomElement propertiesElem = diagramSettingsElem.ownerDocument().createElement( QStringLiteral(
"properties" ) );
2277 ddp.
writeXml( propertiesElem, defs );
2278 diagramSettingsElem.appendChild( propertiesElem );
2281 delete mDiagramLayerSettings;
2283 mDiagramLayerSettings->
readXml( diagramSettingsElem );
2296 QDomElement layerElement = node.toElement();
2299 ( void )
writeStyle( node, doc, errorMessage, context, categories );
2302 mGeometryOptions->writeXml( node );
2304 if ( categories.testFlag(
Fields ) )
2306 QDomElement fieldConfigurationElement = doc.createElement( QStringLiteral(
"fieldConfiguration" ) );
2307 node.appendChild( fieldConfigurationElement );
2310 for (
const QgsField &field : mFields )
2312 QDomElement fieldElement = doc.createElement( QStringLiteral(
"field" ) );
2313 fieldElement.setAttribute( QStringLiteral(
"name" ), field.name() );
2315 fieldConfigurationElement.appendChild( fieldElement );
2320 QDomElement editWidgetElement = doc.createElement( QStringLiteral(
"editWidget" ) );
2321 fieldElement.appendChild( editWidgetElement );
2322 editWidgetElement.setAttribute( QStringLiteral(
"type" ), field.editorWidgetSetup().type() );
2323 QDomElement editWidgetConfigElement = doc.createElement( QStringLiteral(
"config" ) );
2326 editWidgetElement.appendChild( editWidgetConfigElement );
2333 QDomElement aliasElem = doc.createElement( QStringLiteral(
"aliases" ) );
2334 for (
const QgsField &field : mFields )
2336 QDomElement aliasEntryElem = doc.createElement( QStringLiteral(
"alias" ) );
2337 aliasEntryElem.setAttribute( QStringLiteral(
"field" ), field.name() );
2338 aliasEntryElem.setAttribute( QStringLiteral(
"index" ), mFields.indexFromName( field.name() ) );
2339 aliasEntryElem.setAttribute( QStringLiteral(
"name" ), field.alias() );
2340 aliasElem.appendChild( aliasEntryElem );
2342 node.appendChild( aliasElem );
2345 QDomElement excludeWMSElem = doc.createElement( QStringLiteral(
"excludeAttributesWMS" ) );
2346 QSet<QString>::const_iterator attWMSIt = mExcludeAttributesWMS.constBegin();
2347 for ( ; attWMSIt != mExcludeAttributesWMS.constEnd(); ++attWMSIt )
2349 QDomElement attrElem = doc.createElement( QStringLiteral(
"attribute" ) );
2350 QDomText attrText = doc.createTextNode( *attWMSIt );
2351 attrElem.appendChild( attrText );
2352 excludeWMSElem.appendChild( attrElem );
2354 node.appendChild( excludeWMSElem );
2357 QDomElement excludeWFSElem = doc.createElement( QStringLiteral(
"excludeAttributesWFS" ) );
2358 QSet<QString>::const_iterator attWFSIt = mExcludeAttributesWFS.constBegin();
2359 for ( ; attWFSIt != mExcludeAttributesWFS.constEnd(); ++attWFSIt )
2361 QDomElement attrElem = doc.createElement( QStringLiteral(
"attribute" ) );
2362 QDomText attrText = doc.createTextNode( *attWFSIt );
2363 attrElem.appendChild( attrText );
2364 excludeWFSElem.appendChild( attrElem );
2366 node.appendChild( excludeWFSElem );
2369 QDomElement defaultsElem = doc.createElement( QStringLiteral(
"defaults" ) );
2370 for (
const QgsField &field : mFields )
2372 QDomElement defaultElem = doc.createElement( QStringLiteral(
"default" ) );
2373 defaultElem.setAttribute( QStringLiteral(
"field" ), field.name() );
2374 defaultElem.setAttribute( QStringLiteral(
"expression" ), field.defaultValueDefinition().expression() );
2375 defaultElem.setAttribute( QStringLiteral(
"applyOnUpdate" ), field.defaultValueDefinition().applyOnUpdate() ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
2376 defaultsElem.appendChild( defaultElem );
2378 node.appendChild( defaultsElem );
2381 QDomElement constraintsElem = doc.createElement( QStringLiteral(
"constraints" ) );
2382 for (
const QgsField &field : mFields )
2384 QDomElement constraintElem = doc.createElement( QStringLiteral(
"constraint" ) );
2385 constraintElem.setAttribute( QStringLiteral(
"field" ), field.name() );
2386 constraintElem.setAttribute( QStringLiteral(
"constraints" ), field.constraints().constraints() );
2390 constraintsElem.appendChild( constraintElem );
2392 node.appendChild( constraintsElem );
2395 QDomElement constraintExpressionsElem = doc.createElement( QStringLiteral(
"constraintExpressions" ) );
2396 for (
const QgsField &field : mFields )
2398 QDomElement constraintExpressionElem = doc.createElement( QStringLiteral(
"constraint" ) );
2399 constraintExpressionElem.setAttribute( QStringLiteral(
"field" ), field.name() );
2400 constraintExpressionElem.setAttribute( QStringLiteral(
"exp" ), field.constraints().constraintExpression() );
2401 constraintExpressionElem.setAttribute( QStringLiteral(
"desc" ), field.constraints().constraintDescription() );
2402 constraintExpressionsElem.appendChild( constraintExpressionElem );
2404 node.appendChild( constraintExpressionsElem );
2407 if ( !mExpressionFieldBuffer )
2415 mExpressionFieldBuffer->
writeXml( node, doc );
2420 if ( categories.testFlag(
Actions ) )
2425 mAttributeTableConfig.
writeXml( node );
2426 mConditionalStyles->
writeXml( node, doc, context );
2429 if ( categories.testFlag(
Forms ) )
2430 mEditFormConfig.
writeXml( node, context );
2434 node.toElement().setAttribute( QStringLiteral(
"readOnly" ), mReadOnly );
2439 QDomElement prevExpElem = doc.createElement( QStringLiteral(
"previewExpression" ) );
2440 QDomText prevExpText = doc.createTextNode( mDisplayExpression );
2441 prevExpElem.appendChild( prevExpText );
2442 node.appendChild( prevExpElem );
2446 if ( categories.testFlag(
MapTips ) )
2448 QDomElement mapTipElem = doc.createElement( QStringLiteral(
"mapTip" ) );
2449 QDomText mapTipText = doc.createTextNode( mMapTipTemplate );
2450 mapTipElem.appendChild( mapTipText );
2451 node.toElement().appendChild( mapTipElem );
2460 QDomElement mapLayerNode = node.toElement();
2470 QDomElement rendererElement = mRenderer->
save( doc, context );
2471 node.appendChild( rendererElement );
2475 if ( categories.testFlag(
Labeling ) )
2479 QDomElement labelingElement = mLabeling->
save( doc, context );
2480 node.appendChild( labelingElement );
2482 mapLayerNode.setAttribute( QStringLiteral(
"labelsEnabled" ), mLabelsEnabled ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
2488 mapLayerNode.setAttribute( QStringLiteral(
"simplifyDrawingHints" ), QString::number( mSimplifyMethod.
simplifyHints() ) );
2489 mapLayerNode.setAttribute( QStringLiteral(
"simplifyAlgorithm" ), QString::number( mSimplifyMethod.
simplifyAlgorithm() ) );
2490 mapLayerNode.setAttribute( QStringLiteral(
"simplifyDrawingTol" ), QString::number( mSimplifyMethod.
threshold() ) );
2491 mapLayerNode.setAttribute( QStringLiteral(
"simplifyLocal" ), mSimplifyMethod.
forceLocalOptimization() ? 1 : 0 );
2492 mapLayerNode.setAttribute( QStringLiteral(
"simplifyMaxScale" ), QString::number( mSimplifyMethod.
maximumScale() ) );
2504 QDomElement blendModeElem = doc.createElement( QStringLiteral(
"blendMode" ) );
2506 blendModeElem.appendChild( blendModeText );
2507 node.appendChild( blendModeElem );
2510 QDomElement featureBlendModeElem = doc.createElement( QStringLiteral(
"featureBlendMode" ) );
2512 featureBlendModeElem.appendChild( featureBlendModeText );
2513 node.appendChild( featureBlendModeElem );
2519 QDomElement layerOpacityElem = doc.createElement( QStringLiteral(
"layerOpacity" ) );
2520 QDomText layerOpacityText = doc.createTextNode( QString::number(
opacity() ) );
2521 layerOpacityElem.appendChild( layerOpacityText );
2522 node.appendChild( layerOpacityElem );
2525 if ( categories.testFlag(
Diagrams ) && mDiagramRenderer )
2527 mDiagramRenderer->
writeXml( mapLayerNode, doc, context );
2528 if ( mDiagramLayerSettings )
2529 mDiagramLayerSettings->
writeXml( mapLayerNode, doc );
2538 QDomElement nameElem = node.firstChildElement( QStringLiteral(
"Name" ) );
2539 if ( nameElem.isNull() )
2541 errorMessage = QStringLiteral(
"Warning: Name element not found within NamedLayer while it's required." );
2553 readSldLabeling( node );
2560 Q_UNUSED( errorMessage )
2571 QDomElement nameNode = doc.createElement( QStringLiteral(
"se:Name" ) );
2572 nameNode.appendChild( doc.createTextNode(
name() ) );
2573 node.appendChild( nameNode );
2575 QDomElement userStyleElem = doc.createElement( QStringLiteral(
"UserStyle" ) );
2576 node.appendChild( userStyleElem );
2578 QDomElement nameElem = doc.createElement( QStringLiteral(
"se:Name" ) );
2579 nameElem.appendChild( doc.createTextNode(
name() ) );
2581 userStyleElem.appendChild( nameElem );
2583 QDomElement featureTypeStyleElem = doc.createElement( QStringLiteral(
"se:FeatureTypeStyle" ) );
2584 userStyleElem.appendChild( featureTypeStyleElem );
2586 mRenderer->
toSld( doc, featureTypeStyleElem, localProps );
2589 mLabeling->
toSld( featureTypeStyleElem, localProps );
2598 if ( !mEditBuffer || !mDataProvider )
2603 if ( mGeometryOptions->isActive() )
2604 mGeometryOptions->apply( geom );
2613 if ( !skipDefaultValue && !mDefaultValueOnUpdateFields.isEmpty() )
2614 updateDefaultValues( fid );
2622 bool result =
false;
2624 switch (
fields().fieldOrigin( field ) )
2634 if ( mEditBuffer && mDataProvider )
2643 if ( result && !skipDefaultValues && !mDefaultValueOnUpdateFields.isEmpty() )
2644 updateDefaultValues( fid );
2659 for (
auto it = newValues.constBegin(); it != newValues.constEnd(); ++it )
2661 const int field = it.key();
2662 const QVariant newValue = it.value();
2665 if ( oldValues.contains( field ) )
2666 oldValue = oldValues[field];
2671 newValuesJoin[field] = newValue;
2672 oldValuesJoin[field] = oldValue;
2679 newValuesNotJoin[field] = newValue;
2680 oldValuesNotJoin[field] = oldValue;
2689 if ( ! newValuesJoin.isEmpty() && mJoinBuffer )
2694 if ( ! newValuesNotJoin.isEmpty() && mEditBuffer && mDataProvider )
2699 if ( result && !skipDefaultValues && !mDefaultValueOnUpdateFields.isEmpty() )
2701 updateDefaultValues( fid );
2709 if ( !mEditBuffer || !mDataProvider )
2717 if ( attIndex < 0 || attIndex >=
fields().count() )
2721 mFields[ attIndex ].setAlias( QString() );
2722 if ( mAttributeAliasMap.contains( name ) )
2724 mAttributeAliasMap.remove( name );
2726 mEditFormConfig.setFields( mFields );
2733 if ( index < 0 || index >=
fields().count() )
2740 if ( mExpressionFieldBuffer )
2756 if ( !mEditBuffer || !mDataProvider )
2772 if ( attIndex < 0 || attIndex >=
fields().count() )
2777 mAttributeAliasMap.insert( name, aliasString );
2778 mFields[ attIndex ].setAlias( aliasString );
2779 mEditFormConfig.setFields( mFields );
2785 if ( index < 0 || index >=
fields().count() )
2793 if ( index >= 0 && index < mFields.
count() )
2801 return mAttributeAliasMap;
2806 if ( index < 0 || index >=
fields().count() )
2815 if ( !mEditBuffer || !mDataProvider )
2823 bool deleted =
false;
2826 QList<int> attrList = attrs.toSet().toList();
2828 std::sort( attrList.begin(), attrList.end(), std::greater<int>() );
2830 for (
int attr : qgis::as_const( attrList ) )
2852 mSelectedFeatureIds.remove( fid );
2863 QgsDebugMsgLevel( QStringLiteral(
"Cannot delete features (mEditBuffer==NULL)" ), 1 );
2874 mSelectedFeatureIds.subtract( fids );
2891 for (
int i = 0; i < mFields.
count(); ++i )
2895 pkAttributesList << i;
2898 return pkAttributesList;
2903 if ( ! mDataProvider )
2914 if ( mEditBuffer && !deletedFeatures.empty() )
2916 if ( addedFeatures.size() > deletedFeatures.size() )
2917 return QgsFeatureSource::FeatureAvailability::FeaturesAvailable;
2919 return QgsFeatureSource::FeatureAvailability::FeaturesMaybeAvailable;
2922 if ( ( !mEditBuffer || addedFeatures.empty() ) && mDataProvider->
empty() )
2923 return QgsFeatureSource::FeatureAvailability::NoFeaturesAvailable;
2925 return QgsFeatureSource::FeatureAvailability::FeaturesAvailable;
2930 mCommitErrors.clear();
2932 if ( !mDataProvider )
2934 mCommitErrors << tr(
"ERROR: no provider" );
2940 mCommitErrors << tr(
"ERROR: layer not editable" );
2946 if ( !mAllowCommit )
2954 mEditBuffer =
nullptr;
2975 return mCommitErrors;
3007 mEditBuffer =
nullptr;
3012 if ( rollbackExtent )
3023 return mSelectedFeatureIds.size();
3028 return mSelectedFeatureIds;
3034 features.reserve( mSelectedFeatureIds.count() );
3037 if ( mSelectedFeatureIds.count() <= 8 )
3041 const auto constMSelectedFeatureIds = mSelectedFeatureIds;
3054 features.push_back( f );
3063 if ( mSelectedFeatureIds.isEmpty() )
3069 if ( mSelectedFeatureIds.count() == 1 )
3070 request.
setFilterFid( *mSelectedFeatureIds.constBegin() );
3079 if ( !mEditBuffer || !mDataProvider )
3082 if ( mGeometryOptions->isActive() )
3084 for (
auto feature = features.begin(); feature != features.end(); ++feature )
3087 mGeometryOptions->apply( geom );
3120 if ( mDisplayExpression == displayExpression )
3129 if ( !mDisplayExpression.isEmpty() || mFields.
isEmpty() )
3131 return mDisplayExpression;
3144 static QStringList sCandidates{ QStringLiteral(
"name" ),
3145 QStringLiteral(
"heibt" ),
3146 QStringLiteral(
"desc" ),
3147 QStringLiteral(
"nom" ),
3148 QStringLiteral(
"street" ),
3149 QStringLiteral(
"road" ),
3150 QStringLiteral(
"id" )};
3151 for (
const QString &candidate : sCandidates )
3153 for (
const QgsField &field : mFields )
3155 QString fldName = field.name();
3156 if ( fldName.indexOf( candidate, 0, Qt::CaseInsensitive ) > -1 )
3163 if ( !idxName.isEmpty() )
3167 if ( !idxName.isNull() )
3180 return ( mEditBuffer && mDataProvider );
3189 bool QgsVectorLayer::isReadOnly()
const 3197 if ( readonly && mEditBuffer )
3200 mReadOnly = readonly;
3208 return mEditBuffer && mEditBuffer->
isModified();
3213 bool auxiliaryField =
false;
3217 return auxiliaryField;
3224 auxiliaryField =
true;
3227 return auxiliaryField;
3235 if ( r != mRenderer )
3239 mSymbolFeatureCounted =
false;
3240 mSymbolFeatureCountMap.clear();
3249 if ( !mDataProvider )
3255 QString ignoredError;
3259 mEditCommandActive =
true;
3265 if ( !mDataProvider )
3270 mEditCommandActive =
false;
3271 if ( !mDeletedFids.isEmpty() )
3274 mDeletedFids.clear();
3281 if ( !mDataProvider )
3292 std::unique_ptr< QUndoCommand > command = qgis::make_unique< QUndoCommand >();
3293 command->setObsolete(
true );
3296 mEditCommandActive =
false;
3297 mDeletedFids.clear();
3303 return mJoinBuffer->
addJoin( joinInfo );
3309 return mJoinBuffer->
removeJoin( joinLayerId );
3339 if ( oi < 0 || oi >= mExpressionFieldBuffer->
expressions().size() )
3342 return mExpressionFieldBuffer->
expressions().at( oi ).cachedExpression.expression();
3353 if ( !mDataProvider )
3358 mFields = mDataProvider->
fields();
3368 if ( mExpressionFieldBuffer )
3372 QMap< QString, QString >::const_iterator aliasIt = mAttributeAliasMap.constBegin();
3373 for ( ; aliasIt != mAttributeAliasMap.constEnd(); ++aliasIt )
3379 mFields[ index ].setAlias( aliasIt.value() );
3383 mDefaultValueOnUpdateFields.clear();
3384 QMap< QString, QgsDefaultValue >::const_iterator defaultIt = mDefaultExpressionMap.constBegin();
3385 for ( ; defaultIt != mDefaultExpressionMap.constEnd(); ++defaultIt )
3387 int index = mFields.
lookupField( defaultIt.key() );
3391 mFields[ index ].setDefaultValueDefinition( defaultIt.value() );
3392 if ( defaultIt.value().applyOnUpdate() )
3393 mDefaultValueOnUpdateFields.insert( index );
3396 QMap< QString, QgsFieldConstraints::Constraints >::const_iterator constraintIt = mFieldConstraints.constBegin();
3397 for ( ; constraintIt != mFieldConstraints.constEnd(); ++constraintIt )
3399 int index = mFields.
lookupField( constraintIt.key() );
3412 mFields[ index ].setConstraints( constraints );
3415 QMap< QString, QPair< QString, QString > >::const_iterator constraintExpIt = mFieldConstraintExpressions.constBegin();
3416 for ( ; constraintExpIt != mFieldConstraintExpressions.constEnd(); ++constraintExpIt )
3418 int index = mFields.
lookupField( constraintExpIt.key() );
3429 mFields[ index ].setConstraints( constraints );
3433 for ( ; constraintStrengthIt != mFieldConstraintStrength.constEnd(); ++constraintStrengthIt )
3435 int index = mFields.
lookupField( constraintStrengthIt.key().first );
3445 constraints.
setConstraintStrength( constraintStrengthIt.key().second, constraintStrengthIt.value() );
3446 mFields[ index ].setConstraints( constraints );
3449 auto fieldWidgetIterator = mFieldWidgetSetups.constBegin();
3450 for ( ; fieldWidgetIterator != mFieldWidgetSetups.constEnd(); ++ fieldWidgetIterator )
3452 int index = mFields.
indexOf( fieldWidgetIterator.key() );
3456 mFields[index].setEditorWidgetSetup( fieldWidgetIterator.value() );
3459 if ( oldFields != mFields )
3462 mEditFormConfig.setFields( mFields );
3469 if ( index < 0 || index >= mFields.
count() )
3473 if ( expression.isEmpty() )
3477 std::unique_ptr< QgsExpressionContext > tempContext;
3482 evalContext = tempContext.get();
3515 if ( index < 0 || index >= mFields.
count() )
3520 mDefaultExpressionMap.insert( mFields.
at( index ).
name(), definition );
3524 mDefaultExpressionMap.remove( mFields.
at( index ).
name() );
3531 if ( index < 0 || index >= mFields.
count() )
3540 if ( !mDataProvider )
3553 uniqueValues = mDataProvider->
uniqueValues( index, limit );
3559 for (
const QVariant &v : constUniqueValues )
3561 vals << v.toString();
3565 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
3566 while ( addedIt.hasNext() && ( limit < 0 || uniqueValues.count() < limit ) )
3569 QVariant v = addedIt.value().attribute( index );
3572 QString vs = v.toString();
3573 if ( !vals.contains( vs ) )
3582 while ( it.hasNext() && ( limit < 0 || uniqueValues.count() < limit ) )
3585 QVariant v = it.value().value( index );
3588 QString vs = v.toString();
3589 if ( !vals.contains( vs ) )
3608 uniqueValues = mDataProvider->
uniqueValues( index, limit );
3621 .setSubsetOfAttributes( attList ) );
3624 QVariant currentValue;
3625 QHash<QString, QVariant> val;
3629 val.insert( currentValue.toString(), currentValue );
3630 if ( limit >= 0 && val.size() >= limit )
3636 return val.values().toSet();
3640 Q_ASSERT_X(
false,
"QgsVectorLayer::uniqueValues()",
"Unknown source of the field!" );
3646 QStringList results;
3647 if ( !mDataProvider )
3665 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
3666 while ( addedIt.hasNext() && ( limit < 0 || results.count() < limit ) && ( !feedback || !feedback->
isCanceled() ) )
3669 QVariant v = addedIt.value().attribute( index );
3672 QString vs = v.toString();
3673 if ( vs.contains( substring, Qt::CaseInsensitive ) && !results.contains( vs ) )
3681 while ( it.hasNext() && ( limit < 0 || results.count() < limit ) && ( !feedback || !feedback->
isCanceled() ) )
3684 QVariant v = it.value().value( index );
3687 QString vs = v.toString();
3688 if ( vs.contains( substring, Qt::CaseInsensitive ) && !results.contains( vs ) )
3719 QString fieldName = mFields.
at( index ).
name();
3720 request.
setFilterExpression( QStringLiteral(
"\"%1\" ILIKE '%%2%'" ).arg( fieldName, substring ) );
3724 QString currentValue;
3727 currentValue = f.
attribute( index ).toString();
3728 if ( !results.contains( currentValue ) )
3729 results << currentValue;
3731 if ( ( limit >= 0 && results.size() >= limit ) || ( feedback && feedback->
isCanceled() ) )
3741 Q_ASSERT_X(
false,
"QgsVectorLayer::uniqueStringsMatching()",
"Unknown source of the field!" );
3747 if ( !mDataProvider )
3765 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
3766 while ( addedIt.hasNext() )
3769 QVariant v = addedIt.value().attribute( index );
3777 while ( it.hasNext() )
3780 QVariant v = it.value().value( index );
3812 .setSubsetOfAttributes( attList ) );
3815 double minimumValue = std::numeric_limits<double>::max();
3816 double currentValue = 0;
3819 currentValue = f.
attribute( index ).toDouble();
3820 if ( currentValue < minimumValue )
3822 minimumValue = currentValue;
3825 return QVariant( minimumValue );
3829 Q_ASSERT_X(
false,
"QgsVectorLayer::minimumValue()",
"Unknown source of the field!" );
3835 if ( !mDataProvider )
3852 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
3853 while ( addedIt.hasNext() )
3856 QVariant v = addedIt.value().attribute( index );
3864 while ( it.hasNext() )
3867 QVariant v = it.value().value( index );
3897 .setSubsetOfAttributes( attList ) );
3900 double maximumValue = -std::numeric_limits<double>::max();
3901 double currentValue = 0;
3904 currentValue = f.
attribute( index ).toDouble();
3905 if ( currentValue > maximumValue )
3907 maximumValue = currentValue;
3910 return QVariant( maximumValue );
3914 Q_ASSERT_X(
false,
"QgsVectorLayer::maximumValue()",
"Unknown source of the field!" );
3925 if ( !mDataProvider )
3931 int attrIndex = mFields.
lookupField( fieldOrExpression );
3932 if ( attrIndex >= 0 )
3939 bool providerOk =
false;
3940 QVariant val = mDataProvider->
aggregate( aggregate, attrIndex, parameters, context, providerOk, fids );
3956 return c.
calculate( aggregate, fieldOrExpression, context, ok );
3961 if ( mFeatureBlendMode == featureBlendMode )
3971 return mFeatureBlendMode;
3985 return mLayerOpacity;
3990 void QgsVectorLayer::readSldLabeling(
const QDomNode &node )
3995 QDomElement element = node.toElement();
3996 if ( element.isNull() )
3999 QDomElement userStyleElem = element.firstChildElement( QStringLiteral(
"UserStyle" ) );
4000 if ( userStyleElem.isNull() )
4002 QgsDebugMsgLevel( QStringLiteral(
"Info: UserStyle element not found." ), 4 );
4006 QDomElement featureTypeStyleElem = userStyleElem.firstChildElement( QStringLiteral(
"FeatureTypeStyle" ) );
4007 if ( featureTypeStyleElem.isNull() )
4009 QgsDebugMsgLevel( QStringLiteral(
"Info: FeatureTypeStyle element not found." ), 4 );
4014 QDomElement ruleElem = featureTypeStyleElem.lastChildElement( QStringLiteral(
"Rule" ) );
4015 if ( ruleElem.isNull() )
4022 QDomElement textSymbolizerElem = ruleElem.lastChildElement( QStringLiteral(
"TextSymbolizer" ) );
4023 if ( textSymbolizerElem.isNull() )
4025 QgsDebugMsgLevel( QStringLiteral(
"Info: TextSymbolizer element not found." ), 4 );
4032 QDomElement labelElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Label" ) );
4033 if ( !labelElem.isNull() )
4035 QDomElement propertyNameElem = labelElem.firstChildElement( QStringLiteral(
"PropertyName" ) );
4036 if ( !propertyNameElem.isNull() )
4041 QString labelAttribute = propertyNameElem.text();
4045 int fieldIndex = mFields.
lookupField( labelAttribute );
4046 if ( fieldIndex == -1 )
4062 QgsDebugMsgLevel( QStringLiteral(
"Info: PropertyName element not found." ), 4 );
4072 QString fontFamily = QStringLiteral(
"Sans-Serif" );
4073 int fontPointSize = 10;
4074 int fontWeight = -1;
4075 bool fontItalic =
false;
4076 bool fontUnderline =
false;
4079 QDomElement fontElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Font" ) );
4080 if ( !fontElem.isNull() )
4084 QDomElement cssElem = fontElem.firstChildElement( QStringLiteral(
"CssParameter" ) );
4085 while ( !cssElem.isNull() )
4087 cssName = cssElem.attribute( QStringLiteral(
"name" ), QStringLiteral(
"not_found" ) );
4088 if ( cssName != QLatin1String(
"not_found" ) )
4090 elemText = cssElem.text();
4091 if ( cssName == QLatin1String(
"font-family" ) )
4093 fontFamily = elemText;
4095 else if ( cssName == QLatin1String(
"font-style" ) )
4097 fontItalic = ( elemText == QLatin1String(
"italic" ) ) || ( elemText == QLatin1String(
"Italic" ) );
4099 else if ( cssName == QLatin1String(
"font-size" ) )
4102 int fontSize = elemText.toInt( &ok );
4105 fontPointSize = fontSize;
4108 else if ( cssName == QLatin1String(
"font-weight" ) )
4110 if ( ( elemText == QLatin1String(
"bold" ) ) || ( elemText == QLatin1String(
"Bold" ) ) )
4111 fontWeight = QFont::Bold;
4113 else if ( cssName == QLatin1String(
"font-underline" ) )
4115 fontUnderline = ( elemText == QLatin1String(
"underline" ) ) || ( elemText == QLatin1String(
"Underline" ) );
4119 cssElem = cssElem.nextSiblingElement( QStringLiteral(
"CssParameter" ) );
4124 QFont font( fontFamily, fontPointSize, fontWeight, fontItalic );
4125 font.setUnderline( fontUnderline );
4127 format.
setSize( fontPointSize );
4131 if ( textColor.isValid() )
4139 QDomElement haloElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Halo" ) );
4140 if ( !haloElem.isNull() )
4145 QDomElement radiusElem = haloElem.firstChildElement( QStringLiteral(
"Radius" ) );
4146 if ( !radiusElem.isNull() )
4149 double bufferSize = radiusElem.text().toDouble( &ok );
4152 bufferSettings.
setSize( bufferSize );
4157 if ( bufferColor.isValid() )
4159 bufferSettings.
setColor( bufferColor );
4164 QDomElement labelPlacementElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"LabelPlacement" ) );
4165 if ( !labelPlacementElem.isNull() )
4168 QDomElement pointPlacementElem = labelPlacementElem.firstChildElement( QStringLiteral(
"PointPlacement" ) );
4169 if ( !pointPlacementElem.isNull() )
4173 QDomElement displacementElem = pointPlacementElem.firstChildElement( QStringLiteral(
"Displacement" ) );
4174 if ( !displacementElem.isNull() )
4176 QDomElement displacementXElem = displacementElem.firstChildElement( QStringLiteral(
"DisplacementX" ) );
4177 if ( !displacementXElem.isNull() )
4180 double xOffset = displacementXElem.text().toDouble( &ok );
4186 QDomElement displacementYElem = displacementElem.firstChildElement( QStringLiteral(
"DisplacementY" ) );
4187 if ( !displacementYElem.isNull() )
4190 double yOffset = displacementYElem.text().toDouble( &ok );
4198 QDomElement rotationElem = pointPlacementElem.firstChildElement( QStringLiteral(
"Rotation" ) );
4199 if ( !rotationElem.isNull() )
4202 double rotation = rotationElem.text().toDouble( &ok );
4219 return mEditFormConfig;
4224 if ( mEditFormConfig == editFormConfig )
4228 mEditFormConfig.onRelationsLoaded();
4234 return mMapTipTemplate;
4239 if ( mMapTipTemplate == mapTip )
4242 mMapTipTemplate = mapTip;
4258 if ( mAttributeTableConfig != attributeTableConfig )
4277 if ( !mDiagramLayerSettings )
4279 *mDiagramLayerSettings = s;
4285 QString myMetadata = QStringLiteral(
"<html>\n<body>\n" );
4288 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Information from provider" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4289 myMetadata += QLatin1String(
"<table class=\"list-view\">\n" );
4292 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Name" ) + QStringLiteral(
"</td><td>" ) +
name() + QStringLiteral(
"</td></tr>\n" );
4297 if ( uriComponents.contains( QStringLiteral(
"path" ) ) )
4299 path = uriComponents[QStringLiteral(
"path" )].toString();
4300 if ( QFile::exists( path ) )
4301 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Path" ) + QStringLiteral(
"</td><td>%1" ).arg( QStringLiteral(
"<a href=\"%1\">%2</a>" ).arg( QUrl::fromLocalFile( path ).toString(), QDir::toNativeSeparators( path ) ) ) + QStringLiteral(
"</td></tr>\n" );
4303 if ( uriComponents.contains( QStringLiteral(
"url" ) ) )
4305 const QString url = uriComponents[QStringLiteral(
"url" )].toString();
4306 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"URL" ) + QStringLiteral(
"</td><td>%1" ).arg( QStringLiteral(
"<a href=\"%1\">%2</a>" ).arg( QUrl( url ).toString(), url ) ) + QStringLiteral(
"</td></tr>\n" );
4311 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Source" ) + QStringLiteral(
"</td><td>%1" ).arg(
publicSource() ) + QStringLiteral(
"</td></tr>\n" );
4314 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Storage" ) + QStringLiteral(
"</td><td>" ) +
storageType() + QStringLiteral(
"</td></tr>\n" );
4317 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Comment" ) + QStringLiteral(
"</td><td>" ) +
dataComment() + QStringLiteral(
"</td></tr>\n" );
4320 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Encoding" ) + QStringLiteral(
"</td><td>" ) +
dataProvider()->
encoding() + QStringLiteral(
"</td></tr>\n" );
4334 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Geometry" ) + QStringLiteral(
"</td><td>" ) + typeString + QStringLiteral(
"</td></tr>\n" );
4338 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"CRS" ) + QStringLiteral(
"</td><td>" );
4341 myMetadata +=
crs().
authid() + QStringLiteral(
" - " );
4343 if (
crs().isGeographic() )
4344 myMetadata += tr(
"Geographic" );
4346 myMetadata += tr(
"Projected" );
4348 myMetadata += QLatin1String(
"</td></tr>\n" );
4351 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Extent" ) + QStringLiteral(
"</td><td>" ) +
extent().
toString() + QStringLiteral(
"</td></tr>\n" );
4354 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Unit" ) + QStringLiteral(
"</td><td>" ) +
QgsUnitTypes::toString(
crs().mapUnits() ) + QStringLiteral(
"</td></tr>\n" );
4359 QLocale locale = QLocale();
4360 locale.setNumberOptions( locale.numberOptions() &= ~QLocale::NumberOption::OmitGroupSeparator );
4361 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" )
4362 + tr(
"Feature count" ) + QStringLiteral(
"</td><td>" )
4364 + QStringLiteral(
"</td></tr>\n" );
4367 myMetadata += QLatin1String(
"</table>\n<br><br>" );
4370 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Identification" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4372 myMetadata += QLatin1String(
"<br><br>\n" );
4375 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Extent" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4377 myMetadata += QLatin1String(
"<br><br>\n" );
4380 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Access" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4382 myMetadata += QLatin1String(
"<br><br>\n" );
4385 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Fields" ) + QStringLiteral(
"</h1>\n<hr>\n<table class=\"list-view\">\n" );
4389 if ( !pkAttrList.isEmpty() )
4391 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Primary key attributes" ) + QStringLiteral(
"</td><td>" );
4392 const auto constPkAttrList = pkAttrList;
4393 for (
int idx : constPkAttrList )
4397 myMetadata += QLatin1String(
"</td></tr>\n" );
4403 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Count" ) + QStringLiteral(
"</td><td>" ) + QString::number( myFields.
size() ) + QStringLiteral(
"</td></tr>\n" );
4405 myMetadata += QLatin1String(
"</table>\n<br><table width=\"100%\" class=\"tabular-view\">\n" );
4406 myMetadata += QLatin1String(
"<tr><th>" ) + tr(
"Field" ) + QLatin1String(
"</th><th>" ) + tr(
"Type" ) + QLatin1String(
"</th><th>" ) + tr(
"Length" ) + QLatin1String(
"</th><th>" ) + tr(
"Precision" ) + QLatin1String(
"</th><th>" ) + tr(
"Comment" ) + QLatin1String(
"</th></tr>\n" );
4408 for (
int i = 0; i < myFields.
size(); ++i )
4413 rowClass = QStringLiteral(
"class=\"odd-row\"" );
4414 myMetadata += QLatin1String(
"<tr " ) + rowClass + QLatin1String(
"><td>" ) + myField.
name() + QLatin1String(
"</td><td>" ) + myField.
typeName() + QLatin1String(
"</td><td>" ) + QString::number( myField.
length() ) + QLatin1String(
"</td><td>" ) + QString::number( myField.
precision() ) + QLatin1String(
"</td><td>" ) + myField.
comment() + QLatin1String(
"</td></tr>\n" );
4418 myMetadata += QLatin1String(
"</table>\n<br><br>" );
4421 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Contacts" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4423 myMetadata += QLatin1String(
"<br><br>\n" );
4426 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Links" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4428 myMetadata += QLatin1String(
"<br><br>\n" );
4431 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"History" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4433 myMetadata += QLatin1String(
"<br><br>\n" );
4435 myMetadata += QStringLiteral(
"\n</body>\n</html>\n" );
4439 void QgsVectorLayer::invalidateSymbolCountedFlag()
4441 mSymbolFeatureCounted =
false;
4444 void QgsVectorLayer::onFeatureCounterCompleted()
4447 mFeatureCounter =
nullptr;
4450 void QgsVectorLayer::onFeatureCounterTerminated()
4452 mFeatureCounter =
nullptr;
4455 void QgsVectorLayer::onJoinedFieldsChanged()
4461 void QgsVectorLayer::onFeatureDeleted(
QgsFeatureId fid )
4463 if ( mEditCommandActive )
4464 mDeletedFids << fid;
4471 void QgsVectorLayer::onRelationsLoaded()
4473 mEditFormConfig.onRelationsLoaded();
4476 void QgsVectorLayer::onSymbolsCounted()
4478 if ( mFeatureCounter )
4481 mSymbolFeatureCounted =
true;
4496 msgError = QObject::tr(
"Unable to load %1 provider" ).arg(
mProviderKey );
4501 if ( !listStylesExternalMethod )
4503 msgError = QObject::tr(
"Provider %1 has no %2 method" ).arg(
mProviderKey, QStringLiteral(
"listStyles" ) );
4507 return listStylesExternalMethod(
mDataSource, ids, names, descriptions, msgError );
4515 msgError = QObject::tr(
"Unable to load %1 provider" ).arg(
mProviderKey );
4520 if ( !getStyleByIdMethod )
4522 msgError = QObject::tr(
"Provider %1 has no %2 method" ).arg(
mProviderKey, QStringLiteral(
"getStyleById" ) );
4526 return getStyleByIdMethod(
mDataSource, styleId, msgError );
4534 msgError = QObject::tr(
"Unable to load %1 provider" ).arg(
mProviderKey );
4538 if ( !deleteStyleByIdMethod )
4540 msgError = QObject::tr(
"Provider %1 has no %2 method" ).arg(
mProviderKey, QStringLiteral(
"deleteStyleById" ) );
4543 return deleteStyleByIdMethod(
mDataSource, styleId, msgError );
4548 bool useAsDefault,
const QString &uiFileContent, QString &msgError )
4551 QString sldStyle, qmlStyle;
4555 msgError = QObject::tr(
"Unable to load %1 provider" ).arg(
mProviderKey );
4560 if ( !saveStyleExternalMethod )
4562 msgError = QObject::tr(
"Provider %1 has no %2 method" ).arg(
mProviderKey, QStringLiteral(
"saveStyle" ) );
4566 QDomDocument qmlDocument, sldDocument;
4569 if ( !msgError.isNull() )
4573 qmlStyle = qmlDocument.toString();
4576 if ( !msgError.isNull() )
4580 sldStyle = sldDocument.toString();
4582 saveStyleExternalMethod(
mDataSource, qmlStyle, sldStyle, name,
4583 description, uiFileContent, useAsDefault, msgError );
4597 QString joinKey = mAuxiliaryLayerKey;
4598 if ( !key.isEmpty() )
4601 if ( storage.
isValid() && !joinKey.isEmpty() )
4624 mAuxiliaryLayerKey.clear();
4626 if ( mAuxiliaryLayer )
4639 mAuxiliaryLayer.reset( alayer );
4640 if ( mAuxiliaryLayer )
4641 mAuxiliaryLayer->setParent(
this );
4647 return mAuxiliaryLayer.get();
4652 return mAuxiliaryLayer.get();
4664 if ( loadStyleExternalMethod )
4666 QString qml, errorMsg;
4667 qml = loadStyleExternalMethod(
mDataSource, errorMsg );
4668 if ( !qml.isEmpty() )
4670 QDomDocument myDocument( QStringLiteral(
"qgis" ) );
4671 myDocument.setContent( qml );
4673 return QObject::tr(
"Loaded from Provider" );
4684 if ( mDataProvider )
4691 QSet<QgsMapLayerDependency> deps;
4692 const auto constODeps = oDeps;
4701 QSet<QgsMapLayerDependency> toAdd = deps -
dependencies();
4717 if ( mDataProvider )
4737 if ( ! toAdd.isEmpty() )
4745 if ( fieldIndex < 0 || fieldIndex >= mFields.
count() )
4761 QMap< QgsFieldConstraints::Constraint, QgsFieldConstraints::ConstraintStrength > m;
4763 if ( fieldIndex < 0 || fieldIndex >= mFields.
count() )
4766 QString
name = mFields.
at( fieldIndex ).
name();
4769 for ( ; conIt != mFieldConstraintStrength.constEnd(); ++conIt )
4771 if ( conIt.key().first ==
name )
4773 m[ conIt.key().second ] = mFieldConstraintStrength.value( conIt.key() );
4782 if ( index < 0 || index >= mFields.
count() )
4788 QgsFieldConstraints::Constraints constraints = mFieldConstraints.value( name,
nullptr );
4789 constraints |= constraint;
4790 mFieldConstraints.insert( name, constraints );
4792 mFieldConstraintStrength.insert( qMakePair( name, constraint ), strength );
4799 if ( index < 0 || index >= mFields.
count() )
4805 QgsFieldConstraints::Constraints constraints = mFieldConstraints.value( name,
nullptr );
4806 constraints &= ~constraint;
4807 mFieldConstraints.insert( name, constraints );
4809 mFieldConstraintStrength.remove( qMakePair( name, constraint ) );
4816 if ( index < 0 || index >= mFields.
count() )
4824 if ( index < 0 || index >= mFields.
count() )
4832 if ( index < 0 || index >= mFields.
count() )
4835 if ( expression.isEmpty() )
4837 mFieldConstraintExpressions.remove( mFields.
at( index ).
name() );
4841 mFieldConstraintExpressions.insert( mFields.
at( index ).
name(), qMakePair( expression, description ) );
4848 if ( index < 0 || index >= mFields.
count() )
4852 mFieldWidgetSetups.remove( mFields.
at( index ).
name() );
4854 mFieldWidgetSetups.insert( mFields.
at( index ).
name(), setup );
4861 if ( index < 0 || index >= mFields.
count() )
4870 if (
customProperty( QStringLiteral(
"labeling" ) ).toString() == QLatin1String(
"pal" ) )
4872 if (
customProperty( QStringLiteral(
"labeling/enabled" ), QVariant(
false ) ).toBool() )
4876 settings.readFromLayerCustomProperties(
this );
4883 for (
const QString &key : constCustomPropertyKeys )
4885 if ( key.startsWith( QLatin1String(
"labeling/" ) ) )
4895 return mAllowCommit;
4900 if ( mAllowCommit == allowCommit )
4909 return mGeometryOptions.get();
4919 return mReadExtentFromXml;
4922 void QgsVectorLayer::onDirtyTransaction(
const QString &sql,
const QString &
name )
4925 if ( tr && mEditBuffer )
void setProperty(int key, const QgsProperty &property)
Adds a property to the collection and takes ownership of it.
static void mergeScaleDependencies(double mScaleMinDenom, double mScaleMaxDenom, QgsStringMap &props)
Merges the local scale limits, if any, with the ones already in the map, if any.
int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
bool writeXml(QDomNode &layer_node, QDomDocument &doc, const QgsReadWriteContext &context) const FINAL
Writes vector layer specific state to project file Dom node.
bool addFeatures(QgsFeatureList &features, QgsFeatureSink::Flags flags=nullptr) override
Adds a list of features in joined layers.
QList< QgsExpressionFieldBuffer::ExpressionField > expressions() const
bool labelsEnabled() const
Returns whether the layer contains labels which are enabled and should be drawn.
QgsGeometryOptions * geometryOptions() const
Configuration and logic to apply automatically on any edit happening on this layer.
bool isValid() const
Returns the validity of this feature.
void writeXml(QDomNode &layer_node, QDomDocument &document) const
Saves mVectorJoins to xml under the layer node.
Class for parsing and evaluation of expressions (formerly called "search strings").
void updateFields()
Will regenerate the fields property of this layer by obtaining all fields from the dataProvider...
void opacityChanged(double opacity)
Emitted when the layer's opacity is changed, where opacity is a value between 0 (transparent) and 1 (...
QgsGeometry::OperationResult addPart(const QList< QgsPointXY > &ring)
Adds a new part polygon to a multipart feature.
QgsRectangle sourceExtent() const FINAL
Returns the extent of all geometries from the source.
QgsActionManager * actions()
Returns all layer actions defined on this layer.
double xOffset
Horizontal offset of label.
QString encoding() const
Gets encoding which is used for accessing data.
QgsStringMap attributeAliases() const
Returns a map of field name to attribute alias.
bool writeStyle(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories) const FINAL
Writes just the style information for the layer into the document.
The class is used as a container of context for various read/write operations on other objects...
Wrapper for iterator of features from vector data provider or vector layer.
void featuresDeleted(const QgsFeatureIds &fids)
Emitted when features have been deleted.
void selectAll()
Select all the features.
void setConstraintStrength(Constraint constraint, ConstraintStrength strength)
Sets the strength of a constraint.
Constraint was set by layer.
bool addJoin(const QgsVectorLayerJoinInfo &joinInfo)
Joins another vector layer to this layer.
void taskTerminated()
Will be emitted by task if it has terminated for any reason other then completion (e...
virtual bool setSubsetString(const QString &subset, bool updateFeatureCount=true)
Set the subset string used to create a subset of features in the layer.
A rectangle specified with double values.
QString targetFieldName() const
Returns name of the field of our layer that will be used for join.
bool readSld(const QDomNode &node, QString &errorMessage) FINAL
Base class for all map layer types.
QgsGeometry::OperationResult splitParts(const QVector< QgsPointXY > &splitLine, bool topologicalEditing=false)
Splits parts cut by the given line.
double rendererScale() const
Returns the renderer map scale.
void geometryChanged(QgsFeatureId fid, const QgsGeometry &geom)
Emitted when a feature's geometry is changed.
void renameExpression(int index, const QString &name)
Renames an expression field at a given index.
virtual void writeXml(QDomElement &layerElem, QDomDocument &doc, const QgsReadWriteContext &context) const =0
Writes diagram state to a DOM element.
void setDiagramLayerSettings(const QgsDiagramLayerSettings &s)
bool loadDefaultStyle
Set to true if the default layer style should be loaded.
QVariant maximumValue(int index) const override
Returns the maximum value of an attribute.
QgsVectorLayerFeatureCounter * countSymbolFeatures()
Count features for symbols.
bool containsJoins() const
Quick way to test if there is any join at all.
void update(const QgsFields &fields)
Update the configuration with the given fields.
virtual QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Writes configuration to a DOM element, to be used later with readXml()
void setRenderer(QgsFeatureRenderer *r)
Sets renderer which will be invoked to represent this layer.
Field comes from a joined layer (originIndex / 1000 = index of the join, originIndex % 1000 = index w...
bool readSymbology(const QDomNode &layerNode, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories) FINAL
Reads the symbology for the current layer from the Dom node supplied.
QSet< QgsFeatureId > QgsFeatureIds
void setExcludeAttributesWms(const QSet< QString > &att)
A set of attributes that are not advertised in WMS requests with QGIS server.
virtual bool renameAttribute(int attr, const QString &newName)
Renames an attribute field (but does not commit it)
virtual bool addAttribute(const QgsField &field)
Add an attribute field (but does not commit it) returns true if the field was added.
int size() const
Returns number of items.
virtual void exportSldStyle(QDomDocument &doc, QString &errorMsg) const
Export the properties of this layer as SLD style in a QDomDocument.
FieldOrigin fieldOrigin(int fieldIdx) const
Gets field's origin (value from an enumeration)
void setMinimal()
Set a rectangle so that min corner is at max and max corner is at min.
virtual QString subsetString() const
Returns the subset definition string (typically sql) currently in use by the layer and used by the pr...
void setProviderType(const QString &providerType)
Sets the providerType (provider key)
void taskCompleted()
Will be emitted by task to indicate its successful completion.
virtual QgsMapLayer * clone() const =0
Returns a new instance equivalent to this one except for the id which is still unique.
virtual QgsVectorDataProvider::Capabilities capabilities() const
Returns flags containing the supported capabilities.
void dependenciesChanged()
Emitted when dependencies are changed.
QgsWkbTypes::Type wkbType() const override=0
Returns the geometry type which is returned by this layer.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
void committedAttributesDeleted(const QString &layerId, const QgsAttributeList &deletedAttributes)
Signals emitted after committing changes.
bool isValid() const
Returns the status of the auxiliary storage currently defined.
virtual QString subsetString() const
Returns the string (typically sql) used to define a subset of the layer.
QgsMapLayerType type() const
Returns the type of the layer.
static Q_INVOKABLE QString toString(QgsUnitTypes::DistanceUnit unit)
Returns a translated string representing a distance unit.
void editFormConfigChanged()
Will be emitted whenever the edit form configuration of this layer changes.
void modifySelection(const QgsFeatureIds &selectIds, const QgsFeatureIds &deselectIds)
Modifies the current selection on this layer.
bool writeXml(QDomNode &layer_node) const
Writes the actions out in XML format.
virtual void updateExtents()
Update the extents of the layer.
The QgsGeometryOptions class contains options to automatically adjust geometries to constraints on a ...
void addExpression(const QString &exp, const QgsField &fld)
Add an expression to the buffer.
QVariant minimumValue(int index) const override
Returns the minimum value of an attribute.
void setFidsFilter(const QgsFeatureIds &fids)
Sets a filter to limit the features used during the aggregate calculation.
void removeFieldConstraint(int index, QgsFieldConstraints::Constraint constraint)
Removes a constraint for a specified field index.
bool isValid() const
Returns if this default value should be applied.
virtual bool importNamedStyle(QDomDocument &doc, QString &errorMsg, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories)
Import the properties of this layer from a QDomDocument.
bool writeXml(QDomNode &node, QDomDocument &doc, const QgsReadWriteContext &context) const
Write field ui properties specific state from Dom node.
void beforeRollBack()
Emitted before changes are rolled back.
virtual bool addFeatures(QgsFeatureList &features)
Insert a copy of the given features into the layer (but does not commit it)
bool hasParam(const QString &key) const
Returns true if a parameter with the specified key exists.
void beginEditCommand(const QString &text)
Create edit command for undo/redo operations.
Use exact geometry intersection (slower) instead of bounding boxes.
QSet< QString > excludeAttributesWms() const
A set of attributes that are not advertised in WMS requests with QGIS server.
This class is a composition of two QSettings instances:
QgsGeometry::OperationResult splitParts(const QVector< QgsPointXY > &splitLine, bool topologicalEditing=false)
Splits parts cut by the given line.
QString encodedSource(const QString &source, const QgsReadWriteContext &context) const FINAL
Called by writeLayerXML(), used by derived classes to encode provider's specific data source to proje...
QStringList customPropertyKeys() const
Returns list of all keys within custom properties.
MAYBE_UNUSED NODISCARD QgsReadWriteContextCategoryPopper enterCategory(const QString &category, const QString &details=QString())
Push a category to the stack.
double angleOffset
Label rotation, in degrees clockwise.
QString mapTipTemplate() const
The mapTip is a pretty, html representation for feature information.
QString readPath(const QString &filename) const
Turn filename read from the project file to an absolute path.
int translateFeature(QgsFeatureId featureId, double dx, double dy)
Translates feature by dx, dy.
QgsMapLayerLegend * legend() const
Can be nullptr.
QString storageType() const
Returns the permanent storage type for this layer as a friendly name.
Renders the diagrams for all features with the same settings.
FeatureAvailability
Possible return value for hasFeatures() to determine if a source is empty.
void setExtent(const QgsRectangle &rect) FINAL
Sets the extent.
The QgsDefaultValue class provides a container for managing client side default values for fields...
QgsGeometry::OperationResult addRing(const QVector< QgsPointXY > &ring, QgsFeatureId *featureId=nullptr)
Adds a ring to polygon/multipolygon features.
virtual void toSld(QDomDocument &doc, QDomElement &element, const QgsStringMap &props=QgsStringMap()) const
used from subclasses to create SLD Rule elements following SLD v1.1 specs
Constraint
Constraints which may be present on a field.
QSet< QString > excludeAttributesWfs() const
A set of attributes that are not advertised in WFS requests with QGIS server.
virtual bool addFeature(QgsFeature &f)
Adds a feature.
Field has been temporarily added in editing mode (originIndex = index in the list of added attributes...
QgsWkbTypes::Type wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
Setting options for loading vector layers.
SimplifyAlgorithm simplifyAlgorithm() const
Gets the local simplification algorithm of the vector layer managed.
bool deleteFeature(QgsFeatureId fid)
Deletes a feature from the layer (but does not commit it).
void committedAttributesAdded(const QString &layerId, const QList< QgsField > &addedAttributes)
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
QSet< QgsMapLayerDependency > dependencies() const FINAL
Gets the list of dependencies.
QList< QgsRelation > referencingRelations(const QgsVectorLayer *layer=nullptr, int fieldIdx=-2) const
Gets all relations where the specified layer (and field) is the referencing part (i.e.
void mapTipTemplateChanged()
Emitted when the map tip changes.
Class allowing to manage the auxiliary storage for a vector layer.
QString qgsEnumValueToKey(const T &value)
Returns the value for the given key of an enum.
QgsFieldConstraints::Constraints fieldConstraints(int fieldIndex) const
Returns any constraints which are present at the provider for a specified field index.
Arranges candidates over a point (or centroid of a polygon), or at a preset offset from the point...
void attributeDeleted(int idx)
QList< QgsFeature > QgsFeatureList
virtual void readXml(const QDomElement &elem, const QgsReadWriteContext &context)=0
Reads diagram state from a DOM element.
QString mProviderKey
Data provider key (name of the data provider)
bool deleteStyleById_t(const QString &uri, QString styleID, QString &errCause)
static void warning(const QString &msg)
Goes to qWarning.
Counts the features in a QgsVectorLayer in task.
void willBeDeleted()
Emitted in the destructor when the layer is about to be deleted, but it is still in a perfectly valid...
void setSize(double size)
Sets the size of the buffer.
A class to represent a 2D point.
friend class QgsVectorLayerFeatureSource
void setForceLocalOptimization(bool localOptimization)
Sets where the simplification executes, after fetch the geometries from provider, or when supported...
void readOnlyChanged()
Emitted when the read only state of this layer is changed.
bool renameAttribute(int index, const QString &newName)
Renames an attribute field (but does not commit it).
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
void invertSelectionInRectangle(QgsRectangle &rect)
Inverts selection of features found within the search rectangle (in layer's coordinates) ...
void subsetStringChanged()
Emitted when the layer's subset string has changed.
QgsFeature getFeature(QgsFeatureId fid) const
Queries the layer for the feature with the given id.
bool commitChanges()
Attempts to commit to the underlying data provider any buffered changes made since the last to call t...
virtual QSet< QgsMapLayerDependency > dependencies() const
Gets the list of layer ids on which this layer depends.
int selectedFeatureCount() const
Returns the number of features that are selected in this layer.
QString providerType() const
Returns the provider type (provider key) for this layer.
virtual QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context)
store renderer info to XML element
EditResult deleteVertex(QgsFeatureId featureId, int vertex)
Deletes a vertex from a feature.
virtual void setEncoding(const QString &e)
Set encoding used for accessing data from layer.
bool startEditing()
Makes the layer editable.
void setSimplifyHints(SimplifyHints simplifyHints)
Sets the simplification hints of the vector layer managed.
void setFont(const QFont &font)
Sets the font used for rendering text.
QgsVectorLayer(const QString &path=QString(), const QString &baseName=QString(), const QString &providerLib="ogr", const QgsVectorLayer::LayerOptions &options=QgsVectorLayer::LayerOptions())
Constructor - creates a vector layer.
bool deleteAttributes(const QList< int > &attrs)
Deletes a list of attribute fields (but does not commit it)
VertexMarkerType
Editing vertex markers.
void removeExpressionField(int index)
Removes an expression field.
void setFeatureBlendMode(QPainter::CompositionMode blendMode)
Sets the blending mode used for rendering each feature.
QVariant evaluate()
Evaluate the feature and return the result.
void readCustomProperties(const QDomNode &layerNode, const QString &keyStartsWith=QString())
Read custom properties from project file.
static QgsPainting::BlendMode getBlendModeEnum(QPainter::CompositionMode blendMode)
Returns a BlendMode corresponding to a QPainter::CompositionMode.
static QgsProperty fromField(const QString &fieldName, bool isActive=true)
Returns a new FieldBasedProperty created from the specified field name.
virtual QgsAttributeList pkAttributeIndexes() const
Returns list of indexes of fields that make up the primary key.
Remove from current selection.
void writeXml(QDomElement &layerElem, QDomDocument &doc) const
Writes the diagram settings to a DOM element.
virtual void resolveReferences(QgsProject *project)
Resolve references to other layers (kept as layer IDs after reading XML) into layer objects...
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
~QgsVectorLayer() override
bool writeSymbology(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories) const FINAL
Writes the symbology for the layer into the document provided.
Class providing some utility methods to manage auxiliary storage.
SimplifyHint
Simplification flags for fast rendering of features.
Utility class for calculating aggregates for a field (or expression) over the features from a vector ...
double yOffset
Vertical offset of label.
void setLabeling(QgsAbstractVectorLayerLabeling *labeling)
Sets labeling configuration.
Provider can create feature renderers using backend-specific formatting information. Since QGIS 3.2. See QgsVectorDataProvider::createRenderer().
void readCustomSymbology(const QDomElement &element, QString &errorMessage)
Signal emitted whenever the symbology (QML-file) for this layer is being read.
QString evalErrorString() const
Returns evaluation error.
Aliases, widgets, WMS/WFS, expressions, constraints, virtual fields.
QgsWkbTypes::GeometryType geometryType() const
Returns point, line or polygon.
bool deleteFeatures(const QgsFeatureIds &fids)
Deletes a set of features from the layer (but does not commit it)
virtual const QgsLayerMetadata & metadata() const
Returns a reference to the layer's metadata store.
void readXml(const QDomNode &layer_node)
Reads joins from project file.
void raiseError(const QString &msg) const
Signals an error in this provider.
void configChanged()
Emitted whenever the configuration is changed.
void setDiagramRenderer(QgsDiagramRenderer *r)
Sets diagram rendering object (takes ownership)
Container of fields for a vector layer.
virtual void rollBack()
Stop editing and discard the edits.
A geometry is the spatial representation of a feature.
void selectByIds(const QgsFeatureIds &ids, SelectBehavior behavior=SetSelection)
Selects matching features using a list of feature IDs.
bool setAttribute(int field, const QVariant &attr)
Set an attribute's value by field index.
virtual QgsFeatureRenderer * createRenderer(const QVariantMap &configuration=QVariantMap()) const
Creates a new vector layer feature renderer, using provider backend specific information.
#define RENDERER_TAG_NAME
void beforeRemovingExpressionField(int idx)
Will be emitted, when an expression field is going to be deleted from this vector layer...
long featureCount() const FINAL
Returns feature count including changes which have not yet been committed If you need only the count ...
QString decodedSource(const QString &source, const QString &provider, const QgsReadWriteContext &context) const FINAL
Called by readLayerXML(), used by derived classes to decode provider's specific data source from proj...
static QPainter::CompositionMode getCompositionMode(QgsPainting::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a BlendMode.
QgsChangedAttributesMap mChangedAttributeValues
Changed attributes values which are not committed.
bool needsGeometry() const
Returns true if the expression uses feature geometry for some computation.
Allows entering a context category and takes care of leaving this category on deletion of the class...
QgsEditorWidgetSetup editorWidgetSetup() const
Gets the editor widget setup for the field.
QList< QgsAction > actions(const QString &actionScope=QString()) const
Returns a list of actions that are available in the given action scope.
QVariantMap decodeUri(const QString &providerKey, const QString &uri)
Breaks a provider data source URI into its component paths (e.g.
QMap< QgsFieldConstraints::Constraint, QgsFieldConstraints::ConstraintStrength > fieldConstraintsAndStrength(int fieldIndex) const
Returns a map of constraint with their strength for a specific field of the layer.
void setFields(const QgsFields &fields)
Convenience function for setting a fields for the scope.
void setDisplayExpression(const QString &displayExpression)
Set the preview expression, used to create a human readable preview string.
Stores information about constraints which may be present on a field.
Field comes from the underlying data provider of the vector layer (originIndex = index in provider's ...
int addTopologicalPoints(const QgsGeometry &geom)
Adds topological points for every vertex of the geometry.
bool isAuxiliaryField(int index, int &srcIndex) const
Returns true if the field comes from the auxiliary layer, false otherwise.
QSet< QString > referencedColumns() const
Gets list of columns referenced by the expression.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
static const int EditingCapabilities
Bitmask of all provider's editing capabilities.
void resolveReferences(QgsProject *project) FINAL
Resolves references to other layers (kept as layer IDs after reading XML) into layer objects...
bool isValid() const
Returns the status of the layer.
QgsChangedAttributesMap changedAttributeValues() const
Returns a map of features with changed attributes values which are not committed. ...
void beforeCommitChanges()
Emitted before changes are committed to the data provider.
bool qgsVariantGreaterThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is greater than the second.
QgsFeatureList selectedFeatures() const
Returns a copy of the user-selected features.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
void committedFeaturesRemoved(const QString &layerId, const QgsFeatureIds &deletedFeatureIds)
Emitted when features are deleted from the provider.
QUuid addAction(QgsAction::ActionType type, const QString &name, const QString &command, bool capture=false)
Add an action with the given name and action details.
void committedAttributesDeleted(const QString &layerId, const QgsAttributeList &deletedAttributes)
Emitted when attributes are deleted from the provider.
void setBlendMode(QPainter::CompositionMode blendMode)
Set the blending mode used for rendering a layer.
void setConnection(const QString &aHost, const QString &aPort, const QString &aDatabase, const QString &aUsername, const QString &aPassword, SslMode sslmode=SslPrefer, const QString &authConfigId=QString())
Sets all connection related members at once.
bool insertVertex(double x, double y, QgsFeatureId atFeatureId, int beforeVertex)
Inserts a new vertex before the given vertex number, in the given ring, item (first number is index 0...
int count() const
Returns number of items.
void featureDeleted(QgsFeatureId fid)
Emitted when a feature has been deleted.
QMap< QString, QString > QgsStringMap
void editCommandEnded()
Signal emitted, when an edit command successfully ended.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
OperationResult
Success or failure of a geometry operation.
QString username() const
Returns the username stored in the URI.
QgsFieldConstraints::Constraints fieldConstraints(int fieldIndex) const
Returns any constraints which are present for a specified field index.
QgsFeatureIds deletedFeatureIds() const
Returns a list of deleted feature IDs which are not committed.
void invertSelection()
Selects not selected features and deselects selected ones.
void setParameters(const AggregateParameters ¶meters)
Sets all aggregate parameters from a parameter bundle.
bool qgsVariantLessThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is less than the second.
Attribute table settings: choice and order of columns, conditional styling.
It has not been specified where the field comes from.
void deselect(QgsFeatureId featureId)
Deselects feature by its ID.
Constraint was set at data provider.
void styleChanged()
Signal emitted whenever a change affects the layer's style.
Field has an expression constraint set. See constraintExpression().
void setFormat(const QgsTextFormat &format)
Sets the label text formatting settings, e.g., font settings, buffer settings, etc.
virtual QgsRectangle extent() const
Returns the extent of the layer.
void setMapTipTemplate(const QString &mapTipTemplate)
The mapTip is a pretty, html representation for feature information.
void writeCustomProperties(QDomNode &layerNode, QDomDocument &doc) const
Write custom properties to project file.
void removeSelection()
Clear selection.
QString attributeAlias(int index) const
Returns the alias of an attribute name or a null string if there is no alias.
Manages joined fields for a vector layer.
QgsConditionalLayerStyles * conditionalStyles() const
Returns the conditional styles that are set for this layer.
virtual QgsLayerMetadata layerMetadata() const
Returns layer metadata collected from the provider's source.
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
void setAuxiliaryLayer(QgsAuxiliaryLayer *layer=nullptr)
Sets the current auxiliary layer.
QgsDataProvider * createProvider(const QString &providerKey, const QString &dataSource, const QgsDataProvider::ProviderOptions &options=QgsDataProvider::ProviderOptions())
Creates a new instance of a provider.
const QgsProjectTranslator * projectTranslator() const
Returns the project translator.
int fieldOriginIndex(int fieldIdx) const
Gets field's origin index (its meaning is specific to each type of origin)
bool updateFeature(QgsFeature &feature, bool skipDefaultValues=false)
Updates an existing feature in the layer, replacing the attributes and geometry for the feature with ...
static QgsTaskManager * taskManager()
Returns the application's task manager, used for managing application wide background task handling...
void dataChanged()
Emitted whenever a change is made to the data provider which may have caused changes in the provider'...
Base class for feedback objects to be used for cancellation of something running in a worker thread...
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
void setFieldConstraint(int index, QgsFieldConstraints::Constraint constraint, QgsFieldConstraints::ConstraintStrength strength=QgsFieldConstraints::ConstraintStrengthHard)
Sets a constraint for a specified field index.
void featureAdded(QgsFeatureId fid)
virtual int listStylesInDatabase(QStringList &ids, QStringList &names, QStringList &descriptions, QString &msgError)
Lists all the style in db split into related to the layer and not related to.
QgsFeatureRequest & setExpressionContext(const QgsExpressionContext &context)
Sets the expression context used to evaluate filter expressions.
QgsRectangle mExtent
Extent of the layer.
bool isEditable() const FINAL
Returns true if the provider is in editing mode.
void setExcludeAttributesWfs(const QSet< QString > &att)
A set of attributes that are not advertised in WFS requests with QGIS server.
QgsFeatureRequest & setFilterFid(QgsFeatureId fid)
Sets feature ID that should be fetched.
bool changeAttributeValue(QgsFeatureId fid, int field, const QVariant &newValue, const QVariant &oldValue=QVariant())
Changes attribute value in joined layers.
Q_DECL_DEPRECATED void setDataSource(const QString &dataSource, const QString &baseName, const QString &provider, bool loadDefaultStyleFlag=false)
Update the data source of the layer.
void committedGeometriesChanges(const QString &layerId, const QgsGeometryMap &changedGeometries)
QString host() const
Returns the host name stored in the URI.
void setEditorWidgetSetup(int index, const QgsEditorWidgetSetup &setup)
The editor widget setup defines which QgsFieldFormatter and editor widget will be used for the field ...
QgsRectangle boundingBoxOfSelected() const
Returns the bounding box of the selected features. If there is no selection, QgsRectangle(0,0,0,0) is returned.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
float maximumScale() const
Gets the maximum scale at which the layer should be simplified.
virtual void updateExtents(bool force=false)
Update the extents for the layer.
Type
The WKB type describes the number of dimensions a geometry has.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
QStringList uniqueStringsMatching(int index, const QString &substring, int limit=-1, QgsFeedback *feedback=nullptr) const
Returns unique string values of an attribute which contain a specified subset string.
bool readXml(const QDomNode &layer_node)
Reads the actions in in XML format.
int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
static QVariant readVariant(const QDomElement &element)
Read a QVariant from a QDomElement.
void setSize(double size)
Sets the size for rendered text.
T qgsEnumKeyToValue(const QString &key, const T &defaultValue)
Returns the value corresponding to the given key of an enum.
const QList< QgsVectorLayerJoinInfo > vectorJoins() const
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
QgsGeometry getGeometry(QgsFeatureId fid) const
Queries the layer for the geometry at the given id.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
QgsCoordinateTransformContext transformContext() const
Returns data provider coordinate transform context.
void writeCommonStyle(QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories) const
Write style data common to all layer types.
const QgsFeatureIds & selectedFeatureIds() const
Returns a list of the selected features IDs in this layer.
bool changeGeometry(QgsFeatureId fid, QgsGeometry &geometry, bool skipDefaultValue=false)
Changes a feature's geometry within the layer's edit buffer (but does not immediately commit the chan...
void readStyleManager(const QDomNode &layerNode)
Read style manager's configuration (if any). To be called by subclasses.
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted...
bool rollBack(bool deleteBuffer=true)
Stops a current editing operation and discards any uncommitted edits.
bool readStyle(const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories) FINAL
Reads the style for the current layer from the Dom node supplied.
void attributeAdded(int idx)
bool equals(const QgsGeometry &geometry) const
Test if this geometry is exactly equal to another geometry.
bool deleteFeature(QgsFeatureId fid) const
Deletes a feature from joined layers.
void select(QgsFeatureId featureId)
Selects feature by its ID.
#define QgsDebugMsgLevel(str, level)
bool allowCommit() const
Controls, if the layer is allowed to commit changes.
QString typeName() const
Gets the field type.
Rendering: scale visibility, simplify method, opacity.
void featureBlendModeChanged(QPainter::CompositionMode blendMode)
Signal emitted when setFeatureBlendMode() is called.
QString displayName() const
Returns the name to use when displaying this field.
virtual void setMetadata(const QgsLayerMetadata &metadata)
Sets the layer's metadata store.
static QgsFeatureRenderer * load(QDomElement &symbologyElem, const QgsReadWriteContext &context)
create a renderer from XML element
bool changeAttributeValues(QgsFeatureId fid, const QgsAttributeMap &newValues, const QgsAttributeMap &oldValues=QgsAttributeMap())
Changes attributes' values in joined layers.
Evaluates and returns the diagram settings relating to a diagram for a specific feature.
void setCrs(const QgsCoordinateReferenceSystem &srs, bool emitSignal=true)
Sets layer's spatial reference system.
QSet< QgsMapLayerDependency > mDependencies
List of layers that may modify this layer on modification.
void beforeModifiedCheck() const
Emitted when the layer is checked for modifications. Use for last-minute additions.
QgsFeatureIterator getSelectedFeatures(QgsFeatureRequest request=QgsFeatureRequest()) const
Returns an iterator of the selected features.
void reload() FINAL
Synchronises with changes in the datasource.
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
virtual bool isValid() const =0
Returns true if this is a valid layer.
virtual QgsCoordinateReferenceSystem crs() const =0
Returns the coordinate system for the data source.
QString dataComment() const
Returns a description for this layer as defined in the data provider.
QList< QgsRelation > referencingRelations(int idx) const
Returns the layer's relations, where the foreign key is on this layer.
QgsFields fields() const override=0
Returns the fields associated with this data provider.
QString constraintDescription() const
Returns the descriptive name for the constraint expression.
static QString geometryDisplayString(GeometryType type)
Returns a display string for a geometry type.
double width() const
Returns the width of the rectangle.
bool deleteFeatures(const QgsFeatureIds &fids) const
Deletes a list of features from joined layers.
void afterRollBack()
Emitted after changes are rolled back.
virtual void setExtent(const QgsRectangle &rect)
Sets the extent.
Utility class that encapsulates an action based on vector attributes.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
double opacity() const
Returns the opacity for the vector layer, where opacity is a value between 0 (totally transparent) an...
Geometry validation configuration.
void committedFeaturesAdded(const QString &layerId, const QgsFeatureList &addedFeatures)
Emitted when features are added to the provider.
QgsMapLayerRenderer * createMapRenderer(QgsRenderContext &rendererContext) FINAL
Returns new instance of QgsMapLayerRenderer that will be used for rendering of given context...
void readXml(const QDomElement &elem)
Reads the diagram settings from a DOM element.
bool setDependencies(const QSet< QgsMapLayerDependency > &layers) FINAL
Sets the list of dependencies.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
bool writeSld(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsStringMap &props=QgsStringMap()) const
Writes the symbology of the layer into the document provided in SLD 1.1 format.
virtual QString dataSourceUri(bool expandAuthConfig=false) const
Gets the data source specification.
QgsGeometry::OperationResult splitFeatures(const QVector< QgsPointXY > &splitLine, bool topologicalEditing=false)
Splits features cut by the given line.
Defines left outer join from our vector layer to some other vector layer.
QgsGeometry::OperationResult splitFeatures(const QVector< QgsPointXY > &splitLine, bool topologicalEditing=false)
Splits features cut by the given line.
QMap< int, QVariant > QgsAttributeMap
virtual bool deleteAttribute(int attr)
Deletes an attribute field (but does not commit it).
void editingStopped()
Emitted when edited changes have been successfully written to the data provider.
void beforeEditingStarted()
Emitted before editing on this layer is started.
static GeometryType geometryType(Type type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
QgsGeometryMap mChangedGeometries
Changed geometries which are not committed.
int translateFeature(QgsFeatureId featureId, double dx, double dy)
Translates feature by dx, dy.
void setEnabled(bool enabled)
Sets whether the text buffer will be drawn.
long addTask(QgsTask *task, int priority=0)
Adds a task to the manager.
QString toString(int precision=16) const
Returns a string representation of form xmin,ymin : xmax,ymax Coordinates will be truncated to the sp...
bool moveVertex(double x, double y, QgsFeatureId atFeatureId, int atVertex)
Moves the vertex at the given position number, ring and item (first number is index 0)...
void setColor(const QColor &color)
Sets the color that text will be rendered in.
virtual bool isModified() const
Returns true if the provider has been modified since the last commit.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
QgsAttributeList primaryKeyAttributes() const
Returns the list of attributes which make up the layer's primary keys.
void setLabelsEnabled(bool enabled)
Sets whether labels should be enabled for the layer.
void writeXml(QDomNode &layer_node, QDomDocument &document) const
Saves expressions to xml under the layer node.
QgsVectorLayerJoinInfo joinInfo() const
Returns information to use for joining with primary key and so on.
virtual bool changeGeometry(QgsFeatureId fid, const QgsGeometry &geom)
Change feature's geometry.
The QgsMapLayerLegend class is abstract interface for implementations of legends for one map layer...
virtual QDomElement save(QDomDocument &doc, const QgsReadWriteContext &context) const =0
Returns labeling configuration as XML element.
void setFieldAlias(int index, const QString &aliasString)
Sets an alias (a display name) for attributes to display in dialogs.
QString description() const
Returns the descriptive name of the CRS, e.g., "WGS 84" or "GDA 94 / Vicgrid94".
float threshold() const
Gets the simplification threshold of the vector layer managed.
bool removeJoin(const QString &joinLayerId)
Removes a vector layer join.
void destroyEditCommand()
Destroy active command and reverts all changes in it.
bool addFeatures(QgsFeatureList &features, QgsFeatureSink::Flags flags=nullptr) FINAL
Adds a list of features to the sink.
An expression node which takes it value from a feature's field.
QgsCoordinateReferenceSystem crs() const
Returns the layer's spatial reference system.
virtual QVariant aggregate(QgsAggregateCalculator::Aggregate aggregate, int index, const QgsAggregateCalculator::AggregateParameters ¶meters, QgsExpressionContext *context, bool &ok, QgsFeatureIds *fids=nullptr) const
Calculates an aggregated value from the layer's features.
void dataSourceChanged()
Emitted whenever the layer's data source has been changed.
Reads and writes project states.
Storage and management of actions associated with a layer.
QString publicSource() const
Gets a version of the internal layer definition that has sensitive bits removed (for example...
virtual bool deleteFeatures(const QgsFeatureIds &fid)
Deletes a set of features from the layer (but does not commit it)
Provider can read layer metadata from data store. Since QGIS 3.0. See QgsDataProvider::layerMetadata(...
void geometryChanged(QgsFeatureId fid, const QgsGeometry &geometry)
Emitted whenever a geometry change is done in the edit buffer.
bool setReadOnly(bool readonly=true)
Makes layer read-only (editing disabled) or not.
void selectionChanged(const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect)
Emitted when selection was changed.
void setParam(const QString &key, const QString &value)
Sets a generic parameter value on the URI.
virtual bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=nullptr)
Adds a single feature to the sink.
virtual QgsTransaction * transaction() const
Returns the transaction this data provider is included in, if any.
T flagValue(const QString &key, const T &defaultValue, const Section section=NoSection)
Returns the setting value for a setting based on a flag.
QgsFeatureRenderer * renderer()
Returns renderer.
Y-coordinate data defined diagram position.
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
QgsFeatureIds mDeletedFeatureIds
Deleted feature IDs which are not committed.
const QgsVectorJoinList & vectorJoins() const
Abstract base class for curved geometry type.
void removeCustomProperty(const QString &key)
Remove a custom property from layer.
void attributeValueChanged(QgsFeatureId fid, int idx, const QVariant &value)
Emitted whenever an attribute value change is done in the edit buffer.
Encapsulate a field in an attribute table or data source.
void featureAdded(QgsFeatureId fid)
Emitted when a new feature has been added to the layer.
Fetch only a subset of attributes (setSubsetOfAttributes sets this flag)
QgsCoordinateTransformContext transformContext() const
Returns the layer data provider coordinate transform context or a default transform context if the la...
QgsEditFormConfig editFormConfig() const
Returns the configuration of the form used to represent this vector layer.
void setSimplifyAlgorithm(SimplifyAlgorithm simplifyAlgorithm)
Sets the local simplification algorithm of the vector layer managed.
const QgsAbstractVectorLayerLabeling * labeling() const
Access to const labeling configuration.
QVariant minimumValue(int index) const FINAL
Returns the minimum value for an attribute column or an invalid variant in case of error...
void rendererChanged()
Signal emitted when renderer is changed.
void updateFields(QgsFields &flds)
Adds fields with the expressions buffered in this object to a QgsFields object.
virtual bool isSaveAndLoadStyleToDatabaseSupported() const
It returns false by default.
Single scope for storing variables and functions for use within a QgsExpressionContext.
double minimumScale() const
Returns the minimum map scale (i.e.
Contains information about the context in which a coordinate transform is executed.
virtual bool changeAttributeValues(QgsFeatureId fid, const QgsAttributeMap &newValues, const QgsAttributeMap &oldValues)
Changes values of attributes (but does not commit it).
Fast access to features using their ID.
QgsRelationManager relationManager
Whether to show the diagram.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the scope.
double maximumScale() const
Returns the maximum map scale (i.e.
bool mValid
Indicates if the layer is valid and can be drawn.
QString port() const
Returns the port stored in the URI.
void raiseError(const QString &msg)
Signals an error related to this vector layer.
Add selection to current selection.
void editingStarted()
Emitted when editing on this layer has started.
void setName(const QString &name)
Set the display name of the layer.
QgsExpressionContext createExpressionContext() const FINAL
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QString capabilitiesString() const
Capabilities for this layer, comma separated and translated.
static Q_DECL_DEPRECATED void drawVertexMarker(double x, double y, QPainter &p, QgsVectorLayer::VertexMarkerType type, int vertexSize)
Draws a vertex symbol at (screen) coordinates x, y.
QVariant calculate(Aggregate aggregate, const QString &fieldOrExpression, QgsExpressionContext *context=nullptr, bool *ok=nullptr) const
Calculates the value of an aggregate.
QMap< QString, QgsMapLayer * > mapLayers(const bool validOnly=false) const
Returns a map of all registered layers by layer ID.
QgsAuxiliaryLayer * auxiliaryLayer()
Returns the current auxiliary layer.
Point geometry type, with support for z-dimension and m-values.
Double value (including negative values)
virtual QSet< QVariant > uniqueValues(int fieldIndex, int limit=-1) const
Returns the set of unique values contained within the specified fieldIndex from this source...
QString constraintDescription(int index) const
Returns the descriptive name for the constraint expression for a specified field index.
void symbolFeatureCountMapChanged()
Emitted when the feature count for symbols on this layer has been recalculated.
void endEditCommand()
Finish edit command and add it to undo/redo stack.
virtual bool commitChanges(QStringList &commitErrors)
Attempts to commit any changes to disk.
QPainter::CompositionMode featureBlendMode() const
Returns the current blending mode for features.
void setConstraint(Constraint constraint, ConstraintOrigin origin=ConstraintOriginLayer)
Sets a constraint on the field.
void committedAttributeValuesChanges(const QString &layerId, const QgsChangedAttributesMap &changedAttributesValues)
Emitted when attribute value changes are saved to the provider.
void dirtied(const QString &sql, const QString &name)
Emitted if a sql query is executed and the underlying data is modified.
const QgsVectorSimplifyMethod & simplifyMethod() const
Returns the simplification settings for fast rendering of features.
QString displayField() const
This is a shorthand for accessing the displayExpression if it is a simple field.
virtual bool deleteAttribute(int attr)
Delete an attribute field (but does not commit it)
bool readXml(const QDomNode &node, const QgsReadWriteContext &context)
Reads field ui properties specific state from Dom node.
bool hasDependencyCycle(const QSet< QgsMapLayerDependency > &layers) const
Checks whether a new set of dependencies will introduce a cycle.
QgsRectangle extent() const FINAL
Returns the extent of the layer.
Definition for a property.
void fullExtentCalculated()
Emitted whenever a deferred extent calculation is completed by the provider.
QgsGeometry::OperationResult addPart(const QList< QgsPointXY > &ring, QgsFeatureId featureId)
Adds a new part polygon to a multipart feature.
const QgsDiagramRenderer * diagramRenderer() const
virtual QgsAbstractVectorLayerLabeling * createLabeling(const QVariantMap &configuration=QVariantMap()) const
Creates labeling settings, using provider backend specific information.
bool loadAuxiliaryLayer(const QgsAuxiliaryStorage &storage, const QString &key=QString())
Loads the auxiliary layer for this vector layer.
QMap< int, QgsPropertyDefinition > QgsPropertiesDefinition
Definition of available properties.
void writeXml(QDomNode &node) const
Serialize to XML on layer save.
bool readExtentFromXml() const
Returns true if the extent is read from the XML document when data source has no metadata, false if it's the data provider which determines it.
void editCommandDestroyed()
Signal emitted, when an edit command is destroyed.
void recalculateExtents() const
This is used to send a request that any mapcanvas using this layer update its extents.
Set selection, removing any existing selection.
int addExpressionField(const QString &exp, const QgsField &fld)
Add a new field which is calculated by the expression specified.
void setMaximumScale(float maximumScale)
Sets the maximum scale at which the layer should be simplified.
virtual bool isClosed() const
Returns true if the curve is closed.
void repaintRequested(bool deferredUpdate=false)
By emitting this signal the layer tells that either appearance or content have been changed and any v...
virtual void exportNamedStyle(QDomDocument &doc, QString &errorMsg, const QgsReadWriteContext &context=QgsReadWriteContext(), QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories) const
Export the properties of this layer as named style in a QDomDocument.
double yMinimum() const
Returns the y minimum value (bottom side of rectangle).
QString uri(bool expandAuthConfig=true) const
Returns the complete URI as a string.
virtual QString translate(const QString &context, const QString &sourceText, const char *disambiguation=nullptr, int n=-1) const =0
The derived translate() translates with QTranslator and qm file the sourceText.
void selectByRect(QgsRectangle &rect, SelectBehavior behavior=SetSelection)
Selects features found within the search rectangle (in layer's coordinates)
static QgsMapLayerLegend * defaultVectorLegend(QgsVectorLayer *vl)
Create new legend implementation for vector layer.
void setProviderEncoding(const QString &encoding)
Sets the textencoding of the data provider.
void relationsLoaded()
Emitted when the relations were loaded after reading a project.
int addTopologicalPoints(const QgsGeometry &geom)
Adds topological points for every vertex of the geometry.
virtual void cancel()
Notifies the task that it should terminate.
General configuration: identifiable, removable, searchable, display expression, read-only.
Implementation of threaded rendering for vector layers.
void writeStyleManager(QDomNode &layerNode, QDomDocument &doc) const
Write style manager's configuration (if exists). To be called by subclasses.
QStringList commitErrors() const
Returns a list containing any error messages generated when attempting to commit changes to the layer...
Stores the settings for rendering of all diagrams for a layer.
double xMaximum() const
Returns the x maximum value (right side of rectangle).
QVector< QgsPoint > QgsPointSequence
void combineExtentWith(const QgsRectangle &rect)
Expands the rectangle so that it covers both the original rectangle and the given rectangle...
QgsCoordinateTransformContext transformContext() const
Returns data provider coordinate transform context.
QString capabilitiesString() const
Returns the above in friendly format.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
bool useRenderingOptimization() const
Returns true if the rendering optimization (geometry simplification) can be executed.
Modify current selection to include only select features which match.
QgsDefaultValue defaultValueDefinition(int index) const
Returns the definition of the expression used when calculating the default value for a field...
QMap< QgsFeatureId, QgsFeature > QgsFeatureMap
bool removeJoin(const QString &joinLayerId)
Removes a vector layer join.
SelectBehavior
Selection behavior.
bool insertVertex(double x, double y, QgsFeatureId atFeatureId, int beforeVertex)
Insert a new vertex before the given vertex number, in the given ring, item (first number is index 0)...
QgsFeatureMap addedFeatures() const
Returns a map of new features which are not committed.
QgsAttributeTableConfig attributeTableConfig() const
Returns the attribute table configuration object.
void selectByExpression(const QString &expression, SelectBehavior behavior=SetSelection)
Selects matching features using an expression.
const QgsPathResolver & pathResolver() const
Returns path resolver for conversion between relative and absolute paths.
void attributeAdded(int idx)
Will be emitted, when a new attribute has been added to this vector layer.
void allowCommitChanged()
Emitted whenever the allowCommitChanged() property of this layer changes.
virtual QString loadDefaultStyle(bool &resultFlag)
Retrieve the default style for this layer if one exists (either as a .qml file on disk or as a record...
void beforeAddingExpressionField(const QString &fieldName)
Will be emitted, when an expression field is going to be added to this vector layer.
Custom properties (by plugins for instance)
Contains information about the context of a rendering operation.
QgsExpressionContextScope * createExpressionContextScope() const FINAL
This method needs to be reimplemented in all classes which implement this interface and return an exp...
Setting options for creating vector data providers.
QgsFieldConstraints constraints
X-coordinate data defined diagram position.
QString name() const
Returns the display name of the layer.
Buffers information about expression fields for a vector layer.
QString getStyleById_t(const QString &uri, QString styleID, QString &errCause)
bool isEmpty() const
Returns true if the configuration is empty, ie it contains no columns.
void editCommandStarted(const QString &text)
Signal emitted when a new edit command has been started.
QString loadStyle_t(const QString &uri, QString &errCause)
bool simplifyDrawingCanbeApplied(const QgsRenderContext &renderContext, QgsVectorSimplifyMethod::SimplifyHint simplifyHint) const
Returns whether the VectorLayer can apply the specified simplification hint.
QgsFeatureRequest & setFilterFids(const QgsFeatureIds &fids)
Sets feature IDs that should be fetched.
bool isCanceled() const
Tells whether the operation has been canceled already.
QgsEditorWidgetSetup editorWidgetSetup(int index) const
The editor widget setup defines which QgsFieldFormatter and editor widget will be used for the field ...
void displayExpressionChanged()
Emitted when the display expression changes.
QgsGeometry::OperationResult addRing(const QVector< QgsPointXY > &ring, const QgsFeatureIds &targetFeatureIds=QgsFeatureIds(), QgsFeatureId *modifiedFeatureId=nullptr)
Adds a ring to polygon/multipolygon features.
bool addJoin(const QgsVectorLayerJoinInfo &joinInfo)
Joins another vector layer to this layer.
int indexOf(const QString &fieldName) const
Gets the field index from the field name.
QString mDataSource
Data source description string, varies by layer type.
void attributeValueChanged(QgsFeatureId fid, int idx, const QVariant &)
virtual void setTransformContext(const QgsCoordinateTransformContext &transformContext)
Sets data coordinate transform context to transformContext.
QSet< QVariant > uniqueValues(int fieldIndex, int limit=-1) const FINAL
Calculates a list of unique values contained within an attribute in the layer.
QString source() const
Returns the source for the layer.
long featureCount() const override=0
Number of features in the layer.
const QgsDiagramLayerSettings * diagramLayerSettings() const
const QgsExpressionNode * rootNode() const
Returns the root node of the expression.
bool hasScaleBasedVisibility() const
Returns whether scale based visibility is enabled for the layer.
void setConstraintExpression(const QString &expression, const QString &description=QString())
Set the constraint expression for the field.
QgsCurve * clone() const override=0
Clones the geometry by performing a deep copy.
This class allows including a set of layers in a database-side transaction, provided the layer data p...
QgsCoordinateTransformContext transformContext
Coordinate transform context.
ConstraintStrength
Strength of constraints.
void updateExpression(int index, const QString &exp)
Changes the expression at a given index.
virtual void toSld(QDomNode &parent, const QgsStringMap &props) const
Writes the SE 1.1 TextSymbolizer element based on the current layer labeling settings.
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
void committedAttributeValuesChanges(const QString &layerId, const QgsChangedAttributesMap &changedAttributesValues)
static QgsFeatureRenderer * loadSld(const QDomNode &node, QgsWkbTypes::GeometryType geomType, QString &errorMessage)
Create a new renderer according to the information contained in the UserStyle element of a SLD style ...
Container for settings relating to a text buffer.
virtual void reloadData()
Reloads the data from the source.
void setAllowCommit(bool allowCommit)
Controls, if the layer is allowed to commit changes.
bool deleteSelectedFeatures(int *deletedCount=nullptr)
Deletes the selected features.
Edit operation was successful.
QString expressionField(int index) const
Returns the expression used for a given expression field.
virtual QList< QgsDiagramSettings > diagramSettings() const =0
Returns list with all diagram settings in the renderer.
bool forceLocalOptimization() const
Gets where the simplification executes, after fetch the geometries from provider, or when supported...
QString constraintExpression(int index) const
Returns the constraint expression for for a specified field index, if set.
The QgsConditionalLayerStyles class holds conditional style information for a layer.
bool moveVertex(double x, double y, QgsFeatureId atFeatureId, int atVertex)
Moves the vertex at the given position number, ring and item (first number is index 0)...
void updateFields(QgsFields &fields)
Updates field map with joined attributes.
QgsWkbTypes::Type fallbackWkbType
Fallback geometry type.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void committedAttributesAdded(const QString &layerId, const QList< QgsField > &addedAttributes)
Emitted when attributes are added to the provider.
void readXml(const QDomNode &layer_node)
Reads expressions from project file.
static QgsProject * instance()
Returns the QgsProject singleton instance.
virtual QString loadNamedStyle(const QString &uri, bool &resultFlag, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories)
Retrieve a named style for this layer if one exists (either as a .qml file on disk or as a record in ...
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
void removeExpression(int index)
Remove an expression from the buffer.
virtual QString dataComment() const
Returns a short comment for the data that this provider is providing access to (e.g.
This class represents a coordinate reference system (CRS).
bool isField() const
Checks whether an expression consists only of a single field reference.
virtual QStringList uniqueStringsMatching(int index, const QString &substring, int limit=-1, QgsFeedback *feedback=nullptr) const
Returns unique string values of an attribute which contain a specified subset string.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
friend class QgsVectorLayerEditBuffer
virtual bool isModified() const
Returns true if the provider has been modified since the last commit.
QHash< QString, long > symbolFeatureCountMap() const
Gets the count for each symbol.
bool isNull() const
Test if the rectangle is null (all coordinates zero or after call to setMinimal()).
Abstract base class - its implementations define different approaches to the labeling of a vector lay...
const QgsVectorLayerJoinInfo * joinForFieldIndex(int index, const QgsFields &fields, int &sourceFieldIndex) const
Finds the vector join for a layer field index.
SimplifyHints simplifyHints() const
Gets the simplification hints of the vector layer managed.
Provider can set labeling settings using backend-specific formatting information. Since QGIS 3...
void removeFieldAlias(int index)
Removes an alias (a display name) for attributes to display in dialogs.
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=nullptr) FINAL
Adds a single feature to the sink.
bool isEmpty() const
Checks whether the container is empty.
void writeCustomSymbology(QDomElement &element, QDomDocument &doc, QString &errorMessage) const
Signal emitted whenever the symbology (QML-file) for this layer is being written. ...
static QString displayString(Type type)
Returns a display string type for a WKB type, e.g., the geometry name used in WKT geometry representa...
virtual bool setSubsetString(const QString &subset)
Sets the string (typically sql) used to define a subset of the layer.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
QgsVectorLayer::EditResult deleteVertex(QgsFeatureId featureId, int vertex)
Deletes a vertex from a feature.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
void setDefaultValueDefinition(int index, const QgsDefaultValue &definition)
Sets the definition of the expression to use when calculating the default value for a field...
virtual QString getStyleFromDatabase(const QString &styleId, QString &msgError)
Returns the named style corresponding to style id provided.
virtual bool deleteFeature(QgsFeatureId fid)
Delete a feature from the layer (but does not commit it)
virtual bool enterUpdateMode()
Enter update mode.
void setSimplifyMethod(const QgsVectorSimplifyMethod &simplifyMethod)
Sets the simplification settings for fast rendering of features.
friend class QgsVectorLayerEditPassthrough
Basic implementation of the labeling interface.
T enumValue(const QString &key, const T &defaultValue, const Section section=NoSection)
Returns the setting value for a setting based on an enum.
void dataChanged()
Data of layer changed.
void joinedFieldsChanged()
Emitted whenever the list of joined fields changes (e.g.
static QColor colorFromOgcFill(const QDomElement &fillElement)
Parse XML with OGC fill into QColor.
virtual bool changeAttributeValue(QgsFeatureId fid, int field, const QVariant &newValue, const QVariant &oldValue=QVariant())
Changed an attribute value (but does not commit it)
QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
A grouped map of multiple QgsProperty objects, each referenced by a integer key value.
Base class for utility classes that encapsulate information necessary for rendering of map layers...
void setConstraintExpression(int index, const QString &expression, const QString &description=QString())
Sets the constraint expression for the specified field index.
QString sourceName() const FINAL
Returns a friendly display name for the source.
void setBuffer(const QgsTextBufferSettings &bufferSettings)
Sets the text's buffer settings.
Allows deletion of features.
double yMaximum() const
Returns the y maximum value (top side of rectangle).
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
bool isExpression
true if this label is made from a expression string, e.g., FieldName || 'mm'
QgsCoordinateReferenceSystem sourceCrs() const FINAL
Returns the coordinate reference system for features in the source.
ConstraintOrigin constraintOrigin(Constraint constraint) const
Returns the origin of a field constraint, or ConstraintOriginNotSet if the constraint is not present ...
QString password() const
Returns the password stored in the URI.
QgsMapLayerType
Types of layers that can be added to a map.
virtual QgsRectangle extent() const =0
Returns the extent of the layer.
FeatureAvailability hasFeatures() const FINAL
Determines if this vector layer has features.
bool changeAttributeValue(QgsFeatureId fid, int field, const QVariant &newValue, const QVariant &oldValue=QVariant(), bool skipDefaultValues=false)
Changes an attribute value for a feature (but does not immediately commit the changes).
QgsWkbTypes::GeometryType type
Edit failed due to invalid layer.
QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
QUndoStack * undoStack()
Returns pointer to layer's undo stack.
virtual QString storageType() const
Returns the permanent storage type for this layer as a friendly name.
void committedFeaturesRemoved(const QString &layerId, const QgsFeatureIds &deletedFeatureIds)
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
QList< int > QgsAttributeList
QgsExpressionContextScope * popScope()
Removes the last scope from the expression context and return it.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
void committedFeaturesAdded(const QString &layerId, const QgsFeatureList &addedFeatures)
void normalize()
Normalize the rectangle so it has non-negative width/height.
virtual bool deleteStyleFromDatabase(const QString &styleId, QString &msgError)
Deletes a style from the database.
bool nextFeature(QgsFeature &f)
This is a container for configuration of the attribute table.
void setCoordinateSystem()
Setup the coordinate system transformation for the layer.
This is the base class for vector data providers.
void attributeDeleted(int idx)
Will be emitted, when an attribute has been deleted from this vector layer.
virtual void setTransformContext(const QgsCoordinateTransformContext &transformContext) override
Sets the coordinate transform context to transformContext.
Container for all settings relating to text rendering.
QString constraintExpression() const
Returns the constraint expression for the field, if set.
static QgsFeatureRenderer * defaultRenderer(QgsWkbTypes::GeometryType geomType)
Returns a new renderer - used by default in vector layers.
bool changeAttributeValues(QgsFeatureId fid, const QgsAttributeMap &newValues, const QgsAttributeMap &oldValues=QgsAttributeMap(), bool skipDefaultValues=false)
Changes attributes' values for a feature (but does not immediately commit the changes).
Geometry is not required. It may still be returned if e.g. required for a filter condition.
void setEditFormConfig(const QgsEditFormConfig &editFormConfig)
Sets the editFormConfig (configuration) of the form used to represent this vector layer...
void setLegend(QgsMapLayerLegend *legend)
Assign a legend controller to the map layer.
Class for storing the component parts of a RDBMS data source URI (e.g.
QgsFeatureMap mAddedFeatures
New features which are not committed.
void committedGeometriesChanges(const QString &layerId, const QgsGeometryMap &changedGeometries)
Emitted when geometry changes are saved to the provider.
virtual bool empty() const
Returns true if the layer contains at least one feature.
QgsCoordinateReferenceSystem fallbackCrs
Fallback layer coordinate reference system.
This class models dependencies with or between map layers.
bool hasEvalError() const
Returns true if an error occurred when evaluating last input.
QString createSavepoint(QString &error)
creates a save point returns empty string on error returns the last created savepoint if it's not dir...
QString displayExpression() const
Returns the preview expression, used to create a human readable preview string.
void updateFields(QgsFields &fields)
QVariant maximumValue(int index) const FINAL
Returns the maximum value for an attribute column or an invalid variant in case of error...
void layerModified()
Emitted when modifications has been done on layer.
Represents a vector layer which manages a vector based data sets.
bool addAttribute(const QgsField &field)
Add an attribute field (but does not commit it) returns true if the field was added.
QString htmlMetadata() const FINAL
Obtain a formatted HTML string containing assorted metadata for this layer.
QVariant attribute(const QString &name) const
Lookup attribute value from attribute name.
virtual QgsFeatureIds allFeatureIds() const
Returns a list of all feature IDs for features present in the source.
virtual bool writeXml(QDomElement &collectionElem, const QgsPropertiesDefinition &definitions) const
Writes the current state of the property collection into an XML element.
virtual void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Reads configuration from a DOM element previously written by writeXml()
Field is calculated from an expression.
void updatedFields()
Emitted whenever the fields available from this layer have been changed.
void updateExpressionField(int index, const QString &exp)
Changes the expression used to define an expression based (virtual) field.
EditResult
Result of an edit operation.
void setAttributeTableConfig(const QgsAttributeTableConfig &attributeTableConfig)
Sets the attribute table configuration object.
void layerModified()
Emitted when modifications has been done on layer.
QgsAttributeList mDeletedAttributeIds
Deleted attributes fields which are not committed. The list is kept sorted.
static QgsRectangle readRectangle(const QDomElement &element)
QString attributeDisplayName(int index) const
Convenience function that returns the attribute alias if defined or the field name else...
void setColor(const QColor &color)
Sets the color for the buffer.
QString database() const
Returns the database name stored in the URI.
void featureDeleted(QgsFeatureId fid)
static QDomElement writeVariant(const QVariant &value, QDomDocument &doc)
Write a QVariant to a QDomElement.
QgsAuxiliaryLayer * createAuxiliaryLayer(const QgsField &field, QgsVectorLayer *layer) const
Creates an auxiliary layer for a vector layer.
QgsDefaultValue defaultValueDefinition
void set(const QgsPointXY &p1, const QgsPointXY &p2)
Sets the rectangle from two QgsPoints.
QString authid() const
Returns the authority identifier for the CRS.
void setDatabase(const QString &database)
Sets the URI database name.
void resolveReferences(QgsProject *project)
Resolves layer IDs of joined layers using given project's available layers.
static QgsAbstractVectorLayerLabeling * create(const QDomElement &element, const QgsReadWriteContext &context)
Try to create instance of an implementation based on the XML data.
QgsVectorLayer * clone() const override
Returns a new instance equivalent to this one.
virtual bool hasMetadata() const
Returns true if the data source has metadata, false otherwise.
void readXml(const QDomNode &node)
Deserialize to XML on layer load.
Aggregate
Available aggregates to calculate.
virtual bool leaveUpdateMode()
Leave update mode.
void setFlags(QgsMapLayer::LayerFlags flags)
Returns the flags for this layer.
bool diagramsEnabled() const
Returns whether the layer contains diagrams which are enabled and should be drawn.
void readCommonStyle(const QDomElement &layerElement, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories)
Read style data common to all layer types.
QPainter::CompositionMode blendMode() const
Returns the current blending mode for a layer.
double height() const
Returns the height of the rectangle.
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
bool readXml(const QDomNode &layer_node, QgsReadWriteContext &context) FINAL
Reads vector layer specific state from project file Dom node.
QString joinLayerId() const
ID of the joined layer - may be used to resolve reference to the joined layer.
void setReadExtentFromXml(bool readExtentFromXml)
Flag allowing to indicate if the extent has to be read from the XML document when data source has no ...
virtual QString loadNamedStyle(const QString &theURI, bool &resultFlag, bool loadFromLocalDb, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories)
Loads a named style from file/local db/datasource db.
A bundle of parameters controlling aggregate calculation.
QVariant defaultValue(int index, const QgsFeature &feature=QgsFeature(), QgsExpressionContext *context=nullptr) const
Returns the calculated default value for the specified field index.
QString loadDefaultStyle(bool &resultFlag) FINAL
Retrieve the default style for this layer if one exists (either as a .qml file on disk or as a record...
virtual void saveStyleToDatabase(const QString &name, const QString &description, bool useAsDefault, const QString &uiFileContent, QString &msgError)
Saves named and sld style of the layer to the style table in the db.
void setThreshold(float threshold)
Sets the simplification threshold of the vector layer managed.
bool saveStyle_t(const QString &uri, const QString &qmlStyle, const QString &sldStyle, const QString &styleName, const QString &styleDescription, const QString &uiFileContent, bool useAsDefault, QString &errCause)
QString fieldName
Name of field (or an expression) to use for label text.
Field must have a unique value.
QVariant aggregate(QgsAggregateCalculator::Aggregate aggregate, const QString &fieldOrExpression, const QgsAggregateCalculator::AggregateParameters ¶meters=QgsAggregateCalculator::AggregateParameters(), QgsExpressionContext *context=nullptr, bool *ok=nullptr, QgsFeatureIds *fids=nullptr) const
Calculates an aggregated value from the layer's features.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
virtual QVariant defaultValue(int fieldIndex) const
Returns any literal default values which are present at the provider for a specified field index...
int listStyles_t(const QString &uri, QStringList &ids, QStringList &names, QStringList &descriptions, QString &errCause)
void setOpacity(double opacity)
Sets the opacity for the vector layer, where opacity is a value between 0 (totally transparent) and 1...