Skip to content

Commit

Permalink
Merge pull request #40321 from elpaso/bugfix-gh40316-filtering-error
Browse files Browse the repository at this point in the history
Do not silently fail while filtering on exp error
  • Loading branch information
elpaso committed Nov 29, 2020
2 parents 61e9e29 + d79e1a9 commit 4d26e10
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 2 deletions.
Expand Up @@ -234,6 +234,13 @@ Emitted when the filtering of the features has been done
void visibleReloaded();
%Docstring
Emitted when the the visible features on extend are reloaded (the list is created)
%End

void filterError( const QString &errorMessage );
%Docstring
Emitted when an error occurred while filtering features

.. versionadded:: 3.18
%End

protected:
Expand Down
15 changes: 13 additions & 2 deletions src/gui/attributetable/qgsattributetablefiltermodel.cpp
Expand Up @@ -503,15 +503,20 @@ void QgsAttributeTableFilterModel::filterFeatures()

QgsFeature f;

// Record the first evaluation error
QString error;

while ( featIt.nextFeature( f ) )
{
mFilterExpressionContext.setFeature( f );
if ( mFilterExpression.evaluate( &mFilterExpressionContext ).toInt() != 0 )
filteredFeatures << f.id();

// check if there were errors during evaluating
if ( mFilterExpression.hasEvalError() )
break;
if ( mFilterExpression.hasEvalError() && error.isEmpty() )
{
error = mFilterExpression.evalErrorString( );
}
}

featIt.close();
Expand All @@ -521,6 +526,12 @@ void QgsAttributeTableFilterModel::filterFeatures()
QApplication::restoreOverrideCursor();

emit featuresFiltered();

if ( ! error.isEmpty() )
{
emit filterError( error );
}

}


Expand Down
6 changes: 6 additions & 0 deletions src/gui/attributetable/qgsattributetablefiltermodel.h
Expand Up @@ -258,6 +258,12 @@ class GUI_EXPORT QgsAttributeTableFilterModel: public QSortFilterProxyModel, pub
*/
void visibleReloaded();

/**
* Emitted when an error occurred while filtering features
* \since QGIS 3.18
*/
void filterError( const QString &errorMessage );

protected:

/**
Expand Down
11 changes: 11 additions & 0 deletions src/gui/attributetable/qgsdualview.cpp
Expand Up @@ -44,6 +44,7 @@
#include "qgsshortcutsmanager.h"
#include "qgsfieldconditionalformatwidget.h"
#include "qgsmapcanvasutils.h"
#include "qgsmessagebar.h"


QgsDualView::QgsDualView( QWidget *parent )
Expand Down Expand Up @@ -293,6 +294,7 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter
case QgsAttributeTableFilterModel::ShowEdited:
case QgsAttributeTableFilterModel::ShowFilteredList:
disconnect( mFilterModel, &QgsAttributeTableFilterModel::featuresFiltered, this, &QgsDualView::filterChanged );
disconnect( mFilterModel, &QgsAttributeTableFilterModel::filterError, this, &QgsDualView::filterError );
break;

case QgsAttributeTableFilterModel::ShowSelected:
Expand Down Expand Up @@ -332,6 +334,7 @@ void QgsDualView::setFilterMode( QgsAttributeTableFilterModel::FilterMode filter
case QgsAttributeTableFilterModel::ShowEdited:
case QgsAttributeTableFilterModel::ShowFilteredList:
connect( mFilterModel, &QgsAttributeTableFilterModel::featuresFiltered, this, &QgsDualView::filterChanged );
connect( mFilterModel, &QgsAttributeTableFilterModel::filterError, this, &QgsDualView::filterError );
break;

case QgsAttributeTableFilterModel::ShowSelected:
Expand Down Expand Up @@ -599,6 +602,14 @@ void QgsDualView::flashButtonClicked( bool clicked )
canvas->flashFeatureIds( mLayer, mFeatureListView->currentEditSelection() );
}

void QgsDualView::filterError( const QString &errorMessage )
{
if ( mEditorContext.mainMessageBar() )
{
mEditorContext.mainMessageBar()->pushWarning( tr( "An error occurred while filtering features" ), errorMessage );
}
}

void QgsDualView::featureListAboutToChangeEditSelection( bool &ok )
{
if ( mLayer->isEditable() && !mAttributeForm->save() )
Expand Down
2 changes: 2 additions & 0 deletions src/gui/attributetable/qgsdualview.h
Expand Up @@ -388,6 +388,8 @@ class GUI_EXPORT QgsDualView : public QStackedWidget, private Ui::QgsDualViewBas

void flashButtonClicked( bool clicked );

void filterError( const QString &errorMessage );

private:

/**
Expand Down

0 comments on commit 4d26e10

Please sign in to comment.