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,
146 :
QgsMapLayer( VectorLayer, baseName, vectorLayerPath )
147 , mAuxiliaryLayer( nullptr )
148 , mAuxiliaryLayerKey( QString() )
149 , mReadExtentFromXml( options.readExtentFromXml )
154 mGeometryOptions = qgis::make_unique<QgsGeometryOptions>();
159 mJoinBuffer->setParent(
this );
164 if ( !vectorLayerPath.isEmpty() && !
mProviderKey.isEmpty() )
179 mSimplifyMethod.
setThreshold( settings.
value( QStringLiteral(
"qgis/simplifyDrawingTol" ), mSimplifyMethod.
threshold() ).toFloat() );
192 delete mDataProvider;
195 delete mExpressionFieldBuffer;
197 delete mDiagramLayerSettings;
198 delete mDiagramRenderer;
203 delete mConditionalStyles;
205 if ( mFeatureCounter )
206 mFeatureCounter->
cancel();
214 QList<QgsVectorLayerJoinInfo> joins =
vectorJoins();
271 auto constraintIt = constraints.constBegin();
272 for ( ; constraintIt != constraints.constEnd(); ++ constraintIt )
348 p.setPen( QColor( 50, 100, 120, 200 ) );
349 p.setBrush( QColor( 200, 200, 210, 120 ) );
350 p.drawEllipse( x - m, y - m, m * 2 + 1, m * 2 + 1 );
354 p.setPen( QColor( 255, 0, 0 ) );
355 p.drawLine( x - m, y + m, x + m, y - m );
356 p.drawLine( x - m, y - m, x + m, y + m );
362 mSelectedFeatureIds.insert( fid );
369 mSelectedFeatureIds.unite( featureIds );
376 mSelectedFeatureIds.remove( fid );
383 mSelectedFeatureIds.subtract( featureIds );
396 .setFilterRect( rect )
398 .setNoAttributes() );
403 newSelection << feat.
id();
432 newSelection << feat.
id();
454 bool matches = exp.
evaluate( &context ).toBool();
458 newSelection << feat.
id();
462 newSelection << feat.
id();
481 newSelection = mSelectedFeatureIds + ids;
485 newSelection = mSelectedFeatureIds - ids;
489 newSelection = mSelectedFeatureIds.intersect( ids );
493 QgsFeatureIds deselectedFeatures = mSelectedFeatureIds - newSelection;
494 mSelectedFeatureIds = newSelection;
502 if ( !intersectingIds.isEmpty() )
504 QgsDebugMsgLevel( QStringLiteral(
"Trying to select and deselect the same item at the same time. Unsure what to do. Selecting dubious items." ), 3 );
507 mSelectedFeatureIds -= deselectIds;
508 mSelectedFeatureIds += selectIds;
516 ids.subtract( mSelectedFeatureIds );
531 .setFilterRect( rect )
533 .setNoAttributes() );
541 if ( mSelectedFeatureIds.contains( fet.
id() ) )
543 deselectIds << fet.
id();
547 selectIds << fet.
id();
556 if ( mSelectedFeatureIds.isEmpty() )
564 return mDataProvider;
569 return mDataProvider;
574 if (
mValid && mDataProvider && mDataProvider->
encoding() != encoding )
583 delete mDiagramRenderer;
584 mDiagramRenderer = r;
591 if (
mValid && mDataProvider )
597 QgsDebugMsgLevel( QStringLiteral(
"invalid layer or pointer to mDataProvider is null" ), 3 );
599 QgsDebugMsgLevel( QStringLiteral(
"Vector layer with unknown geometry type." ), 3 );
622 .setFilterFids( mSelectedFeatureIds )
623 .setNoAttributes() );
636 .setNoAttributes() );
640 if ( mSelectedFeatureIds.contains( fet.
id() ) )
651 if ( retval.
width() == 0.0 || retval.
height() == 0.0 )
660 retval.
set( -1.0, -1.0, 1.0, 1.0 );
669 return mLabelsEnabled &&
static_cast< bool >( mLabeling );
674 mLabelsEnabled = enabled;
679 if ( !mDiagramRenderer || !mDiagramLayerSettings )
682 QList<QgsDiagramSettings> settingList = mDiagramRenderer->
diagramSettings();
683 if ( !settingList.isEmpty() )
685 return settingList.at( 0 ).enabled;
692 if ( !mSymbolFeatureCounted )
695 return mSymbolFeatureCountMap.value( legendKey );
702 if ( mSymbolFeatureCounted || mFeatureCounter )
703 return mFeatureCounter;
705 mSymbolFeatureCountMap.clear();
710 return mFeatureCounter;
712 if ( !mDataProvider )
715 return mFeatureCounter;
720 return mFeatureCounter;
723 if ( !mFeatureCounter )
732 return mFeatureCounter;
738 if ( force || !mReadExtentFromXml || ( mReadExtentFromXml && mXmlExtent.
isNull() ) )
739 mValidExtent =
false;
750 if ( !mDefaultValueOnUpdateFields.isEmpty() )
755 int size = mFields.
size();
756 for (
int idx : qgis::as_const( mDefaultValueOnUpdateFields ) )
758 if ( idx < 0 || idx >= size )
776 if ( !mValidExtent && mLazyExtent && mDataProvider && !mDataProvider->
hasMetadata() && mReadExtentFromXml && !mXmlExtent.
isNull() )
783 if ( !mValidExtent && mLazyExtent && mDataProvider )
800 if ( !
mValid || !mDataProvider )
802 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider" ), 3 );
824 if ( it->hasGeometry() )
835 .setNoAttributes() );
870 if ( !
mValid || !mDataProvider )
872 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider" ), 3 );
880 if ( !
mValid || !mDataProvider )
882 QgsDebugMsgLevel( QStringLiteral(
"invoked with invalid layer or null mDataProvider" ), 3 );
909 double maximumSimplificationScale = mSimplifyMethod.
maximumScale();
912 return !( maximumSimplificationScale > 1 && renderContext.
rendererScale() <= maximumSimplificationScale );
919 return mConditionalStyles;
924 if ( !
mValid || !mDataProvider )
942 if ( !
mValid || !mEditBuffer || !mDataProvider )
946 if ( mGeometryOptions->isActive() )
949 mGeometryOptions->apply( geom );
953 bool success = mEditBuffer->
addFeature( feature );
968 if ( !mEditBuffer || !mDataProvider )
974 if ( currentFeature.
isValid() )
976 bool hasChanged =
false;
977 bool hasError =
false;
989 QgsDebugMsgLevel( QStringLiteral(
"geometry of feature %1 could not be changed." ).arg( updatedFeature.
id() ), 3 );
996 for (
int attr = 0; attr < fa.count(); ++attr )
998 if ( fa.at( attr ) != ca.at( attr ) )
1006 QgsDebugMsgLevel( QStringLiteral(
"attribute %1 of feature %2 could not be changed." ).arg( attr ).arg( updatedFeature.
id() ), 3 );
1011 if ( hasChanged && !mDefaultValueOnUpdateFields.isEmpty() && !skipDefaultValues )
1012 updateDefaultValues( updatedFeature.
id(), updatedFeature );
1018 QgsDebugMsgLevel( QStringLiteral(
"feature %1 could not be retrieved" ).arg( updatedFeature.
id() ), 3 );
1026 if ( !
mValid || !mEditBuffer || !mDataProvider )
1030 bool result = utils.
insertVertex( x, y, atFeatureId, beforeVertex );
1039 if ( !
mValid || !mEditBuffer || !mDataProvider )
1043 bool result = utils.
insertVertex( point, atFeatureId, beforeVertex );
1052 if ( !
mValid || !mEditBuffer || !mDataProvider )
1056 bool result = utils.
moveVertex( x, y, atFeatureId, atVertex );
1065 if ( !
mValid || !mEditBuffer || !mDataProvider )
1069 bool result = utils.
moveVertex( p, atFeatureId, atVertex );
1078 if ( !
mValid || !mEditBuffer || !mDataProvider )
1103 int count = mSelectedFeatureIds.size();
1116 *deletedCount = deleted;
1119 return deleted == count;
1124 if ( !
mValid || !mEditBuffer || !mDataProvider )
1125 return QgsGeometry::OperationResult::LayerNotEditable;
1131 if ( !mSelectedFeatureIds.isEmpty() )
1133 result = utils.
addRing( ring, mSelectedFeatureIds, featureId );
1136 if ( result != QgsGeometry::OperationResult::Success )
1147 if ( !
mValid || !mEditBuffer || !mDataProvider )
1150 return QgsGeometry::OperationResult::LayerNotEditable;
1155 return QgsGeometry::OperationResult::InvalidInputGeometryType;
1161 return QgsGeometry::OperationResult::AddRingNotClosed;
1168 if ( !mSelectedFeatureIds.isEmpty() )
1170 result = utils.
addRing( static_cast< QgsCurve * >( ring->
clone() ), mSelectedFeatureIds, featureId );
1173 if ( result != QgsGeometry::OperationResult::Success )
1185 if ( !
mValid || !mEditBuffer || !mDataProvider )
1186 return QgsGeometry::OperationResult::LayerNotEditable;
1190 if ( mSelectedFeatureIds.empty() )
1192 QgsDebugMsgLevel( QStringLiteral(
"Number of selected features < 1" ), 3 );
1193 return QgsGeometry::OperationResult::SelectionIsEmpty;
1195 else if ( mSelectedFeatureIds.size() > 1 )
1197 QgsDebugMsgLevel( QStringLiteral(
"Number of selected features > 1" ), 3 );
1198 return QgsGeometry::OperationResult::SelectionIsGreaterThanOne;
1204 if ( result == QgsGeometry::OperationResult::Success )
1211 if ( !
mValid || !mEditBuffer || !mDataProvider )
1212 return QgsGeometry::OperationResult::LayerNotEditable;
1216 if ( mSelectedFeatureIds.empty() )
1219 return QgsGeometry::OperationResult::SelectionIsEmpty;
1221 else if ( mSelectedFeatureIds.size() > 1 )
1224 return QgsGeometry::OperationResult::SelectionIsGreaterThanOne;
1230 if ( result == QgsGeometry::OperationResult::Success )
1237 if ( !
mValid || !mEditBuffer || !mDataProvider )
1238 return QgsGeometry::OperationResult::LayerNotEditable;
1242 if ( mSelectedFeatureIds.empty() )
1245 return QgsGeometry::OperationResult::SelectionIsEmpty;
1247 else if ( mSelectedFeatureIds.size() > 1 )
1250 return QgsGeometry::OperationResult::SelectionIsGreaterThanOne;
1256 if ( result == QgsGeometry::OperationResult::Success )
1263 if ( !
mValid || !mEditBuffer || !mDataProvider )
1264 return QgsGeometry::OperationResult::LayerNotEditable;
1269 if ( result == QgsGeometry::OperationResult::Success )
1276 if ( !
mValid || !mEditBuffer || !mDataProvider )
1277 return QgsGeometry::OperationResult::LayerNotEditable;
1280 return utils.
splitParts( splitLine, topologicalEditing );
1285 if ( !
mValid || !mEditBuffer || !mDataProvider )
1286 return QgsGeometry::OperationResult::LayerNotEditable;
1289 return utils.
splitFeatures( splitLine, topologicalEditing );
1294 if ( !
mValid || !mEditBuffer || !mDataProvider )
1303 if ( !
mValid || !mEditBuffer || !mDataProvider )
1312 if ( mLabeling == labeling )
1321 if ( !
mValid || !mDataProvider )
1386 QDomNode pkeyNode = layer_node.namedItem( QStringLiteral(
"provider" ) );
1388 if ( pkeyNode.isNull() )
1394 QDomElement pkeyElt = pkeyNode.toElement();
1404 else if (
mDataSource.contains( QLatin1String(
"dbname=" ) ) )
1419 QDomElement pkeyElem = pkeyNode.toElement();
1420 if ( !pkeyElem.isNull() )
1422 QString encodingString = pkeyElem.attribute( QStringLiteral(
"encoding" ) );
1423 if ( mDataProvider && !encodingString.isEmpty() )
1430 mJoinBuffer->
readXml( layer_node );
1442 QDomNode depsNode = layer_node.namedItem( QStringLiteral(
"dataDependencies" ) );
1443 QDomNodeList depsNodes = depsNode.childNodes();
1444 QSet<QgsMapLayerDependency> sources;
1445 for (
int i = 0; i < depsNodes.count(); i++ )
1447 QString
source = depsNodes.at( i ).toElement().attribute( QStringLiteral(
"id" ) );
1453 QDomElement legendElem = layer_node.firstChildElement( QStringLiteral(
"legend" ) );
1454 if ( !legendElem.isNull() )
1455 legend->
readXml( legendElem, context );
1459 if ( mReadExtentFromXml )
1461 QDomNode extentNode = layer_node.namedItem( QStringLiteral(
"extent" ) );
1462 if ( !extentNode.isNull() )
1469 const QDomNode asNode = layer_node.namedItem( QStringLiteral(
"auxiliaryLayer" ) );
1470 const QDomElement asElem = asNode.toElement();
1471 if ( !asElem.isNull() )
1473 mAuxiliaryLayerKey = asElem.attribute( QStringLiteral(
"key" ) );
1484 setDataSource( dataSource, baseName, provider, options, loadDefaultStyleFlag );
1493 setDataProvider( provider, options );
1507 bool defaultLoadedFlag =
false;
1512 std::unique_ptr< QgsFeatureRenderer > defaultRenderer( mDataProvider->
createRenderer() );
1513 if ( defaultRenderer )
1515 defaultLoadedFlag =
true;
1522 if ( !defaultLoadedFlag && loadDefaultStyleFlag )
1528 if ( !defaultLoadedFlag &&
isSpatial() )
1538 std::unique_ptr< QgsAbstractVectorLayerLabeling > defaultLabeling( mDataProvider->
createLabeling() );
1539 if ( defaultLabeling )
1556 std::unique_ptr< QgsFeatureRenderer > defaultRenderer( mDataProvider->
createRenderer() );
1557 if ( defaultRenderer )
1575 QString checkUnicityKey = QStringLiteral(
"checkPrimaryKeyUnicity" );
1577 if ( provider.compare( QLatin1String(
"postgres" ) ) == 0 )
1581 if ( uri.
hasParam( checkUnicityKey ) )
1584 uri.
setParam( checkUnicityKey, mReadExtentFromXml ?
"0" :
"1" );
1585 dataSource = uri.
uri(
false );
1588 delete mDataProvider;
1590 if ( !mDataProvider )
1597 mDataProvider->setParent(
this );
1600 QgsDebugMsgLevel( QStringLiteral(
"Instantiated the data provider plugin" ), 2 );
1611 QgsDebugMsgLevel( QStringLiteral(
"Set Data provider QgsLayerMetadata identifier[%1]" ).arg(
metadata().identifier() ), 4 );
1618 mWkbType = mDataProvider->
wkbType();
1627 QRegExp reg( R
"lit("[^"]+"\."([^"] + )"( \([^)]+\))?)lit" ); 1628 if ( reg.indexIn(
name() ) >= 0 )
1630 QStringList stuff = reg.capturedTexts();
1631 QString lName = stuff[1];
1635 QMap<QString, QgsMapLayer *>::const_iterator it;
1636 for ( it = layers.constBegin(); it != layers.constEnd() && ( *it )->name() != lName; ++it )
1639 if ( it != layers.constEnd() && stuff.size() > 2 )
1641 lName +=
'.' + stuff[2].mid( 2, stuff[2].length() - 3 );
1644 if ( !lName.isEmpty() )
1653 if ( dataProviderUri.hasParam( checkUnicityKey ) )
1662 else if ( provider == QLatin1String(
"ogr" ) )
1666 if (
mDataSource.right( 10 ) == QLatin1String(
"|layerid=0" ) )
1669 else if ( provider == QStringLiteral(
"memory" ) )
1686 QDomDocument &document,
1691 QDomElement mapLayerNode = layer_node.toElement();
1693 if ( mapLayerNode.isNull() || (
"maplayer" != mapLayerNode.nodeName() ) )
1699 mapLayerNode.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"vector" ) );
1705 if ( mDataProvider )
1707 QDomElement provider = document.createElement( QStringLiteral(
"provider" ) );
1708 provider.setAttribute( QStringLiteral(
"encoding" ), mDataProvider->
encoding() );
1709 QDomText providerText = document.createTextNode(
providerType() );
1710 provider.appendChild( providerText );
1711 layer_node.appendChild( provider );
1715 mJoinBuffer->
writeXml( layer_node, document );
1718 QDomElement dependenciesElement = document.createElement( QStringLiteral(
"layerDependencies" ) );
1723 QDomElement depElem = document.createElement( QStringLiteral(
"layer" ) );
1724 depElem.setAttribute( QStringLiteral(
"id" ), dep.
layerId() );
1725 dependenciesElement.appendChild( depElem );
1727 layer_node.appendChild( dependenciesElement );
1730 QDomElement dataDependenciesElement = document.createElement( QStringLiteral(
"dataDependencies" ) );
1735 QDomElement depElem = document.createElement( QStringLiteral(
"layer" ) );
1736 depElem.setAttribute( QStringLiteral(
"id" ), dep.
layerId() );
1737 dataDependenciesElement.appendChild( depElem );
1739 layer_node.appendChild( dataDependenciesElement );
1744 QDomElement legendElement =
legend()->
writeXml( document, context );
1745 if ( !legendElement.isNull() )
1746 layer_node.appendChild( legendElement );
1750 mExpressionFieldBuffer->
writeXml( layer_node, document );
1755 QDomElement asElem = document.createElement( QStringLiteral(
"auxiliaryLayer" ) );
1756 if ( mAuxiliaryLayer )
1758 const QString pkField = mAuxiliaryLayer->joinInfo().targetFieldName();
1759 asElem.setAttribute( QStringLiteral(
"key" ), pkField );
1761 layer_node.appendChild( asElem );
1765 return writeSymbology( layer_node, document, errorMsg, context );
1770 QString src( source );
1782 QStringList theURIParts = src.split(
'|' );
1784 src = theURIParts.join( QStringLiteral(
"|" ) );
1788 QStringList theURIParts = src.split(
'?' );
1790 src = theURIParts.join( QStringLiteral(
"?" ) );
1792 else if (
providerType() == QLatin1String(
"delimitedtext" ) )
1794 QUrl urlSource = QUrl::fromEncoded( src.toLatin1() );
1796 urlDest.setQueryItems( urlSource.queryItems() );
1797 src = QString::fromLatin1( urlDest.toEncoded() );
1799 else if (
providerType() == QLatin1String(
"memory" ) )
1814 QString src( source );
1816 if ( provider == QLatin1String(
"spatialite" ) )
1822 else if ( provider == QLatin1String(
"ogr" ) )
1824 QStringList theURIParts = src.split(
'|' );
1826 src = theURIParts.join( QStringLiteral(
"|" ) );
1828 else if ( provider == QLatin1String(
"gpx" ) )
1830 QStringList theURIParts = src.split(
'?' );
1832 src = theURIParts.join( QStringLiteral(
"?" ) );
1834 else if ( provider == QLatin1String(
"delimitedtext" ) )
1836 QUrl urlSource = QUrl::fromEncoded( src.toLatin1() );
1838 if ( !src.startsWith( QLatin1String(
"file:" ) ) )
1840 QUrl file = QUrl::fromLocalFile( src.left( src.indexOf(
'?' ) ) );
1841 urlSource.setScheme( QStringLiteral(
"file" ) );
1842 urlSource.setPath( file.path() );
1845 QUrl urlDest = QUrl::fromLocalFile( context.
pathResolver().
readPath( urlSource.toLocalFile() ) );
1846 urlDest.setQueryItems( urlSource.queryItems() );
1847 src = QString::fromLatin1( urlDest.toEncoded() );
1871 if ( categories.testFlag(
Fields ) )
1873 if ( !mExpressionFieldBuffer )
1875 mExpressionFieldBuffer->
readXml( layerNode );
1880 QDomElement layerElement = layerNode.toElement();
1884 readStyle( layerNode, errorMessage, context, categories );
1886 if ( categories.testFlag(
MapTips ) )
1887 mMapTipTemplate = layerNode.namedItem( QStringLiteral(
"mapTip" ) ).toElement().text();
1890 mDisplayExpression = layerNode.namedItem( QStringLiteral(
"previewExpression" ) ).toElement().text();
1893 QString
displayField = layerNode.namedItem( QStringLiteral(
"displayfield" ) ).toElement().text();
1897 if ( mMapTipTemplate.isEmpty() && categories.testFlag(
MapTips ) )
1898 mMapTipTemplate = displayField;
1907 if ( categories.testFlag(
Actions ) )
1908 mActions->
readXml( layerNode );
1910 if ( categories.testFlag(
Fields ) )
1912 mAttributeAliasMap.clear();
1913 QDomNode aliasesNode = layerNode.namedItem( QStringLiteral(
"aliases" ) );
1914 if ( !aliasesNode.isNull() )
1916 QDomElement aliasElem;
1918 QDomNodeList aliasNodeList = aliasesNode.toElement().elementsByTagName( QStringLiteral(
"alias" ) );
1919 for (
int i = 0; i < aliasNodeList.size(); ++i )
1921 aliasElem = aliasNodeList.at( i ).toElement();
1924 if ( aliasElem.hasAttribute( QStringLiteral(
"field" ) ) )
1926 field = aliasElem.attribute( QStringLiteral(
"field" ) );
1930 int index = aliasElem.attribute( QStringLiteral(
"index" ) ).toInt();
1932 if ( index >= 0 && index <
fields().count() )
1938 if ( !aliasElem.attribute( QStringLiteral(
"name" ) ).isEmpty() )
1941 alias = context.
projectTranslator()->
translate( QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ), aliasElem.attribute( QStringLiteral(
"name" ) ) );
1942 QgsDebugMsgLevel(
"context" + QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ) +
" source " + aliasElem.attribute( QStringLiteral(
"name" ) ), 3 );
1947 alias = context.
projectTranslator()->
translate( QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ), field );
1948 QgsDebugMsgLevel(
"context" + QStringLiteral(
"project:layers:%1:fieldaliases" ).arg( layerNode.namedItem( QStringLiteral(
"id" ) ).toElement().text() ) +
" source " + field, 3 );
1950 if ( alias == aliasElem.attribute( QStringLiteral(
"field" ) ) )
1954 QgsDebugMsgLevel(
"field " + field +
" origalias " + aliasElem.attribute( QStringLiteral(
"name" ) ) +
" trans " + alias, 3 );
1955 mAttributeAliasMap.insert( field, alias );
1960 mDefaultExpressionMap.clear();
1961 QDomNode defaultsNode = layerNode.namedItem( QStringLiteral(
"defaults" ) );
1962 if ( !defaultsNode.isNull() )
1964 QDomNodeList defaultNodeList = defaultsNode.toElement().elementsByTagName( QStringLiteral(
"default" ) );
1965 for (
int i = 0; i < defaultNodeList.size(); ++i )
1967 QDomElement defaultElem = defaultNodeList.at( i ).toElement();
1969 QString field = defaultElem.attribute( QStringLiteral(
"field" ), QString() );
1970 QString expression = defaultElem.attribute( QStringLiteral(
"expression" ), QString() );
1971 bool applyOnUpdate = defaultElem.attribute( QStringLiteral(
"applyOnUpdate" ), QStringLiteral(
"0" ) ) == QLatin1String(
"1" );
1972 if ( field.isEmpty() || expression.isEmpty() )
1975 mDefaultExpressionMap.insert( field,
QgsDefaultValue( expression, applyOnUpdate ) );
1980 mFieldConstraints.clear();
1981 mFieldConstraintStrength.clear();
1982 QDomNode constraintsNode = layerNode.namedItem( QStringLiteral(
"constraints" ) );
1983 if ( !constraintsNode.isNull() )
1985 QDomNodeList constraintNodeList = constraintsNode.toElement().elementsByTagName( QStringLiteral(
"constraint" ) );
1986 for (
int i = 0; i < constraintNodeList.size(); ++i )
1988 QDomElement constraintElem = constraintNodeList.at( i ).toElement();
1990 QString field = constraintElem.attribute( QStringLiteral(
"field" ), QString() );
1991 int constraints = constraintElem.attribute( QStringLiteral(
"constraints" ), QStringLiteral(
"0" ) ).toInt();
1992 if ( field.isEmpty() || constraints == 0 )
1995 mFieldConstraints.insert( field, static_cast< QgsFieldConstraints::Constraints >( constraints ) );
1997 int uniqueStrength = constraintElem.attribute( QStringLiteral(
"unique_strength" ), QStringLiteral(
"1" ) ).toInt();
1998 int notNullStrength = constraintElem.attribute( QStringLiteral(
"notnull_strength" ), QStringLiteral(
"1" ) ).toInt();
1999 int expStrength = constraintElem.attribute( QStringLiteral(
"exp_strength" ), QStringLiteral(
"1" ) ).toInt();
2006 mFieldConstraintExpressions.clear();
2007 QDomNode constraintExpressionsNode = layerNode.namedItem( QStringLiteral(
"constraintExpressions" ) );
2008 if ( !constraintExpressionsNode.isNull() )
2010 QDomNodeList constraintNodeList = constraintExpressionsNode.toElement().elementsByTagName( QStringLiteral(
"constraint" ) );
2011 for (
int i = 0; i < constraintNodeList.size(); ++i )
2013 QDomElement constraintElem = constraintNodeList.at( i ).toElement();
2015 QString field = constraintElem.attribute( QStringLiteral(
"field" ), QString() );
2016 QString exp = constraintElem.attribute( QStringLiteral(
"exp" ), QString() );
2017 QString desc = constraintElem.attribute( QStringLiteral(
"desc" ), QString() );
2018 if ( field.isEmpty() || exp.isEmpty() )
2021 mFieldConstraintExpressions.insert( field, qMakePair( exp, desc ) );
2028 mExcludeAttributesWMS.clear();
2029 QDomNode excludeWMSNode = layerNode.namedItem( QStringLiteral(
"excludeAttributesWMS" ) );
2030 if ( !excludeWMSNode.isNull() )
2032 QDomNodeList attributeNodeList = excludeWMSNode.toElement().elementsByTagName( QStringLiteral(
"attribute" ) );
2033 for (
int i = 0; i < attributeNodeList.size(); ++i )
2035 mExcludeAttributesWMS.insert( attributeNodeList.at( i ).toElement().text() );
2039 mExcludeAttributesWFS.clear();
2040 QDomNode excludeWFSNode = layerNode.namedItem( QStringLiteral(
"excludeAttributesWFS" ) );
2041 if ( !excludeWFSNode.isNull() )
2043 QDomNodeList attributeNodeList = excludeWFSNode.toElement().elementsByTagName( QStringLiteral(
"attribute" ) );
2044 for (
int i = 0; i < attributeNodeList.size(); ++i )
2046 mExcludeAttributesWFS.insert( attributeNodeList.at( i ).toElement().text() );
2051 QDomElement widgetsElem = layerNode.namedItem( QStringLiteral(
"fieldConfiguration" ) ).toElement();
2052 QDomNodeList fieldConfigurationElementList = widgetsElem.elementsByTagName( QStringLiteral(
"field" ) );
2053 for (
int i = 0; i < fieldConfigurationElementList.size(); ++i )
2055 const QDomElement fieldConfigElement = fieldConfigurationElementList.at( i ).toElement();
2056 const QDomElement fieldWidgetElement = fieldConfigElement.elementsByTagName( QStringLiteral(
"editWidget" ) ).at( 0 ).toElement();
2058 QString fieldName = fieldConfigElement.attribute( QStringLiteral(
"name" ) );
2060 const QString widgetType = fieldWidgetElement.attribute( QStringLiteral(
"type" ) );
2061 const QDomElement cfgElem = fieldConfigElement.elementsByTagName( QStringLiteral(
"config" ) ).at( 0 ).toElement();
2062 const QDomElement optionsElem = cfgElem.childNodes().at( 0 ).toElement();
2064 if ( widgetType == QStringLiteral(
"ValueRelation" ) )
2066 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() );
2069 mFieldWidgetSetups[fieldName] = setup;
2074 mGeometryOptions->readXml( layerNode.namedItem( QStringLiteral(
"geometryOptions" ) ) );
2076 if ( categories.testFlag(
Forms ) )
2077 mEditFormConfig.
readXml( layerNode, context );
2081 mAttributeTableConfig.
readXml( layerNode );
2082 mConditionalStyles->
readXml( layerNode, context );
2088 QDomElement mapLayerNode = layerNode.toElement();
2090 && mapLayerNode.attribute( QStringLiteral(
"readOnly" ), QStringLiteral(
"0" ) ).toInt() == 1 )
2110 if ( !rendererElement.isNull() )
2130 if ( categories.testFlag(
Labeling ) )
2132 QDomElement labelingElement = node.firstChildElement( QStringLiteral(
"labeling" ) );
2134 if ( labelingElement.isNull() ||
2135 ( labelingElement.attribute( QStringLiteral(
"type" ) ) == QLatin1String(
"simple" ) && labelingElement.firstChildElement( QStringLiteral(
"settings" ) ).isNull() ) )
2143 labeling = readLabelingFromCustomProperties();
2151 if ( node.toElement().hasAttribute( QStringLiteral(
"labelsEnabled" ) ) )
2152 mLabelsEnabled = node.toElement().attribute( QStringLiteral(
"labelsEnabled" ) ).toInt();
2154 mLabelsEnabled =
true;
2160 QDomNode blendModeNode = node.namedItem( QStringLiteral(
"blendMode" ) );
2161 if ( !blendModeNode.isNull() )
2163 QDomElement e = blendModeNode.toElement();
2168 QDomNode featureBlendModeNode = node.namedItem( QStringLiteral(
"featureBlendMode" ) );
2169 if ( !featureBlendModeNode.isNull() )
2171 QDomElement e = featureBlendModeNode.toElement();
2179 QDomNode layerTransparencyNode = node.namedItem( QStringLiteral(
"layerTransparency" ) );
2180 if ( !layerTransparencyNode.isNull() )
2182 QDomElement e = layerTransparencyNode.toElement();
2183 setOpacity( 1.0 - e.text().toInt() / 100.0 );
2185 QDomNode layerOpacityNode = node.namedItem( QStringLiteral(
"layerOpacity" ) );
2186 if ( !layerOpacityNode.isNull() )
2188 QDomElement e = layerOpacityNode.toElement();
2195 QDomElement e = node.toElement();
2198 mSimplifyMethod.
setSimplifyHints( static_cast< QgsVectorSimplifyMethod::SimplifyHints >( e.attribute( QStringLiteral(
"simplifyDrawingHints" ), QStringLiteral(
"1" ) ).toInt() ) );
2199 mSimplifyMethod.
setSimplifyAlgorithm( static_cast< QgsVectorSimplifyMethod::SimplifyAlgorithm >( e.attribute( QStringLiteral(
"simplifyAlgorithm" ), QStringLiteral(
"0" ) ).toInt() ) );
2200 mSimplifyMethod.
setThreshold( e.attribute( QStringLiteral(
"simplifyDrawingTol" ), QStringLiteral(
"1" ) ).toFloat() );
2201 mSimplifyMethod.
setForceLocalOptimization( e.attribute( QStringLiteral(
"simplifyLocal" ), QStringLiteral(
"1" ) ).toInt() );
2202 mSimplifyMethod.
setMaximumScale( e.attribute( QStringLiteral(
"simplifyMaxScale" ), QStringLiteral(
"1" ) ).toFloat() );
2206 if ( categories.testFlag(
Diagrams ) )
2208 delete mDiagramRenderer;
2209 mDiagramRenderer =
nullptr;
2210 QDomElement singleCatDiagramElem = node.firstChildElement( QStringLiteral(
"SingleCategoryDiagramRenderer" ) );
2211 if ( !singleCatDiagramElem.isNull() )
2214 mDiagramRenderer->
readXml( singleCatDiagramElem, context );
2216 QDomElement linearDiagramElem = node.firstChildElement( QStringLiteral(
"LinearlyInterpolatedDiagramRenderer" ) );
2217 if ( !linearDiagramElem.isNull() )
2219 if ( linearDiagramElem.hasAttribute( QStringLiteral(
"classificationAttribute" ) ) )
2222 int idx = linearDiagramElem.attribute( QStringLiteral(
"classificationAttribute" ) ).toInt();
2223 if ( idx >= 0 && idx < mFields.
count() )
2224 linearDiagramElem.setAttribute( QStringLiteral(
"classificationField" ), mFields.
at( idx ).
name() );
2228 mDiagramRenderer->
readXml( linearDiagramElem, context );
2231 if ( mDiagramRenderer )
2233 QDomElement diagramSettingsElem = node.firstChildElement( QStringLiteral(
"DiagramLayerSettings" ) );
2234 if ( !diagramSettingsElem.isNull() )
2236 bool oldXPos = diagramSettingsElem.hasAttribute( QStringLiteral(
"xPosColumn" ) );
2237 bool oldYPos = diagramSettingsElem.hasAttribute( QStringLiteral(
"yPosColumn" ) );
2238 bool oldShow = diagramSettingsElem.hasAttribute( QStringLiteral(
"showColumn" ) );
2239 if ( oldXPos || oldYPos || oldShow )
2245 int xPosColumn = diagramSettingsElem.attribute( QStringLiteral(
"xPosColumn" ) ).toInt();
2246 if ( xPosColumn >= 0 && xPosColumn < mFields.
count() )
2251 int yPosColumn = diagramSettingsElem.attribute( QStringLiteral(
"yPosColumn" ) ).toInt();
2252 if ( yPosColumn >= 0 && yPosColumn < mFields.
count() )
2257 int showColumn = diagramSettingsElem.attribute( QStringLiteral(
"showColumn" ) ).toInt();
2258 if ( showColumn >= 0 && showColumn < mFields.
count() )
2261 QDomElement propertiesElem = diagramSettingsElem.ownerDocument().createElement( QStringLiteral(
"properties" ) );
2268 ddp.
writeXml( propertiesElem, defs );
2269 diagramSettingsElem.appendChild( propertiesElem );
2272 delete mDiagramLayerSettings;
2274 mDiagramLayerSettings->
readXml( diagramSettingsElem );
2287 QDomElement layerElement = node.toElement();
2290 ( void )
writeStyle( node, doc, errorMessage, context, categories );
2293 mGeometryOptions->writeXml( node );
2295 if ( categories.testFlag(
Fields ) )
2297 QDomElement fieldConfigurationElement = doc.createElement( QStringLiteral(
"fieldConfiguration" ) );
2298 node.appendChild( fieldConfigurationElement );
2301 Q_FOREACH (
const QgsField &field, mFields )
2303 QDomElement fieldElement = doc.createElement( QStringLiteral(
"field" ) );
2304 fieldElement.setAttribute( QStringLiteral(
"name" ), field.
name() );
2306 fieldConfigurationElement.appendChild( fieldElement );
2311 QDomElement editWidgetElement = doc.createElement( QStringLiteral(
"editWidget" ) );
2312 fieldElement.appendChild( editWidgetElement );
2314 QDomElement editWidgetConfigElement = doc.createElement( QStringLiteral(
"config" ) );
2317 editWidgetElement.appendChild( editWidgetConfigElement );
2324 QDomElement aliasElem = doc.createElement( QStringLiteral(
"aliases" ) );
2325 Q_FOREACH (
const QgsField &field, mFields )
2327 QDomElement aliasEntryElem = doc.createElement( QStringLiteral(
"alias" ) );
2328 aliasEntryElem.setAttribute( QStringLiteral(
"field" ), field.
name() );
2329 aliasEntryElem.setAttribute( QStringLiteral(
"index" ), mFields.
indexFromName( field.
name() ) );
2330 aliasEntryElem.setAttribute( QStringLiteral(
"name" ), field.
alias() );
2331 aliasElem.appendChild( aliasEntryElem );
2333 node.appendChild( aliasElem );
2336 QDomElement excludeWMSElem = doc.createElement( QStringLiteral(
"excludeAttributesWMS" ) );
2337 QSet<QString>::const_iterator attWMSIt = mExcludeAttributesWMS.constBegin();
2338 for ( ; attWMSIt != mExcludeAttributesWMS.constEnd(); ++attWMSIt )
2340 QDomElement attrElem = doc.createElement( QStringLiteral(
"attribute" ) );
2341 QDomText attrText = doc.createTextNode( *attWMSIt );
2342 attrElem.appendChild( attrText );
2343 excludeWMSElem.appendChild( attrElem );
2345 node.appendChild( excludeWMSElem );
2348 QDomElement excludeWFSElem = doc.createElement( QStringLiteral(
"excludeAttributesWFS" ) );
2349 QSet<QString>::const_iterator attWFSIt = mExcludeAttributesWFS.constBegin();
2350 for ( ; attWFSIt != mExcludeAttributesWFS.constEnd(); ++attWFSIt )
2352 QDomElement attrElem = doc.createElement( QStringLiteral(
"attribute" ) );
2353 QDomText attrText = doc.createTextNode( *attWFSIt );
2354 attrElem.appendChild( attrText );
2355 excludeWFSElem.appendChild( attrElem );
2357 node.appendChild( excludeWFSElem );
2360 QDomElement defaultsElem = doc.createElement( QStringLiteral(
"defaults" ) );
2361 Q_FOREACH (
const QgsField &field, mFields )
2363 QDomElement defaultElem = doc.createElement( QStringLiteral(
"default" ) );
2364 defaultElem.setAttribute( QStringLiteral(
"field" ), field.
name() );
2367 defaultsElem.appendChild( defaultElem );
2369 node.appendChild( defaultsElem );
2372 QDomElement constraintsElem = doc.createElement( QStringLiteral(
"constraints" ) );
2373 Q_FOREACH (
const QgsField &field, mFields )
2375 QDomElement constraintElem = doc.createElement( QStringLiteral(
"constraint" ) );
2376 constraintElem.setAttribute( QStringLiteral(
"field" ), field.
name() );
2381 constraintsElem.appendChild( constraintElem );
2383 node.appendChild( constraintsElem );
2386 QDomElement constraintExpressionsElem = doc.createElement( QStringLiteral(
"constraintExpressions" ) );
2387 Q_FOREACH (
const QgsField &field, mFields )
2389 QDomElement constraintExpressionElem = doc.createElement( QStringLiteral(
"constraint" ) );
2390 constraintExpressionElem.setAttribute( QStringLiteral(
"field" ), field.
name() );
2393 constraintExpressionsElem.appendChild( constraintExpressionElem );
2395 node.appendChild( constraintExpressionsElem );
2398 if ( !mExpressionFieldBuffer )
2406 mExpressionFieldBuffer->
writeXml( node, doc );
2411 if ( categories.testFlag(
Actions ) )
2416 mAttributeTableConfig.
writeXml( node );
2417 mConditionalStyles->
writeXml( node, doc, context );
2420 if ( categories.testFlag(
Forms ) )
2421 mEditFormConfig.
writeXml( node, context );
2425 node.toElement().setAttribute( QStringLiteral(
"readOnly" ), mReadOnly );
2430 QDomElement prevExpElem = doc.createElement( QStringLiteral(
"previewExpression" ) );
2431 QDomText prevExpText = doc.createTextNode( mDisplayExpression );
2432 prevExpElem.appendChild( prevExpText );
2433 node.appendChild( prevExpElem );
2437 if ( categories.testFlag(
MapTips ) )
2439 QDomElement mapTipElem = doc.createElement( QStringLiteral(
"mapTip" ) );
2440 QDomText mapTipText = doc.createTextNode( mMapTipTemplate );
2441 mapTipElem.appendChild( mapTipText );
2442 node.toElement().appendChild( mapTipElem );
2451 QDomElement mapLayerNode = node.toElement();
2461 QDomElement rendererElement = mRenderer->
save( doc, context );
2462 node.appendChild( rendererElement );
2466 if ( categories.testFlag(
Labeling ) )
2470 QDomElement labelingElement = mLabeling->
save( doc, context );
2471 node.appendChild( labelingElement );
2473 mapLayerNode.setAttribute( QStringLiteral(
"labelsEnabled" ), mLabelsEnabled ? QStringLiteral(
"1" ) : QStringLiteral(
"0" ) );
2479 mapLayerNode.setAttribute( QStringLiteral(
"simplifyDrawingHints" ), QString::number( mSimplifyMethod.
simplifyHints() ) );
2480 mapLayerNode.setAttribute( QStringLiteral(
"simplifyAlgorithm" ), QString::number( mSimplifyMethod.
simplifyAlgorithm() ) );
2481 mapLayerNode.setAttribute( QStringLiteral(
"simplifyDrawingTol" ), QString::number( mSimplifyMethod.
threshold() ) );
2482 mapLayerNode.setAttribute( QStringLiteral(
"simplifyLocal" ), mSimplifyMethod.
forceLocalOptimization() ? 1 : 0 );
2483 mapLayerNode.setAttribute( QStringLiteral(
"simplifyMaxScale" ), QString::number( mSimplifyMethod.
maximumScale() ) );
2495 QDomElement blendModeElem = doc.createElement( QStringLiteral(
"blendMode" ) );
2497 blendModeElem.appendChild( blendModeText );
2498 node.appendChild( blendModeElem );
2501 QDomElement featureBlendModeElem = doc.createElement( QStringLiteral(
"featureBlendMode" ) );
2503 featureBlendModeElem.appendChild( featureBlendModeText );
2504 node.appendChild( featureBlendModeElem );
2510 QDomElement layerOpacityElem = doc.createElement( QStringLiteral(
"layerOpacity" ) );
2511 QDomText layerOpacityText = doc.createTextNode( QString::number(
opacity() ) );
2512 layerOpacityElem.appendChild( layerOpacityText );
2513 node.appendChild( layerOpacityElem );
2516 if ( categories.testFlag(
Diagrams ) && mDiagramRenderer )
2518 mDiagramRenderer->
writeXml( mapLayerNode, doc, context );
2519 if ( mDiagramLayerSettings )
2520 mDiagramLayerSettings->
writeXml( mapLayerNode, doc );
2529 QDomElement nameElem = node.firstChildElement( QStringLiteral(
"Name" ) );
2530 if ( nameElem.isNull() )
2532 errorMessage = QStringLiteral(
"Warning: Name element not found within NamedLayer while it's required." );
2544 readSldLabeling( node );
2551 Q_UNUSED( errorMessage );
2562 QDomElement nameNode = doc.createElement( QStringLiteral(
"se:Name" ) );
2563 nameNode.appendChild( doc.createTextNode(
name() ) );
2564 node.appendChild( nameNode );
2566 QDomElement userStyleElem = doc.createElement( QStringLiteral(
"UserStyle" ) );
2567 node.appendChild( userStyleElem );
2569 QDomElement nameElem = doc.createElement( QStringLiteral(
"se:Name" ) );
2570 nameElem.appendChild( doc.createTextNode(
name() ) );
2572 userStyleElem.appendChild( nameElem );
2574 QDomElement featureTypeStyleElem = doc.createElement( QStringLiteral(
"se:FeatureTypeStyle" ) );
2575 userStyleElem.appendChild( featureTypeStyleElem );
2577 mRenderer->
toSld( doc, featureTypeStyleElem, localProps );
2580 mLabeling->
toSld( featureTypeStyleElem, localProps );
2589 if ( !mEditBuffer || !mDataProvider )
2594 if ( mGeometryOptions->isActive() )
2595 mGeometryOptions->apply( geom );
2604 if ( !skipDefaultValue && !mDefaultValueOnUpdateFields.isEmpty() )
2605 updateDefaultValues( fid );
2613 bool result =
false;
2615 switch (
fields().fieldOrigin( field ) )
2625 if ( mEditBuffer && mDataProvider )
2634 if ( result && !skipDefaultValues && !mDefaultValueOnUpdateFields.isEmpty() )
2635 updateDefaultValues( fid );
2650 for (
auto it = newValues.constBegin(); it != newValues.constEnd(); ++it )
2652 const int field = it.key();
2653 const QVariant newValue = it.value();
2656 if ( oldValues.contains( field ) )
2657 oldValue = oldValues[field];
2662 newValuesJoin[field] = newValue;
2663 oldValuesJoin[field] = oldValue;
2670 newValuesNotJoin[field] = newValue;
2671 oldValuesNotJoin[field] = oldValue;
2680 if ( ! newValuesJoin.isEmpty() && mJoinBuffer )
2685 if ( ! newValuesNotJoin.isEmpty() && mEditBuffer && mDataProvider )
2690 if ( result && !skipDefaultValues && !mDefaultValueOnUpdateFields.isEmpty() )
2692 updateDefaultValues( fid );
2700 if ( !mEditBuffer || !mDataProvider )
2708 if ( attIndex < 0 || attIndex >=
fields().count() )
2712 mFields[ attIndex ].setAlias( QString() );
2713 if ( mAttributeAliasMap.contains( name ) )
2715 mAttributeAliasMap.remove( name );
2717 mEditFormConfig.setFields( mFields );
2724 if ( index < 0 || index >=
fields().count() )
2731 if ( mExpressionFieldBuffer )
2747 if ( !mEditBuffer || !mDataProvider )
2763 if ( attIndex < 0 || attIndex >=
fields().count() )
2768 mAttributeAliasMap.insert( name, aliasString );
2769 mFields[ attIndex ].setAlias( aliasString );
2770 mEditFormConfig.setFields( mFields );
2776 if ( index < 0 || index >=
fields().count() )
2784 if ( index >= 0 && index < mFields.
count() )
2792 return mAttributeAliasMap;
2797 if ( index < 0 || index >=
fields().count() )
2806 if ( !mEditBuffer || !mDataProvider )
2814 bool deleted =
false;
2817 QList<int> attrList = attrs.toSet().toList();
2819 std::sort( attrList.begin(), attrList.end(), std::greater<int>() );
2821 for (
int attr : qgis::as_const( attrList ) )
2843 mSelectedFeatureIds.remove( fid );
2854 QgsDebugMsgLevel( QStringLiteral(
"Cannot delete features (mEditBuffer==NULL)" ), 1 );
2865 mSelectedFeatureIds.subtract( fids );
2882 for (
int i = 0; i < mFields.
count(); ++i )
2886 pkAttributesList << i;
2889 return pkAttributesList;
2894 if ( ! mDataProvider )
2905 if ( mEditBuffer && !deletedFeatures.empty() )
2907 if ( addedFeatures.size() > deletedFeatures.size() )
2908 return QgsFeatureSource::FeatureAvailability::FeaturesAvailable;
2910 return QgsFeatureSource::FeatureAvailability::FeaturesMaybeAvailable;
2913 if ( ( !mEditBuffer || addedFeatures.empty() ) && mDataProvider->
empty() )
2914 return QgsFeatureSource::FeatureAvailability::NoFeaturesAvailable;
2916 return QgsFeatureSource::FeatureAvailability::FeaturesAvailable;
2921 mCommitErrors.clear();
2923 if ( !mDataProvider )
2925 mCommitErrors << tr(
"ERROR: no provider" );
2931 mCommitErrors << tr(
"ERROR: layer not editable" );
2937 if ( !mAllowCommit )
2945 mEditBuffer =
nullptr;
2966 return mCommitErrors;
2998 mEditBuffer =
nullptr;
3003 if ( rollbackExtent )
3014 return mSelectedFeatureIds.size();
3019 return mSelectedFeatureIds;
3025 features.reserve( mSelectedFeatureIds.count() );
3028 if ( mSelectedFeatureIds.count() <= 8 )
3044 features.push_back( f );
3053 if ( mSelectedFeatureIds.isEmpty() )
3059 if ( mSelectedFeatureIds.count() == 1 )
3060 request.
setFilterFid( *mSelectedFeatureIds.constBegin() );
3069 if ( !mEditBuffer || !mDataProvider )
3072 if ( mGeometryOptions->isActive() )
3074 for (
auto feature = features.begin(); feature != features.end(); ++feature )
3077 mGeometryOptions->apply( geom );
3110 if ( mDisplayExpression == displayExpression )
3119 if ( !mDisplayExpression.isEmpty() || mFields.
isEmpty() )
3121 return mDisplayExpression;
3127 Q_FOREACH (
const QgsField &field, mFields )
3129 QString fldName = field.
name();
3135 if ( fldName.indexOf( QLatin1String(
"name" ), 0, Qt::CaseInsensitive ) > -1 )
3140 if ( fldName.indexOf( QLatin1String(
"descrip" ), 0, Qt::CaseInsensitive ) > -1 )
3145 if ( fldName.indexOf( QLatin1String(
"id" ), 0, Qt::CaseInsensitive ) > -1 )
3152 if ( !idxName.isNull() )
3165 return ( mEditBuffer && mDataProvider );
3174 bool QgsVectorLayer::isReadOnly()
const 3182 if ( readonly && mEditBuffer )
3185 mReadOnly = readonly;
3193 return mEditBuffer && mEditBuffer->
isModified();
3198 bool auxiliaryField =
false;
3202 return auxiliaryField;
3209 auxiliaryField =
true;
3212 return auxiliaryField;
3220 if ( r != mRenderer )
3224 mSymbolFeatureCounted =
false;
3225 mSymbolFeatureCountMap.clear();
3234 if ( !mDataProvider )
3240 QString ignoredError;
3244 mEditCommandActive =
true;
3250 if ( !mDataProvider )
3255 mEditCommandActive =
false;
3256 if ( !mDeletedFids.isEmpty() )
3259 mDeletedFids.clear();
3266 if ( !mDataProvider )
3277 std::unique_ptr< QUndoCommand > command = qgis::make_unique< QUndoCommand >();
3278 command->setObsolete(
true );
3281 mEditCommandActive =
false;
3282 mDeletedFids.clear();
3288 return mJoinBuffer->
addJoin( joinInfo );
3294 return mJoinBuffer->
removeJoin( joinLayerId );
3324 if ( oi < 0 || oi >= mExpressionFieldBuffer->
expressions().size() )
3327 return mExpressionFieldBuffer->
expressions().at( oi ).cachedExpression.expression();
3338 if ( !mDataProvider )
3343 mFields = mDataProvider->
fields();
3353 if ( mExpressionFieldBuffer )
3357 QMap< QString, QString >::const_iterator aliasIt = mAttributeAliasMap.constBegin();
3358 for ( ; aliasIt != mAttributeAliasMap.constEnd(); ++aliasIt )
3364 mFields[ index ].setAlias( aliasIt.value() );
3368 mDefaultValueOnUpdateFields.clear();
3369 QMap< QString, QgsDefaultValue >::const_iterator defaultIt = mDefaultExpressionMap.constBegin();
3370 for ( ; defaultIt != mDefaultExpressionMap.constEnd(); ++defaultIt )
3372 int index = mFields.
lookupField( defaultIt.key() );
3376 mFields[ index ].setDefaultValueDefinition( defaultIt.value() );
3377 if ( defaultIt.value().applyOnUpdate() )
3378 mDefaultValueOnUpdateFields.insert( index );
3381 QMap< QString, QgsFieldConstraints::Constraints >::const_iterator constraintIt = mFieldConstraints.constBegin();
3382 for ( ; constraintIt != mFieldConstraints.constEnd(); ++constraintIt )
3384 int index = mFields.
lookupField( constraintIt.key() );
3397 mFields[ index ].setConstraints( constraints );
3400 QMap< QString, QPair< QString, QString > >::const_iterator constraintExpIt = mFieldConstraintExpressions.constBegin();
3401 for ( ; constraintExpIt != mFieldConstraintExpressions.constEnd(); ++constraintExpIt )
3403 int index = mFields.
lookupField( constraintExpIt.key() );
3414 mFields[ index ].setConstraints( constraints );
3418 for ( ; constraintStrengthIt != mFieldConstraintStrength.constEnd(); ++constraintStrengthIt )
3420 int index = mFields.
lookupField( constraintStrengthIt.key().first );
3430 constraints.
setConstraintStrength( constraintStrengthIt.key().second, constraintStrengthIt.value() );
3431 mFields[ index ].setConstraints( constraints );
3434 auto fieldWidgetIterator = mFieldWidgetSetups.constBegin();
3435 for ( ; fieldWidgetIterator != mFieldWidgetSetups.constEnd(); ++ fieldWidgetIterator )
3437 int index = mFields.
indexOf( fieldWidgetIterator.key() );
3441 mFields[index].setEditorWidgetSetup( fieldWidgetIterator.value() );
3444 if ( oldFields != mFields )
3447 mEditFormConfig.setFields( mFields );
3454 if ( index < 0 || index >= mFields.
count() )
3458 if ( expression.isEmpty() )
3462 std::unique_ptr< QgsExpressionContext > tempContext;
3467 evalContext = tempContext.get();
3500 if ( index < 0 || index >= mFields.
count() )
3505 mDefaultExpressionMap.insert( mFields.
at( index ).
name(), definition );
3509 mDefaultExpressionMap.remove( mFields.
at( index ).
name() );
3516 if ( index < 0 || index >= mFields.
count() )
3525 if ( !mDataProvider )
3538 uniqueValues = mDataProvider->
uniqueValues( index, limit );
3543 Q_FOREACH (
const QVariant &v, uniqueValues )
3545 vals << v.toString();
3549 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
3550 while ( addedIt.hasNext() && ( limit < 0 || uniqueValues.count() < limit ) )
3553 QVariant v = addedIt.value().attribute( index );
3556 QString vs = v.toString();
3557 if ( !vals.contains( vs ) )
3566 while ( it.hasNext() && ( limit < 0 || uniqueValues.count() < limit ) )
3569 QVariant v = it.value().value( index );
3572 QString vs = v.toString();
3573 if ( !vals.contains( vs ) )
3592 uniqueValues = mDataProvider->
uniqueValues( index, limit );
3605 .setSubsetOfAttributes( attList ) );
3608 QVariant currentValue;
3609 QHash<QString, QVariant> val;
3613 val.insert( currentValue.toString(), currentValue );
3614 if ( limit >= 0 && val.size() >= limit )
3620 return val.values().toSet();
3624 Q_ASSERT_X(
false,
"QgsVectorLayer::uniqueValues()",
"Unknown source of the field!" );
3630 QStringList results;
3631 if ( !mDataProvider )
3649 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
3650 while ( addedIt.hasNext() && ( limit < 0 || results.count() < limit ) && ( !feedback || !feedback->
isCanceled() ) )
3653 QVariant v = addedIt.value().attribute( index );
3656 QString vs = v.toString();
3657 if ( vs.contains( substring, Qt::CaseInsensitive ) && !results.contains( vs ) )
3665 while ( it.hasNext() && ( limit < 0 || results.count() < limit ) && ( !feedback || !feedback->
isCanceled() ) )
3668 QVariant v = it.value().value( index );
3671 QString vs = v.toString();
3672 if ( vs.contains( substring, Qt::CaseInsensitive ) && !results.contains( vs ) )
3703 QString fieldName = mFields.
at( index ).
name();
3704 request.
setFilterExpression( QStringLiteral(
"\"%1\" ILIKE '%%2%'" ).arg( fieldName, substring ) );
3708 QString currentValue;
3711 currentValue = f.
attribute( index ).toString();
3712 if ( !results.contains( currentValue ) )
3713 results << currentValue;
3715 if ( ( limit >= 0 && results.size() >= limit ) || ( feedback && feedback->
isCanceled() ) )
3725 Q_ASSERT_X(
false,
"QgsVectorLayer::uniqueStringsMatching()",
"Unknown source of the field!" );
3731 if ( !mDataProvider )
3749 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
3750 while ( addedIt.hasNext() )
3753 QVariant v = addedIt.value().attribute( index );
3761 while ( it.hasNext() )
3764 QVariant v = it.value().value( index );
3796 .setSubsetOfAttributes( attList ) );
3799 double minimumValue = std::numeric_limits<double>::max();
3800 double currentValue = 0;
3803 currentValue = f.
attribute( index ).toDouble();
3804 if ( currentValue < minimumValue )
3806 minimumValue = currentValue;
3809 return QVariant( minimumValue );
3813 Q_ASSERT_X(
false,
"QgsVectorLayer::minimumValue()",
"Unknown source of the field!" );
3819 if ( !mDataProvider )
3836 QMapIterator< QgsFeatureId, QgsFeature > addedIt( added );
3837 while ( addedIt.hasNext() )
3840 QVariant v = addedIt.value().attribute( index );
3848 while ( it.hasNext() )
3851 QVariant v = it.value().value( index );
3881 .setSubsetOfAttributes( attList ) );
3884 double maximumValue = -std::numeric_limits<double>::max();
3885 double currentValue = 0;
3888 currentValue = f.
attribute( index ).toDouble();
3889 if ( currentValue > maximumValue )
3891 maximumValue = currentValue;
3894 return QVariant( maximumValue );
3898 Q_ASSERT_X(
false,
"QgsVectorLayer::maximumValue()",
"Unknown source of the field!" );
3908 if ( !mDataProvider )
3914 int attrIndex = mFields.
lookupField( fieldOrExpression );
3915 if ( attrIndex >= 0 )
3922 bool providerOk =
false;
3923 QVariant val = mDataProvider->
aggregate( aggregate, attrIndex, parameters, context, providerOk );
3937 return c.
calculate( aggregate, fieldOrExpression, context, ok );
3942 if ( mFeatureBlendMode == featureBlendMode )
3952 return mFeatureBlendMode;
3966 return mLayerOpacity;
3971 void QgsVectorLayer::readSldLabeling(
const QDomNode &node )
3976 QDomElement element = node.toElement();
3977 if ( element.isNull() )
3980 QDomElement userStyleElem = element.firstChildElement( QStringLiteral(
"UserStyle" ) );
3981 if ( userStyleElem.isNull() )
3983 QgsDebugMsgLevel( QStringLiteral(
"Info: UserStyle element not found." ), 4 );
3987 QDomElement featureTypeStyleElem = userStyleElem.firstChildElement( QStringLiteral(
"FeatureTypeStyle" ) );
3988 if ( featureTypeStyleElem.isNull() )
3990 QgsDebugMsgLevel( QStringLiteral(
"Info: FeatureTypeStyle element not found." ), 4 );
3995 QDomElement ruleElem = featureTypeStyleElem.lastChildElement( QStringLiteral(
"Rule" ) );
3996 if ( ruleElem.isNull() )
4003 QDomElement textSymbolizerElem = ruleElem.lastChildElement( QStringLiteral(
"TextSymbolizer" ) );
4004 if ( textSymbolizerElem.isNull() )
4006 QgsDebugMsgLevel( QStringLiteral(
"Info: TextSymbolizer element not found." ), 4 );
4013 QDomElement labelElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Label" ) );
4014 if ( !labelElem.isNull() )
4016 QDomElement propertyNameElem = labelElem.firstChildElement( QStringLiteral(
"PropertyName" ) );
4017 if ( !propertyNameElem.isNull() )
4022 QString labelAttribute = propertyNameElem.text();
4026 int fieldIndex = mFields.
lookupField( labelAttribute );
4027 if ( fieldIndex == -1 )
4043 QgsDebugMsgLevel( QStringLiteral(
"Info: PropertyName element not found." ), 4 );
4053 QString fontFamily = QStringLiteral(
"Sans-Serif" );
4054 int fontPointSize = 10;
4055 int fontWeight = -1;
4056 bool fontItalic =
false;
4057 bool fontUnderline =
false;
4060 QDomElement fontElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Font" ) );
4061 if ( !fontElem.isNull() )
4065 QDomElement cssElem = fontElem.firstChildElement( QStringLiteral(
"CssParameter" ) );
4066 while ( !cssElem.isNull() )
4068 cssName = cssElem.attribute( QStringLiteral(
"name" ), QStringLiteral(
"not_found" ) );
4069 if ( cssName != QLatin1String(
"not_found" ) )
4071 elemText = cssElem.text();
4072 if ( cssName == QLatin1String(
"font-family" ) )
4074 fontFamily = elemText;
4076 else if ( cssName == QLatin1String(
"font-style" ) )
4078 fontItalic = ( elemText == QLatin1String(
"italic" ) ) || ( elemText == QLatin1String(
"Italic" ) );
4080 else if ( cssName == QLatin1String(
"font-size" ) )
4083 int fontSize = elemText.toInt( &ok );
4086 fontPointSize = fontSize;
4089 else if ( cssName == QLatin1String(
"font-weight" ) )
4091 if ( ( elemText == QLatin1String(
"bold" ) ) || ( elemText == QLatin1String(
"Bold" ) ) )
4092 fontWeight = QFont::Bold;
4094 else if ( cssName == QLatin1String(
"font-underline" ) )
4096 fontUnderline = ( elemText == QLatin1String(
"underline" ) ) || ( elemText == QLatin1String(
"Underline" ) );
4100 cssElem = cssElem.nextSiblingElement( QStringLiteral(
"CssParameter" ) );
4105 QFont font( fontFamily, fontPointSize, fontWeight, fontItalic );
4106 font.setUnderline( fontUnderline );
4108 format.
setSize( fontPointSize );
4112 if ( textColor.isValid() )
4120 QDomElement haloElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"Halo" ) );
4121 if ( !haloElem.isNull() )
4126 QDomElement radiusElem = haloElem.firstChildElement( QStringLiteral(
"Radius" ) );
4127 if ( !radiusElem.isNull() )
4130 double bufferSize = radiusElem.text().toDouble( &ok );
4133 bufferSettings.
setSize( bufferSize );
4138 if ( bufferColor.isValid() )
4140 bufferSettings.
setColor( bufferColor );
4145 QDomElement labelPlacementElem = textSymbolizerElem.firstChildElement( QStringLiteral(
"LabelPlacement" ) );
4146 if ( !labelPlacementElem.isNull() )
4149 QDomElement pointPlacementElem = labelPlacementElem.firstChildElement( QStringLiteral(
"PointPlacement" ) );
4150 if ( !pointPlacementElem.isNull() )
4154 QDomElement displacementElem = pointPlacementElem.firstChildElement( QStringLiteral(
"Displacement" ) );
4155 if ( !displacementElem.isNull() )
4157 QDomElement displacementXElem = displacementElem.firstChildElement( QStringLiteral(
"DisplacementX" ) );
4158 if ( !displacementXElem.isNull() )
4161 double xOffset = displacementXElem.text().toDouble( &ok );
4167 QDomElement displacementYElem = displacementElem.firstChildElement( QStringLiteral(
"DisplacementY" ) );
4168 if ( !displacementYElem.isNull() )
4171 double yOffset = displacementYElem.text().toDouble( &ok );
4179 QDomElement rotationElem = pointPlacementElem.firstChildElement( QStringLiteral(
"Rotation" ) );
4180 if ( !rotationElem.isNull() )
4183 double rotation = rotationElem.text().toDouble( &ok );
4200 return mEditFormConfig;
4205 if ( mEditFormConfig == editFormConfig )
4209 mEditFormConfig.onRelationsLoaded();
4215 return mMapTipTemplate;
4220 if ( mMapTipTemplate == mapTip )
4223 mMapTipTemplate = mapTip;
4239 if ( mAttributeTableConfig != attributeTableConfig )
4258 if ( !mDiagramLayerSettings )
4260 *mDiagramLayerSettings = s;
4266 QString myMetadata = QStringLiteral(
"<html>\n<body>\n" );
4269 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Information from provider" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4270 myMetadata += QLatin1String(
"<table class=\"list-view\">\n" );
4273 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Name" ) + QStringLiteral(
"</td><td>" ) +
name() + QStringLiteral(
"</td></tr>\n" );
4278 if ( uriComponents.contains( QStringLiteral(
"path" ) ) )
4280 path = uriComponents[QStringLiteral(
"path" )].toString();
4281 if ( QFile::exists( path ) )
4282 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" );
4284 if ( uriComponents.contains( QStringLiteral(
"url" ) ) )
4286 const QString url = uriComponents[QStringLiteral(
"url" )].toString();
4287 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" );
4292 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Source" ) + QStringLiteral(
"</td><td>%1" ).arg(
publicSource() ) + QStringLiteral(
"</td></tr>\n" );
4295 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Storage" ) + QStringLiteral(
"</td><td>" ) +
storageType() + QStringLiteral(
"</td></tr>\n" );
4298 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Comment" ) + QStringLiteral(
"</td><td>" ) +
dataComment() + QStringLiteral(
"</td></tr>\n" );
4301 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Encoding" ) + QStringLiteral(
"</td><td>" ) +
dataProvider()->
encoding() + QStringLiteral(
"</td></tr>\n" );
4315 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Geometry" ) + QStringLiteral(
"</td><td>" ) + typeString + QStringLiteral(
"</td></tr>\n" );
4319 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"CRS" ) + QStringLiteral(
"</td><td>" );
4322 myMetadata +=
crs().
authid() + QStringLiteral(
" - " );
4324 if (
crs().isGeographic() )
4325 myMetadata += tr(
"Geographic" );
4327 myMetadata += tr(
"Projected" );
4329 myMetadata += QLatin1String(
"</td></tr>\n" );
4332 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Extent" ) + QStringLiteral(
"</td><td>" ) +
extent().
toString() + QStringLiteral(
"</td></tr>\n" );
4335 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Unit" ) + QStringLiteral(
"</td><td>" ) +
QgsUnitTypes::toString(
crs().mapUnits() ) + QStringLiteral(
"</td></tr>\n" );
4340 QLocale locale = QLocale();
4341 locale.setNumberOptions( locale.numberOptions() &= ~QLocale::NumberOption::OmitGroupSeparator );
4342 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" )
4343 + tr(
"Feature count" ) + QStringLiteral(
"</td><td>" )
4345 + QStringLiteral(
"</td></tr>\n" );
4348 myMetadata += QLatin1String(
"</table>\n<br><br>" );
4351 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Identification" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4353 myMetadata += QLatin1String(
"<br><br>\n" );
4356 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Extent" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4358 myMetadata += QLatin1String(
"<br><br>\n" );
4361 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Access" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4363 myMetadata += QLatin1String(
"<br><br>\n" );
4366 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Fields" ) + QStringLiteral(
"</h1>\n<hr>\n<table class=\"list-view\">\n" );
4370 if ( !pkAttrList.isEmpty() )
4372 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Primary key attributes" ) + QStringLiteral(
"</td><td>" );
4373 Q_FOREACH (
int idx, pkAttrList )
4377 myMetadata += QLatin1String(
"</td></tr>\n" );
4383 myMetadata += QStringLiteral(
"<tr><td class=\"highlight\">" ) + tr(
"Count" ) + QStringLiteral(
"</td><td>" ) + QString::number( myFields.
size() ) + QStringLiteral(
"</td></tr>\n" );
4385 myMetadata += QLatin1String(
"</table>\n<br><table width=\"100%\" class=\"tabular-view\">\n" );
4386 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" );
4388 for (
int i = 0; i < myFields.
size(); ++i )
4393 rowClass = QStringLiteral(
"class=\"odd-row\"" );
4394 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" );
4398 myMetadata += QLatin1String(
"</table>\n<br><br>" );
4401 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Contacts" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4403 myMetadata += QLatin1String(
"<br><br>\n" );
4406 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"Links" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4408 myMetadata += QLatin1String(
"<br><br>\n" );
4411 myMetadata += QStringLiteral(
"<h1>" ) + tr(
"History" ) + QStringLiteral(
"</h1>\n<hr>\n" );
4413 myMetadata += QLatin1String(
"<br><br>\n" );
4415 myMetadata += QStringLiteral(
"\n</body>\n</html>\n" );
4419 void QgsVectorLayer::invalidateSymbolCountedFlag()
4421 mSymbolFeatureCounted =
false;
4424 void QgsVectorLayer::onFeatureCounterCompleted()
4427 mFeatureCounter =
nullptr;
4430 void QgsVectorLayer::onFeatureCounterTerminated()
4432 mFeatureCounter =
nullptr;
4435 void QgsVectorLayer::onJoinedFieldsChanged()
4441 void QgsVectorLayer::onFeatureDeleted(
QgsFeatureId fid )
4443 if ( mEditCommandActive )
4444 mDeletedFids << fid;
4451 void QgsVectorLayer::onRelationsLoaded()
4453 mEditFormConfig.onRelationsLoaded();
4456 void QgsVectorLayer::onSymbolsCounted()
4458 if ( mFeatureCounter )
4461 mSymbolFeatureCounted =
true;
4476 msgError = QObject::tr(
"Unable to load %1 provider" ).arg(
mProviderKey );
4481 if ( !listStylesExternalMethod )
4483 msgError = QObject::tr(
"Provider %1 has no %2 method" ).arg(
mProviderKey, QStringLiteral(
"listStyles" ) );
4487 return listStylesExternalMethod(
mDataSource, ids, names, descriptions, msgError );
4495 msgError = QObject::tr(
"Unable to load %1 provider" ).arg(
mProviderKey );
4500 if ( !getStyleByIdMethod )
4502 msgError = QObject::tr(
"Provider %1 has no %2 method" ).arg(
mProviderKey, QStringLiteral(
"getStyleById" ) );
4506 return getStyleByIdMethod(
mDataSource, styleId, msgError );
4514 msgError = QObject::tr(
"Unable to load %1 provider" ).arg(
mProviderKey );
4518 if ( !deleteStyleByIdMethod )
4520 msgError = QObject::tr(
"Provider %1 has no %2 method" ).arg(
mProviderKey, QStringLiteral(
"deleteStyleById" ) );
4523 return deleteStyleByIdMethod(
mDataSource, styleId, msgError );
4528 bool useAsDefault,
const QString &uiFileContent, QString &msgError )
4531 QString sldStyle, qmlStyle;
4535 msgError = QObject::tr(
"Unable to load %1 provider" ).arg(
mProviderKey );
4540 if ( !saveStyleExternalMethod )
4542 msgError = QObject::tr(
"Provider %1 has no %2 method" ).arg(
mProviderKey, QStringLiteral(
"saveStyle" ) );
4546 QDomDocument qmlDocument, sldDocument;
4549 if ( !msgError.isNull() )
4553 qmlStyle = qmlDocument.toString();
4556 if ( !msgError.isNull() )
4560 sldStyle = sldDocument.toString();
4562 saveStyleExternalMethod(
mDataSource, qmlStyle, sldStyle, name,
4563 description, uiFileContent, useAsDefault, msgError );
4577 QString joinKey = mAuxiliaryLayerKey;
4578 if ( !key.isEmpty() )
4581 if ( storage.
isValid() && !joinKey.isEmpty() )
4604 mAuxiliaryLayerKey.clear();
4606 if ( mAuxiliaryLayer )
4619 mAuxiliaryLayer.reset( alayer );
4620 if ( mAuxiliaryLayer )
4621 mAuxiliaryLayer->setParent(
this );
4627 return mAuxiliaryLayer.get();
4632 return mAuxiliaryLayer.get();
4644 if ( loadStyleExternalMethod )
4646 QString qml, errorMsg;
4647 qml = loadStyleExternalMethod(
mDataSource, errorMsg );
4648 if ( !qml.isEmpty() )
4650 QDomDocument myDocument( QStringLiteral(
"qgis" ) );
4651 myDocument.setContent( qml );
4653 return QObject::tr(
"Loaded from Provider" );
4664 if ( mDataProvider )
4671 QSet<QgsMapLayerDependency> deps;
4680 QSet<QgsMapLayerDependency> toAdd = deps -
dependencies();
4696 if ( mDataProvider )
4716 if ( ! toAdd.isEmpty() )
4724 if ( fieldIndex < 0 || fieldIndex >= mFields.
count() )
4740 QMap< QgsFieldConstraints::Constraint, QgsFieldConstraints::ConstraintStrength > m;
4742 if ( fieldIndex < 0 || fieldIndex >= mFields.
count() )
4745 QString
name = mFields.
at( fieldIndex ).
name();
4748 for ( ; conIt != mFieldConstraintStrength.constEnd(); ++conIt )
4750 if ( conIt.key().first ==
name )
4752 m[ conIt.key().second ] = mFieldConstraintStrength.value( conIt.key() );
4761 if ( index < 0 || index >= mFields.
count() )
4767 QgsFieldConstraints::Constraints constraints = mFieldConstraints.value( name,
nullptr );
4768 constraints |= constraint;
4769 mFieldConstraints.insert( name, constraints );
4771 mFieldConstraintStrength.insert( qMakePair( name, constraint ), strength );
4778 if ( index < 0 || index >= mFields.
count() )
4784 QgsFieldConstraints::Constraints constraints = mFieldConstraints.value( name,
nullptr );
4785 constraints &= ~constraint;
4786 mFieldConstraints.insert( name, constraints );
4788 mFieldConstraintStrength.remove( qMakePair( name, constraint ) );
4795 if ( index < 0 || index >= mFields.
count() )
4803 if ( index < 0 || index >= mFields.
count() )
4811 if ( index < 0 || index >= mFields.
count() )
4814 if ( expression.isEmpty() )
4816 mFieldConstraintExpressions.remove( mFields.
at( index ).
name() );
4820 mFieldConstraintExpressions.insert( mFields.
at( index ).
name(), qMakePair( expression, description ) );
4827 if ( index < 0 || index >= mFields.
count() )
4831 mFieldWidgetSetups.remove( mFields.
at( index ).
name() );
4833 mFieldWidgetSetups.insert( mFields.
at( index ).
name(), setup );
4840 if ( index < 0 || index >= mFields.
count() )
4849 if (
customProperty( QStringLiteral(
"labeling" ) ).toString() == QLatin1String(
"pal" ) )
4851 if (
customProperty( QStringLiteral(
"labeling/enabled" ), QVariant(
false ) ).toBool() )
4855 settings.readFromLayerCustomProperties(
this );
4863 if ( key.startsWith( QLatin1String(
"labeling/" ) ) )
4873 return mAllowCommit;
4878 if ( mAllowCommit == allowCommit )
4887 return mGeometryOptions.get();
4897 return mReadExtentFromXml;
4900 void QgsVectorLayer::onDirtyTransaction(
const QString &sql,
const QString &
name )
4903 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
Write 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.
Origin origin() const
Returns the dependency origin.
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
Write 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
Sets 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)
Set 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
Read 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.
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.
ConstraintStrength constraintStrength(Constraint constraint) const
Returns the strength of a field constraint, or ConstraintStrengthNotSet if the constraint is not pres...
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 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 QVariant aggregate(QgsAggregateCalculator::Aggregate aggregate, int index, const QgsAggregateCalculator::AggregateParameters ¶meters, QgsExpressionContext *context, bool &ok) const
Calculates an aggregated value from the layer's features.
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()
Is 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
Test if param exists (generic mode)
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 null.
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.
QgsFieldConstraints::Constraints fieldConstraints(int fieldIndex) const
Returns any constraints which are present at the provider for a specified field index.
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)
Invert 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
Query 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)
Remove 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
Write the symbology for the layer into the docment 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)
Set 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.
Type type() const
Returns the dependency type.
void selectByIds(const QgsFeatureIds &ids, SelectBehavior behavior=SetSelection)
Select 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.
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
Resolve 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()
Is 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)
This signal is 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)
This signal is 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)
Insert a new vertex before the given vertex number, in the given ring, item (first number is index 0)...
QgsMapLayer::LayerType type() const
Returns the type of the layer.
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.
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()
Select not selected features and deselect 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)
Deselect 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 cancelation 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.
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.
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
Query the layer for the geometry at the given id.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
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
Read 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.
int removeParam(const QString &key)
Remove generic param (generic mode)
bool deleteFeature(QgsFeatureId fid) const
Deletes a feature from joined layers.
void select(QgsFeatureId featureId)
Select 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
Is emitted, when 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()
Is 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)
This signal is 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()
Is emitted, when edited changes successfully have been written to the data provider.
void beforeEditingStarted()
Is 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.
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)
Is emitted whenever a geometry change is done in the edit buffer.
bool setReadOnly(bool readonly=true)
Make layer read-only (editing disabled) or not.
void selectionChanged(const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect)
This signal is emitted when selection was changed.
void setParam(const QString &key, const QString &value)
Set generic param (generic mode)
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.
x-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)
Is 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)
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.
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 diagram features act as obstacles for other diagrams/labels.
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.
void raiseError(const QString &msg)
Signals an error related to this vector layer.
Add selection to current selection.
void editingStarted()
Is 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)
This signal is 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 complete uri.
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)
Select 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()
This signal is 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...
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.
QVariant aggregate(QgsAggregateCalculator::Aggregate aggregate, const QString &fieldOrExpression, const QgsAggregateCalculator::AggregateParameters ¶meters=QgsAggregateCalculator::AggregateParameters(), QgsExpressionContext *context=nullptr, bool *ok=nullptr) const
Calculates an aggregated value from the layer's features.
QgsAttributeTableConfig attributeTableConfig() const
Returns the attribute table configuration object.
void selectByExpression(const QString &expression, SelectBehavior behavior=SetSelection)
Select 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
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 &)
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 root node of the expression. Root node is null is parsing has failed.
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...
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.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
void committedAttributesAdded(const QString &layerId, const QList< QgsField > &addedAttributes)
This signal is 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).
QString layerId() const
Returns the ID of the layer this dependency depends on.
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)
Set 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)
Will return 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)
Set 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())
Set 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
Query 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.
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 null.
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)
Delete 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.
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)
Set 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 PostgreSQL/RDBMS datasource URI.
QgsFeatureMap mAddedFeatures
New features which are not committed.
void committedGeometriesChanges(const QString &layerId, const QgsGeometryMap &changedGeometries)
This signal is emitted, when geometry changes are saved to the provider.
virtual bool empty() const
Returns true if the layer contains at least one feature.
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()
This signal is 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()
Is 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)
Set the attribute table configuration object.
void layerModified()
This signal is 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.
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 database.
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.
void setReadExtentFromXml(bool readExtentFromXml)
Flag allowing to indicate if the extent has to be read from the XML document when data source has no ...
QString joinLayerId() const
ID of the joined layer - may be used to resolve reference to the joined layer.
virtual QString loadNamedStyle(const QString &theURI, bool &resultFlag, bool loadFromLocalDb, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories)
Load 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)
Save 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.
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...