16 #include <QItemSelectionModel> 35 : QSortFilterProxyModel( parent )
39 setDynamicSortFilter(
true );
51 if ( leftSelected && !rightSelected )
53 return sortOrder() == Qt::AscendingOrder;
55 else if ( rightSelected && !leftSelected )
57 return sortOrder() == Qt::DescendingOrder;
73 if ( order != Qt::AscendingOrder && order != Qt::DescendingOrder )
74 order = Qt::AscendingOrder;
76 int myColumn = mColumnMapping.at( column );
78 QSortFilterProxyModel::sort( myColumn, order );
84 if ( mapColumnToSource( index.column() ) == -1 )
90 QModelIndex fieldIndex = QSortFilterProxyModel::mapToSource( QSortFilterProxyModel::index( index.row(), 0, index.parent() ) );
97 return QSortFilterProxyModel::data( index, role );
102 if ( orientation == Qt::Horizontal )
104 if ( mColumnMapping.at( section ) == -1 && role == Qt::DisplayRole )
105 return tr(
"Actions" );
107 return QSortFilterProxyModel::headerData( section, orientation, role );
111 if ( role == Qt::DisplayRole )
115 int sourceSection =
mapToSource( index( section, ( !mColumnMapping.isEmpty() && mColumnMapping.at( 0 ) == -1 ) ? 1 : 0 ) ).row();
116 return sourceModel()->headerData( sourceSection, orientation, role );
123 return mColumnMapping.indexOf( -1 );
129 return mColumnMapping.count();
143 QVector<int> newColumnMapping;
144 const auto constColumns = mConfig.
columns();
148 if ( columnConfig.hidden )
153 newColumnMapping << newValue;
156 if ( newColumnMapping != mColumnMapping )
158 bool requiresReset =
false;
159 int firstRemovedColumn = -1;
160 int removedColumnCount = 0;
163 for (
int i = 0; i < std::min( newColumnMapping.size(), mColumnMapping.size() - removedColumnCount ); ++i )
165 if ( newColumnMapping.at( i ) == mColumnMapping.at( i + removedColumnCount ) )
168 if ( firstRemovedColumn == -1 )
170 firstRemovedColumn = i;
172 while ( i < mColumnMapping.size() - removedColumnCount && mColumnMapping.at( i + removedColumnCount ) != newColumnMapping.at( i ) )
174 ++removedColumnCount;
179 requiresReset =
true;
185 if ( firstRemovedColumn == -1 )
187 if ( newColumnMapping.size() > mColumnMapping.size() )
190 beginInsertColumns( QModelIndex(), mColumnMapping.size(), newColumnMapping.size() - 1 );
191 mColumnMapping = newColumnMapping;
197 beginRemoveColumns( QModelIndex(), newColumnMapping.size(), mColumnMapping.size() - 1 );
198 mColumnMapping = newColumnMapping;
204 if ( newColumnMapping.size() == mColumnMapping.size() - removedColumnCount )
207 beginRemoveColumns( QModelIndex(), firstRemovedColumn, firstRemovedColumn + removedColumnCount - 1 );
208 mColumnMapping = newColumnMapping;
213 requiresReset =
true;
220 mColumnMapping = newColumnMapping;
231 if ( order != Qt::AscendingOrder && order != Qt::DescendingOrder )
232 order = Qt::AscendingOrder;
234 QSortFilterProxyModel::sort( -1 );
236 QSortFilterProxyModel::sort( 0, order );
246 if ( mSelectedOnTop != selectedOnTop )
249 int column = sortColumn();
250 Qt::SortOrder order = sortOrder();
256 if ( order != Qt::AscendingOrder && order != Qt::DescendingOrder )
257 order = Qt::AscendingOrder;
259 sort( 0, Qt::AscendingOrder );
266 mTableModel = sourceModel;
270 mColumnMapping.append( i );
273 QSortFilterProxyModel::setSourceModel( sourceModel );
276 disconnect( mTableModel, SIGNAL( columnsAboutToBeInserted( QModelIndex,
int,
int ) ),
this, SLOT( _q_sourceColumnsAboutToBeInserted( QModelIndex,
int,
int ) ) );
277 disconnect( mTableModel, SIGNAL( columnsInserted( QModelIndex,
int,
int ) ),
this, SLOT( _q_sourceColumnsInserted( QModelIndex,
int,
int ) ) );
278 disconnect( mTableModel, SIGNAL( columnsAboutToBeRemoved( QModelIndex,
int,
int ) ),
this, SLOT( _q_sourceColumnsAboutToBeRemoved( QModelIndex,
int,
int ) ) );
279 disconnect( mTableModel, SIGNAL( columnsRemoved( QModelIndex,
int,
int ) ),
this, SLOT( _q_sourceColumnsRemoved( QModelIndex,
int,
int ) ) );
281 connect( mTableModel, &QAbstractItemModel::columnsAboutToBeInserted,
this, &QgsAttributeTableFilterModel::onColumnsChanged );
282 connect( mTableModel, &QAbstractItemModel::columnsAboutToBeRemoved,
this, &QgsAttributeTableFilterModel::onColumnsChanged );
288 return mSelectedOnTop;
293 mFilteredFeatures = ids;
301 ids.reserve( rowCount() );
302 for (
int i = 0; i < rowCount(); ++i )
304 QModelIndex row = index( i, 0 );
312 if ( filterMode != mFilterMode )
331 Q_UNUSED( sourceParent )
332 switch ( mFilterMode )
380 void QgsAttributeTableFilterModel::selectionChanged()
386 else if ( mSelectedOnTop )
392 void QgsAttributeTableFilterModel::onColumnsChanged()
397 int QgsAttributeTableFilterModel::mapColumnToSource(
int column )
const 399 if ( mColumnMapping.isEmpty() )
401 if ( column < 0 || column >= mColumnMapping.size() )
404 return mColumnMapping.at( column );
407 int QgsAttributeTableFilterModel::mapColumnFromSource(
int column )
const 409 if ( mColumnMapping.isEmpty() )
412 return mColumnMapping.indexOf( column );
425 mFilteredFeatures.clear();
426 if ( !
layer()->renderer() )
428 QgsDebugMsg( QStringLiteral(
"Cannot get renderer" ) );
432 std::unique_ptr< QgsFeatureRenderer > renderer(
layer()->renderer()->clone() );
437 QgsDebugMsg( QStringLiteral(
"Out of scale limits" ) );
455 renderer->startRender( renderContext,
layer()->fields() );
473 if ( !filter || renderer->willRenderFeature( f, renderContext ) )
475 mFilteredFeatures << f.
id();
478 if ( t.elapsed() > 5000 )
481 emit progress( i, cancel );
494 renderer->stopRender( renderContext );
510 QModelIndexList indexes;
512 for (
const QModelIndex &idx : constIdToIndexList )
522 if ( !proxyIndex.isValid() )
523 return QModelIndex();
525 int sourceColumn = mapColumnToSource( proxyIndex.column() );
529 if ( sourceColumn == -1 )
532 return QSortFilterProxyModel::mapToSource( index( proxyIndex.row(), sourceColumn, proxyIndex.parent() ) );
537 QModelIndex proxyIndex = QSortFilterProxyModel::mapFromSource( sourceIndex );
539 if ( proxyIndex.column() < 0 )
540 return QModelIndex();
542 int col = mapColumnFromSource( proxyIndex.column() );
547 return index( proxyIndex.row(), col, proxyIndex.parent() );
553 if ( mapColumnToSource( index.column() ) == -1 )
554 return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
void generateListOfVisibleFeatures()
Updates the list of currently visible features on the map canvas.
QgsFeatureId rowToId(const QModelIndex &row)
Returns the feature id for a given model index.
QgsVectorLayer * layer() const
Returns the layer this filter acts on.
Wrapper for iterator of features from vector data provider or vector layer.
QVariant data(const QModelIndex &index, int role) const override
int extraColumns() const
Empty extra columns to announce from this model.
A rectangle specified with double values.
Depends on scale if feature will be rendered (rule based )
void update(const QgsFields &fields)
Update the configuration with the given fields.
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override
Returns true if the source row will be accepted.
QSet< QgsFeatureId > QgsFeatureIds
bool selectedOnTop()
Returns if selected features are currently shown on top.
void setAttributeTableConfig(const QgsAttributeTableConfig &config)
Set the attribute table configuration to control which fields are shown, in which order they are show...
QgsAttributeTableModel * masterModel() const
Returns the table model this filter is using.
void setSelectedOnTop(bool selectedOnTop)
Changes the sort order of the features.
void setFilterMode(FilterMode filterMode)
Set the filter mode the filter will use.
QModelIndex mapFromMaster(const QModelIndex &sourceIndex) const
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
Features may be filtered, i.e. some features may not be rendered (categorized, rule based ...
QString sortCacheExpression(unsigned long cacheIndex=0) const
The expression which was used to fill the sorting cache at index cacheIndex.
void setRendererScale(double scale)
Sets the renderer map scale.
void prefetchSortData(const QString &expression, unsigned long cacheIndex=0)
Prefetches the entire data for an expression.
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override
Used by the sorting algorithm.
QModelIndex mapToSource(const QModelIndex &proxyIndex) const override
This column represents an action widget.
bool isFeatureAdded(QgsFeatureId id) const
Returns true if the specified feature ID has been added but not committed.
QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
A model backed by a QgsVectorLayerCache which is able to provide feature/attribute information to a Q...
Show only visible features (depends on the map canvas)
const QgsRectangle & filterRect() const
Returns the rectangle from which features will be taken.
void setExtent(const QgsRectangle &extent)
When rendering a map layer, calling this method sets the "clipping" extent for the layer (in the laye...
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes takes output image size into accou...
Map canvas is a class for displaying all GIS data types on a canvas.
bool qgsVariantLessThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is less than the second.
QgsAttributeTableFilterModel(QgsMapCanvas *canvas, QgsAttributeTableModel *sourceModel, QObject *parent=nullptr)
Make sure, the master model is already loaded, so the selection will get synchronized.
virtual void setFilteredFeatures(const QgsFeatureIds &ids)
Specify a list of features, which the filter will accept.
The QgsMapSettings class contains configuration for rendering of the map.
Get the feature id of the feature in this row.
int actionColumnIndex() const
Gets the index of the first column that contains an action widget.
Q_INVOKABLE QgsVectorLayerEditBuffer * editBuffer()
Buffer with uncommitted editing operations. Only valid after editing has been turned on...
Role used for sorting start here.
Show only selected features.
FilterMode filterMode()
The current filterModel.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
Q_INVOKABLE const QgsFeatureIds & selectedFeatureIds() const
Returns a list of the selected features IDs in this layer.
int columnCount(const QModelIndex &parent=QModelIndex()) const override
Returns the number of columns.
FilterMode
The filter mode defines how the rows should be filtered.
double scale() const
Returns the calculated map scale.
QgsRectangle intersect(const QgsRectangle &rect) const
Returns the intersection with the given rectangle.
QgsRectangle extent() const
Returns the current zoom extent of the map canvas.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
QgsVectorLayerCache * layerCache() const
Returns the layer cache this model uses as backend.
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
void selectionChanged(const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect)
Emitted when selection was changed.
Show only features which have unsaved changes.
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
bool isFeatureAttributesChanged(QgsFeatureId id) const
Returns true if the specified feature ID has had an attribute changed but not committed.
This column shows action buttons.
const QgsMapToPixel & mapToPixel() const
void setSourceModel(QgsAttributeTableModel *sourceModel)
Set the attribute table model that backs this model.
QModelIndexList idToIndexList(QgsFeatureId id) const
void extentsChanged()
Is called upon every change of the visible extents on the map canvas.
QString sortExpression() const
The expression which is used to sort the attribute table.
This column shows a field.
QgsExpressionContext & expressionContext()
Gets the expression context.
Show only features whose ids are on the filter list. {.
QVector< QgsAttributeTableConfig::ColumnConfig > columns() const
Gets the list with all columns and their configuration.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
Contains information about the context of a rendering operation.
void sort(int column, Qt::SortOrder order=Qt::AscendingOrder) override
Sort by the given column using the given order.
int columnCount(const QModelIndex &parent) const override
void setMapToPixel(const QgsMapToPixel &mtp)
Sets the context's map to pixel transform, which transforms between map coordinates and device coordi...
bool isNull() const
Test if the rectangle is null (all coordinates zero or after call to setMinimal()).
Defines the configuration of a column in the attribute table.
QgsFeatureId rowToId(int row) const
Maps row to feature id.
QgsFeatureIds filteredFeatures()
Gets a list of currently filtered feature ids.
void appendScopes(const QList< QgsExpressionContextScope *> &scopes)
Appends a list of scopes to the end of the context.
bool nextFeature(QgsFeature &f)
This is a container for configuration of the attribute table.
Qt::SortOrder sortOrder() const
Gets the sort order.
The type of a given column.
QgsPointXY mapToLayerCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from output CRS to layer's CRS
QString sortExpression() const
Gets the expression used for sorting.
void sortColumnChanged(int column, Qt::SortOrder order)
Emitted whenever the sort column is changed.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &featureRequest=QgsFeatureRequest())
Query this VectorLayerCache for features.
QModelIndexList fidToIndexList(QgsFeatureId fid)
void extentsChanged()
Emitted when the extents of the map change.
bool hasSameColumns(const QgsAttributeTableConfig &other) const
Compare this configuration's columns name, type, and order to other.
void prefetchColumnData(int column)
Caches the entire data for one column.
Qt::ItemFlags flags(const QModelIndex &index) const override
Returns item flags for the index.
QModelIndex fidToIndex(QgsFeatureId fid) override
Qt::ItemFlags flags(const QModelIndex &index) const override
bool isFeatureGeometryChanged(QgsFeatureId id) const
Returns true if the specified feature ID has had its geometry changed but not committed.