43 changes: 40 additions & 3 deletions src/core/qgsvectorlayereditbuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ QgsVectorLayerEditBuffer::~QgsVectorLayerEditBuffer()

bool QgsVectorLayerEditBuffer::isModified() const
{
return L->undoStack()->isClean(); // TODO[MD]: test
return !L->undoStack()->isClean();
}


Expand Down Expand Up @@ -86,6 +86,12 @@ bool QgsVectorLayerEditBuffer::addFeature( QgsFeature& f )
return false;
}

int layerFieldCount = L->dataProvider()->fields().count() + mAddedAttributes.count() - mDeletedAttributeIds.count();
if (layerFieldCount != f.attributes().count())
return false;

// TODO: check correct geometry type

L->undoStack()->push( new QgsVectorLayerUndoCommandAddFeature( this, f ) );
return true;
}
Expand All @@ -94,9 +100,7 @@ bool QgsVectorLayerEditBuffer::addFeature( QgsFeature& f )
bool QgsVectorLayerEditBuffer::addFeatures( QgsFeatureList& features )
{
if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::AddFeatures ) )
{
return false;
}

for ( QgsFeatureList::iterator iter = features.begin(); iter != features.end(); ++iter )
{
Expand All @@ -111,6 +115,9 @@ bool QgsVectorLayerEditBuffer::addFeatures( QgsFeatureList& features )

bool QgsVectorLayerEditBuffer::deleteFeature( QgsFeatureId fid )
{
if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::DeleteFeatures ) )
return false;

if ( FID_IS_NEW( fid ) )
{
if (!mAddedFeatures.contains(fid))
Expand All @@ -129,25 +136,52 @@ bool QgsVectorLayerEditBuffer::deleteFeature( QgsFeatureId fid )

bool QgsVectorLayerEditBuffer::changeGeometry( QgsFeatureId fid, QgsGeometry* geom )
{
if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeGeometries ) )
return false;

if ( !L->hasGeometryType() )
{
return false;
}

if ( FID_IS_NEW( fid ) )
{
if (!mAddedFeatures.contains(fid))
return false;
}

// TODO: check compatible geometry

L->undoStack()->push( new QgsVectorLayerUndoCommandChangeGeometry( this, fid, geom ) );
return true;
}


bool QgsVectorLayerEditBuffer::changeAttributeValue( QgsFeatureId fid, int field, QVariant value )
{
if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::ChangeAttributeValues ) )
return false;

if ( FID_IS_NEW( fid ) )
{
if (!mAddedFeatures.contains(fid))
return false;
}

if ( field < 0 || field >= L->pendingFields().count() ||
L->pendingFields().fieldOrigin(field) == QgsFields::OriginJoin )
return false;

L->undoStack()->push( new QgsVectorLayerUndoCommandChangeAttribute( this, fid, field, value ) );
return true;
}


bool QgsVectorLayerEditBuffer::addAttribute( const QgsField &field )
{
if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::AddAttributes ) )
return false;

if ( field.name().isEmpty() )
return false;

Expand All @@ -168,6 +202,9 @@ bool QgsVectorLayerEditBuffer::addAttribute( const QgsField &field )

bool QgsVectorLayerEditBuffer::deleteAttribute( int index )
{
if ( !( L->dataProvider()->capabilities() & QgsVectorDataProvider::DeleteAttributes ) )
return false;

if ( index < 0 || index >= L->pendingFields().count() )
return false;

Expand Down
2 changes: 1 addition & 1 deletion src/providers/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ IF (SPATIALITE_FOUND OR WITH_INTERNAL_SPATIALITE)
ENDIF (SPATIALITE_FOUND OR WITH_INTERNAL_SPATIALITE)

IF (EXPAT_FOUND)
# ADD_SUBDIRECTORY(gpx) # TODO: enable when migrated to new api
ADD_SUBDIRECTORY(gpx)
# ADD_SUBDIRECTORY(wfs) # TODO: enable when migrated to new api
ENDIF (EXPAT_FOUND)

Expand Down
6 changes: 5 additions & 1 deletion src/providers/gpx/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@
########################################################
# Files

SET (GPX_SRCS qgsgpxprovider.cpp gpsdata.cpp)
SET (GPX_SRCS
qgsgpxprovider.cpp
qgsgpxfeatureiterator.cpp
gpsdata.cpp
)

SET (GPX_MOC_HDRS
qgsgpxprovider.h
Expand Down
Loading