QGIS API Documentation
3.14.0-Pi (9f7028fd23)
|
Go to the documentation of this file.
27 template <
class Key,
class T>
void mapToReversedLists(
const QMap< Key, T > &map, QList<Key> &ks, QList<T> &vs )
29 ks.reserve( map.size() );
30 vs.reserve( map.size() );
31 typename QMap<Key, T>::const_iterator i = map.constEnd();
32 while ( i-- != map.constBegin() )
35 vs.append( i.value() );
54 QgsDebugMsgLevel( QStringLiteral(
"undo index changed %1" ).arg( index ), 4 );
72 fields.
rename( renameIt.key(), renameIt.value() );
107 for ( QgsAttributeMap::const_iterator it = map.begin(); it != map.end(); ++it )
108 attrs[it.key()] = it.value();
142 for ( QgsFeatureList::iterator iter = features.begin(); iter != features.end(); ++iter )
157 QgsDebugMsg( QStringLiteral(
"Cannot delete features (missing DeleteFeature capability)" ) );
165 QgsDebugMsg( QStringLiteral(
"Cannot delete features (in the list of added features)" ) );
173 QgsDebugMsg( QStringLiteral(
"Cannot delete features (in the list of deleted features)" ) );
186 QgsDebugMsg( QStringLiteral(
"Cannot delete features (missing DeleteFeatures capability)" ) );
191 const auto constFids = fids;
223 for (
auto it = newValues.constBegin() ; it != newValues.constEnd(); ++it )
225 const int field = it.key();
226 const QVariant newValue = it.value();
229 if ( oldValues.contains( field ) )
230 oldValue = oldValues[field];
265 if ( field.
name().isEmpty() )
269 for (
const QgsField &updatedField : fields )
271 if ( updatedField.name() == field.
name() )
310 if ( newName.isEmpty() )
317 for (
const QgsField &updatedField : fields )
319 if ( updatedField.name() == newName )
331 commitErrors.clear();
353 if ( ( ! f.hasGeometry() ) ||
354 ( f.geometry().wkbType() == provider->
wkbType() ) )
359 commitErrors << tr(
"ERROR: %n feature(s) not added - geometry type is not compatible with the current layer.",
"not added features count",
mAddedFeatures.size() );
368 commitErrors << tr(
"ERROR: %n feature(s) not added - provider doesn't support adding features.",
"not added features count",
mAddedFeatures.size() );
380 commitErrors << tr(
"SUCCESS: %n geometries were changed.",
"changed geometries count",
mChangedGeometries.size() );
387 commitErrors << tr(
"ERROR: %n geometries not changed.",
"not changed geometries count",
mChangedGeometries.size() );
397 bool attributesChanged =
false;
402 commitErrors << tr(
"SUCCESS: %n attribute(s) deleted.",
"deleted attributes count",
mDeletedAttributeIds.size() );
407 attributesChanged =
true;
411 commitErrors << tr(
"ERROR: %n attribute(s) not deleted.",
"not deleted attributes count",
mDeletedAttributeIds.size() );
413 QString list =
"ERROR: Pending attribute deletes:";
415 for (
int idx : constMDeletedAttributeIds )
419 commitErrors << list;
430 commitErrors << tr(
"SUCCESS: %n attribute(s) renamed.",
"renamed attributes count",
mRenamedAttributes.size() );
435 attributesChanged =
true;
439 commitErrors << tr(
"ERROR: %n attribute(s) not renamed",
"not renamed attributes count",
mRenamedAttributes.size() );
451 commitErrors << tr(
"SUCCESS: %n attribute(s) added.",
"added attributes count",
mAddedAttributes.size() );
456 attributesChanged =
true;
460 commitErrors << tr(
"ERROR: %n new attribute(s) not added",
"not added attributes count",
mAddedAttributes.size() );
462 QString list =
"ERROR: Pending adds:";
464 for (
QgsField f : constMAddedAttributes )
466 list.append(
' ' + f.name() );
468 commitErrors << list;
477 bool attributeChangesOk =
true;
478 if ( attributesChanged )
485 commitErrors << tr(
"ERROR: the count of fields is incorrect after addition/removal of fields!" );
486 attributeChangesOk =
false;
489 for (
int i = 0; i < std::min( oldFields.
count(), newFields.
count() ); ++i )
493 if ( attributeChangesOk && oldField != newField )
496 << tr(
"ERROR: field with index %1 is not the same!" ).arg( i )
499 << QStringLiteral(
"%1: name=%2 type=%3 typeName=%4 len=%5 precision=%6" )
500 .arg( tr(
"expected field" ),
502 QVariant::typeToName( oldField.
type() ),
506 << QStringLiteral(
"%1: name=%2 type=%3 typeName=%4 len=%5 precision=%6" )
507 .arg( tr(
"retrieved field" ),
509 QVariant::typeToName( newField.
type() ),
513 attributeChangesOk =
false;
518 if ( attributeChangesOk )
547 commitErrors << tr(
"SUCCESS: %n attribute value(s) changed.",
"changed attribute values count",
mChangedAttributeValues.size() );
554 commitErrors << tr(
"ERROR: %n attribute value change(s) not applied.",
"not changed attribute values count",
mChangedAttributeValues.size() );
556 QString list =
"ERROR: pending changes:";
562 for (
int idx : constKeys )
568 commitErrors << list;
582 commitErrors << tr(
"SUCCESS: %n feature(s) deleted.",
"deleted features count",
mDeletedFeatureIds.size() );
597 commitErrors << tr(
"ERROR: %n feature(s) not deleted.",
"not deleted features count",
mDeletedFeatureIds.size() );
599 QString list =
"ERROR: pending deletes:";
605 commitErrors << list;
618 QList<QgsFeatureId> ids;
626 for (
int i = 0; i < featuresToAdd.count(); ++i )
633 commitErrors << tr(
"SUCCESS: %n feature(s) added.",
"added features count", featuresToAdd.size() );
638 for (
int i = 0; i < featuresToAdd.count(); ++i )
640 if ( featuresToAdd[i].
id() != ids[i] )
643 if (
L->mSelectedFeatureIds.contains( ids[i] ) )
645 L->mSelectedFeatureIds.remove( ids[i] );
646 L->mSelectedFeatureIds.insert( featuresToAdd[i].
id() );
657 commitErrors << tr(
"ERROR: %n feature(s) not added.",
"not added features count",
mAddedFeatures.size() );
659 QString list =
"ERROR: pending adds:";
664 for (
int i = 0; i <
L->
fields().size(); i++ )
666 list.append( QString(
" %1:%2" ).arg(
L->
fields().
at( i ).
name() ).arg( f.attributes()[i].toString() ) );
670 commitErrors << list;
677 commitErrors << tr(
"ERROR: %n feature(s) not added - provider doesn't support adding features.",
"not added features count",
mAddedFeatures.size() );
689 commitErrors << tr(
"\n Provider errors:" );
690 const auto constErrors = provider->
errors();
691 for ( QString e : constErrors )
693 commitErrors <<
" " + e.replace(
'\n', QLatin1String(
"\n " ) );
719 QString QgsVectorLayerEditBuffer::dumpEditBuffer()
724 msg +=
"CHANGED GEOMETRIES:\n";
728 msg += QString(
"- FID %1: %2" ).arg( it.key() ).arg( it.value().to );
749 attrs.insert( index, QVariant() );
750 featureIt->setAttributes( attrs );
756 std::sort( sortedRenamedIndices.begin(), sortedRenamedIndices.end(), std::greater< int >() );
757 const auto constSortedRenamedIndices = sortedRenamedIndices;
758 for (
int renameIndex : constSortedRenamedIndices )
760 if ( renameIndex >= index )
777 if ( attrMap.contains( index ) )
778 attrMap.remove( index );
789 attrs.remove( index );
790 featureIt->setAttributes( attrs );
796 std::sort( sortedRenamedIndices.begin(), sortedRenamedIndices.end() );
799 const auto constSortedRenamedIndices = sortedRenamedIndices;
800 for (
int renameIndex : constSortedRenamedIndices )
802 if ( renameIndex > index )
818 for ( QgsAttributeMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it )
820 int attrIndex = it.key();
821 updatedMap.insert( attrIndex < index ? attrIndex : attrIndex + offset, it.value() );
void mapToReversedLists(const QMap< Key, T > &map, QList< Key > &ks, QList< T > &vs)
populate two lists (ks, vs) from map - in reverse order
@ OriginProvider
Field comes from the underlying data provider of the vector layer (originIndex = index in provider's ...
@ OriginEdit
Field has been temporarily added in editing mode (originIndex = index in the list of added attributes...
friend class QgsVectorLayerUndoCommandChangeAttribute
@ DeleteFeatures
Allows deletion of features.
QList< QgsField > mAddedAttributes
Added attributes fields which are not committed.
virtual bool deleteFeatures(const QgsFeatureIds &id)
Deletes one or more features from the provider.
bool hasErrors() const
Provider has errors to report.
virtual void updateExtents(bool force=false)
Update the extents for the layer.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
virtual bool isModified() const
Returns true if the provider has been modified since the last commit.
void updateFields()
Will regenerate the fields property of this layer by obtaining all fields from the dataProvider,...
friend class QgsVectorLayerUndoCommandAddFeature
@ DeleteAttributes
Allows deletion of attributes (fields)
QgsFeatureIds mDeletedFeatureIds
Deleted feature IDs which are not committed.
#define QgsDebugMsgLevel(str, level)
virtual bool addAttribute(const QgsField &field)
Add an attribute field (but does not commit it) returns true if the field was added.
void committedGeometriesChanges(const QString &layerId, const QgsGeometryMap &changedGeometries)
friend class QgsVectorLayerUndoCommandAddAttribute
QgsFields fields() const override=0
Returns the fields associated with this data provider.
virtual bool changeAttributeValues(const QgsChangedAttributesMap &attr_map)
Changes attribute values of existing features.
int count() const
Returns number of items.
QgsAttributeList mDeletedAttributeIds
Deleted attributes fields which are not committed. The list is kept sorted.
void updateAttributeMapIndex(QgsAttributeMap &attrs, int index, int offset) const
Updates an index in an attribute map to a new value (for updates of changed attributes)
bool supportedType(const QgsField &field) const
check if provider supports type of field
QString typeName() const
Gets the field type.
bool isSpatial() const FINAL
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
@ AddAttributes
Allows addition of new attributes (fields)
virtual bool doesStrictFeatureTypeCheck() const
Returns true if the provider is strict about the type of inserted features (e.g.
virtual bool addFeature(QgsFeature &f)
Adds a feature.
QgsVectorLayerEditBuffer()=default
Constructor for QgsVectorLayerEditBuffer.
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
void layerModified()
Emitted when modifications has been done on layer.
#define FID_TO_STRING(fid)
void updateChangedAttributes(QgsFeature &f)
Update feature with uncommitted attribute updates.
friend class QgsVectorLayerUndoCommandRenameAttribute
virtual bool deleteAttribute(int attr)
Delete an attribute field (but does not commit it)
void committedAttributesAdded(const QString &layerId, const QList< QgsField > &addedAttributes)
@ ChangeGeometries
Allows modifications of geometries.
QString providerType() const
Returns the provider type (provider key) for this layer.
virtual bool changeGeometry(QgsFeatureId fid, const QgsGeometry &geom)
Change feature's geometry.
virtual bool changeFeatures(const QgsChangedAttributesMap &attr_map, const QgsGeometryMap &geometry_map)
Changes attribute values and geometries of existing features.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
QStringList errors() const
Gets recorded errors.
virtual QgsVectorDataProvider::Capabilities capabilities() const
Returns flags containing the supported capabilities.
void committedFeaturesAdded(const QString &layerId, const QgsFeatureList &addedFeatures)
QgsFeatureMap mAddedFeatures
New features which are not committed.
virtual bool deleteFeature(QgsFeatureId fid)
Delete a feature from the layer (but does not commit it)
void featureDeleted(QgsFeatureId fid)
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
void committedAttributeValuesChanges(const QString &layerId, const QgsChangedAttributesMap &changedAttributesValues)
virtual bool changeGeometryValues(const QgsGeometryMap &geometry_map)
Changes geometries of existing features.
void featureAdded(QgsFeatureId fid)
virtual bool renameAttributes(const QgsFieldNameMap &renamedAttributes)
Renames existing attributes.
FieldOrigin fieldOrigin(int fieldIdx) const
Gets field's origin (value from an enumeration)
QList< QgsFeature > QgsFeatureList
QMap< int, QVariant > QgsAttributeMap
void committedFeaturesRemoved(const QString &layerId, const QgsFeatureIds &deletedFeatureIds)
@ AddFeatures
Allows adding features.
void committedAttributesRenamed(const QString &layerId, const QgsFieldNameMap &renamedAttributes)
Emitted after committing an attribute rename.
virtual void rollBack()
Stop editing and discard the edits.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
virtual bool renameAttribute(int attr, const QString &newName)
Renames an attribute field (but does not commit it)
void undoIndexChanged(int index)
QSet< QgsFeatureId > QgsFeatureIds
void clearErrors()
Clear recorded errors.
QgsGeometry convertToProviderType(const QgsGeometry &geom) const
Converts the geometry to the provider type if possible / necessary.
void committedAttributesDeleted(const QString &layerId, const QgsAttributeList &deletedAttributes)
Signals emitted after committing changes.
virtual bool deleteAttributes(const QgsAttributeIds &attributes)
Deletes existing attributes from the provider.
QgsFieldNameMap mRenamedAttributes
Renamed attributes which are not committed.
bool addFeatures(QgsFeatureList &flist, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) override
Adds a list of features to the sink.
void handleAttributeDeleted(int index)
Update added and changed features after removal of an attribute.
static void matchAttributesToFields(QgsFeature &feature, const QgsFields &fields)
Matches the attributes in feature to the specified fields.
@ OriginExpression
Field is calculated from an expression.
@ ChangeAttributeValues
Allows modification of attribute values.
virtual bool changeAttributeValue(QgsFeatureId fid, int field, const QVariant &newValue, const QVariant &oldValue=QVariant())
Changed an attribute value (but does not commit it)
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).
virtual bool addAttributes(const QList< QgsField > &attributes)
Adds new attributes to the provider.
int fieldOriginIndex(int fieldIdx) const
Gets field's origin index (its meaning is specific to each type of origin)
virtual bool commitChanges(QStringList &commitErrors)
Attempts to commit any changes to disk.
QUndoStack * undoStack()
Returns pointer to layer's undo stack.
QString storageType() const
Returns the permanent storage type for this layer as a friendly name.
@ RenameAttributes
Supports joint updates for attributes and geometry Providers supporting this should still define Chan...
bool rename(int fieldIdx, const QString &name)
Renames a name of field.
friend class QgsVectorLayerUndoCommandChangeGeometry
QgsGeometryMap mChangedGeometries
Changed geometries which are not committed.
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
virtual bool deleteFeatures(const QgsFeatureIds &fid)
Deletes a set of features from the layer (but does not commit it)
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
void remove(int fieldIdx)
Removes a field with the given index.
void updateFields(QgsFields &fields)
friend class QgsVectorLayerUndoCommandDeleteFeature
virtual bool changeAttributeValues(QgsFeatureId fid, const QgsAttributeMap &newValues, const QgsAttributeMap &oldValues)
Changes values of attributes (but does not commit it).
void updateFeatureGeometry(QgsFeature &f)
Update feature with uncommitted geometry updates.
void handleAttributeAdded(int index)
Update added and changed features after addition of an attribute.
@ OriginJoin
Field comes from a joined layer (originIndex / 1000 = index of the join, originIndex % 1000 = index w...
virtual bool addFeatures(QgsFeatureList &features)
Insert a copy of the given features into the layer (but does not commit it)
QgsWkbTypes::Type wkbType() const override=0
Returns the geometry type which is returned by this layer.
QgsChangedAttributesMap mChangedAttributeValues
Changed attributes values which are not committed.
friend class QgsVectorLayerUndoCommandDeleteAttribute