33#include <QApplication>
34#include <QItemSelectionModel>
37#include "moc_qgsattributetablefiltermodel.cpp"
39using namespace Qt::StringLiterals;
46 : QSortFilterProxyModel( parent )
50 setDynamicSortFilter(
true );
54 mReloadVisibleTimer.setSingleShot(
true );
55 connect( &mReloadVisibleTimer, &QTimer::timeout,
this, &QgsAttributeTableFilterModel::reloadVisible );
56 mFilterFeaturesTimer.setSingleShot(
true );
67 if ( leftSelected && !rightSelected )
69 return sortOrder() == Qt::AscendingOrder;
71 else if ( rightSelected && !leftSelected )
73 return sortOrder() == Qt::DescendingOrder;
77 if ( mTableModel->sortCacheExpression().isEmpty() )
88 if ( order != Qt::AscendingOrder && order != Qt::DescendingOrder )
89 order = Qt::AscendingOrder;
95 QSortFilterProxyModel::sort( 0, order );
111 if ( !force && mConfig.hasSameColumns( oldConfig ) )
116 if ( !mConfig.sortExpression().isEmpty() )
118 sort( mConfig.sortExpression(), mConfig.sortOrder() );
124 mFilterExpression = expression;
125 mFilterExpressionContext = context;
130 if ( order != Qt::AscendingOrder && order != Qt::DescendingOrder )
131 order = Qt::AscendingOrder;
133 QSortFilterProxyModel::sort( -1 );
135 QSortFilterProxyModel::sort( 0, order );
148 int column = sortColumn();
149 Qt::SortOrder order = sortOrder();
155 if ( order != Qt::AscendingOrder && order != Qt::DescendingOrder )
156 order = Qt::AscendingOrder;
158 sort( column, order );
165 mTableModel = sourceModel;
167 QSortFilterProxyModel::setSourceModel( sourceModel );
170 connect( mTableModel, &QAbstractItemModel::columnsAboutToBeInserted,
this, &QgsAttributeTableFilterModel::onColumnsChanged );
171 connect( mTableModel, &QAbstractItemModel::columnsAboutToBeRemoved,
this, &QgsAttributeTableFilterModel::onColumnsChanged );
176 return mSelectedOnTop;
181 mFilteredFeatures = ids;
192 ids.reserve( rowCount() );
193 for (
int i = 0; i < rowCount(); ++i )
195 const QModelIndex row = index( i, 0 );
220 switch ( mFilterMode )
268 Q_UNUSED( sourceParent )
269 switch ( mFilterMode )
317void QgsAttributeTableFilterModel::reloadVisible()
324void QgsAttributeTableFilterModel::onAttributeValueChanged(
QgsFeatureId fid,
int idx,
const QVariant &value )
331 startTimedFilterFeatures();
335void QgsAttributeTableFilterModel::onGeometryChanged()
339 startTimedFilterFeatures();
343void QgsAttributeTableFilterModel::startTimedReloadVisible()
345 mReloadVisibleTimer.start( 10 );
348void QgsAttributeTableFilterModel::startTimedFilterFeatures()
350 mFilterFeaturesTimer.start( 10 );
355 if ( !mFilterExpression.isValid() )
364 const bool fetchGeom = mFilterExpression.needsGeometry();
366 QApplication::setOverrideCursor( Qt::WaitCursor );
368 mFilterExpression.setGeomCalculator( &distanceArea );
372 request.
setSubsetOfAttributes( mFilterExpression.referencedColumns(), mTableModel->layer()->fields() );
391 mFilterExpressionContext.setFeature( f );
392 if ( mFilterExpression.evaluate( &mFilterExpressionContext ).toInt() != 0 )
396 if ( mFilterExpression.hasEvalError() && error.isEmpty() )
398 error = mFilterExpression.evalErrorString();
406 QApplication::restoreOverrideCursor();
410 if ( !error.isEmpty() )
417void QgsAttributeTableFilterModel::selectionChanged()
423 else if ( mSelectedOnTop )
429void QgsAttributeTableFilterModel::onColumnsChanged()
444 mFilteredFeatures.clear();
445 if ( !
layer()->renderer() )
451 std::unique_ptr<QgsFeatureRenderer> renderer(
layer()->renderer()->clone() );
474 renderer->startRender( renderContext,
layer()->fields() );
487 if ( canvasFilter ==
"FALSE"_L1 )
489 if ( !canvasFilter.isEmpty() )
499 if ( !filter || renderer->willRenderFeature( f, renderContext ) )
501 mFilteredFeatures << f.
id();
504 if ( t.elapsed() > 5000 )
507 emit progress( i, cancel );
520 renderer->stopRender( renderContext );
536 QModelIndexList indexes;
538 for (
const QModelIndex &idx : constIdToIndexList )
548 return mapToSource( proxyIndex );
AttributeTableFilterMode
Defines how rows in attribute tables should be filtered.
@ ShowSelected
Show only selected features.
@ ShowAll
Show all features.
@ ShowInvalid
Show only features not respecting constraints.
@ ShowVisible
Show only visible features (depends on the map canvas).
@ ShowFilteredList
Show only features whose IDs are on the filter list.
@ ShowEdited
Show only features which have unsaved changes.
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
@ BoundingBox
Filter using a bounding box.
A container for configuration of the attribute table.
void update(const QgsFields &fields)
Update the configuration with the given fields.
QgsFeatureIds filteredFeatures() const
Gets a list of currently filtered feature ids.
QString sortExpression() const
The expression which is used to sort the attribute table.
Q_DECL_DEPRECATED void extentsChanged()
Is called upon every change of the visible extents on the map canvas.
void sort(int column, Qt::SortOrder order=Qt::AscendingOrder) override
Sort by the given column using the given order.
QgsAttributeTableFilterModel(QgsMapCanvas *canvas, QgsAttributeTableModel *sourceModel, QObject *parent=nullptr)
Make sure, the master model is already loaded, so the selection will get synchronized.
void setFilterMode(Qgis::AttributeTableFilterMode filterMode)
Set the filter mode the filter will use.
void setAttributeTableConfig(const QgsAttributeTableConfig &config, bool force=false)
Set the attribute table configuration to control which fields are shown, in which order they are show...
void generateListOfVisibleFeatures()
Updates the list of currently visible features on the map canvas.
QModelIndexList fidToIndexList(QgsFeatureId fid)
void disconnectFilterModeConnections()
Disconnect the connections set for the current filterMode.
QgsFeatureId rowToId(const QModelIndex &row) const
Returns the feature id for a given model index.
QModelIndex fidToIndex(QgsFeatureId fid) override
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override
Used by the sorting algorithm.
bool selectedOnTop()
Returns if selected features are currently shown on top.
void filterError(const QString &errorMessage)
Emitted when an error occurred while filtering features.
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override
Returns true if the source row will be accepted.
void connectFilterModeConnections(Qgis::AttributeTableFilterMode filterMode)
Disconnect the connections set for the new filterMode.
QModelIndex mapFromMaster(const QModelIndex &sourceIndex) const
void filterFeatures()
Updates the filtered features in the filter model.
Q_DECL_DEPRECATED int actionColumnIndex() const
Gets the index of the first column that contains an action widget.
void setFilterExpression(const QgsExpression &expression, const QgsExpressionContext &context)
Set the expression and the context to be stored in case of the features need to be filtered again (li...
virtual void setFilteredFeatures(const QgsFeatureIds &ids)
Specify a list of features, which the filter will accept.
QgsAttributeTableModel * masterModel() const
Returns the table model this filter is using.
Qgis::AttributeTableFilterMode filterMode()
The current filterModel.
QModelIndex mapToMaster(const QModelIndex &proxyIndex) const
void featuresFiltered()
Emitted when the filtering of the features has been done.
void visibleReloaded()
Emitted when the the visible features on extend are reloaded (the list is created).
void setSourceModel(QgsAttributeTableModel *sourceModel)
Set the attribute table model that backs this model.
QgsVectorLayer * layer() const
Returns the layer this filter acts on.
void setSelectedOnTop(bool selectedOnTop)
Changes the sort order of the features.
void sortColumnChanged(int column, Qt::SortOrder order)
Emitted whenever the sort column is changed.
A model backed by a QgsVectorLayerCache which is able to provide feature/attribute information to a Q...
QString sortCacheExpression(unsigned long cacheIndex=0) const
The expression which was used to fill the sorting cache at index cacheIndex.
QgsVectorLayerCache * layerCache() const
Returns the layer cache this model uses as backend.
int columnCount(const QModelIndex &parent=QModelIndex()) const override
Returns the number of columns.
QModelIndexList idToIndexList(QgsFeatureId id) const
void prefetchSortData(const QString &expression, unsigned long cacheIndex=0)
Prefetches the entire data for an expression.
QgsFeatureId rowToId(int row) const
Maps row to feature id.
void prefetchColumnData(int column)
Caches the entire data for one column.
@ Sort
Role used for sorting start here.
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
void setSourceCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets source spatial reference system crs.
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
static std::vector< std::unique_ptr< QgsExpressionContextScope > > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
void appendScopes(const QList< QgsExpressionContextScope * > &scopes)
Appends a list of scopes to the end of the context.
Handles parsing and evaluation of expressions (formerly called "search strings").
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
bool close()
Call to end the iteration.
@ ScaleDependent
Depends on scale if feature will be rendered (rule based ).
@ Filter
Features may be filtered, i.e. some features may not be rendered (categorized, rule based ....
Wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
QgsRectangle filterRect() const
Returns the rectangle from which features will be taken.
Qgis::FeatureRequestFlags flags() const
Returns the flags which affect how features are fetched.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
Qgis::SpatialFilterType spatialFilterType() const
Returns the spatial filter type which is currently set on this request.
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
static QString filterForLayer(QgsMapCanvas *canvas, QgsVectorLayer *layer)
Constructs a filter to use for selecting features from the given layer, in order to apply filters whi...
Map canvas is a class for displaying all GIS data types on a canvas.
void extentsChanged()
Emitted when the extents of the map change.
void temporalRangeChanged()
Emitted when the map canvas temporal range changes.
Contains configuration for rendering maps.
double scale() const
Returns the calculated map scale.
const QgsMapToPixel & mapToPixel() const
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes output image size into account.
static QgsProject * instance()
Returns the QgsProject singleton instance.
A rectangle specified with double values.
QgsRectangle intersect(const QgsRectangle &rect) const
Returns the intersection with the given rectangle.
Contains information about the context of a rendering operation.
QgsExpressionContext & expressionContext()
Gets the expression context.
void setExtent(const QgsRectangle &extent)
When rendering a map layer, calling this method sets the "clipping" extent for the layer (in the laye...
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
void setRendererScale(double scale)
Sets the renderer map scale.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &featureRequest=QgsFeatureRequest())
Query this VectorLayerCache for features.
Stores queued vector layer edit operations prior to committing changes to the layer's data provider.
bool isFeatureAdded(QgsFeatureId id) const
Returns true if the specified feature ID has been added but not committed.
bool isFeatureAttributesChanged(QgsFeatureId id) const
Returns true if the specified feature ID has had an attribute changed but not committed.
bool isFeatureGeometryChanged(QgsFeatureId id) const
Returns true if the specified feature ID has had its geometry changed but not committed.
QgsRectangle extent() const final
Returns the extent of the layer.
Q_INVOKABLE const QgsFeatureIds & selectedFeatureIds() const
Returns a list of the selected features IDs in this layer.
Q_INVOKABLE QgsVectorLayerEditBuffer * editBuffer()
Buffer with uncommitted editing operations. Only valid after editing has been turned on.
void attributeValueChanged(QgsFeatureId fid, int idx, const QVariant &value)
Emitted whenever an attribute value change is done in the edit buffer.
void selectionChanged(const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect)
Emitted when selection was changed.
void featureAdded(QgsFeatureId fid)
Emitted when a new feature has been added to the layer.
void geometryChanged(QgsFeatureId fid, const QgsGeometry &geometry)
Emitted whenever a geometry change is done in the edit buffer.
bool qgsVariantLessThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is less than the second.
QSet< QgsFeatureId > QgsFeatureIds
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)