20 : QSortFilterProxyModel( parent )
22 setDynamicSortFilter(
true );
24 setSortCaseSensitivity( Qt::CaseInsensitive );
31 setSourceModel( model );
36 const QModelIndex sourceIndex = mapToSource( index );
37 return mModel ? mModel->
dataItem( sourceIndex ) :
nullptr;
42 if ( mPatternSyntax == syntax )
44 mPatternSyntax = syntax;
50 return mPatternSyntax;
55 if ( mFilter == filter )
68 mCaseSensitivity = sensitivity;
74 return mCaseSensitivity;
77 void QgsBrowserProxyModel::updateFilter()
80 switch ( mPatternSyntax )
84 const QStringList filterParts = mFilter.split(
'|' );
85 for (
const QString &f : filterParts )
87 QRegExp rx( QStringLiteral(
"*%1*" ).arg( f.trimmed() ) );
88 rx.setPatternSyntax( QRegExp::Wildcard );
89 rx.setCaseSensitivity( mCaseSensitivity );
96 const QStringList filterParts = mFilter.split(
'|' );
97 for (
const QString &f : filterParts )
99 QRegExp rx( f.trimmed() );
100 rx.setPatternSyntax( QRegExp::Wildcard );
101 rx.setCaseSensitivity( mCaseSensitivity );
102 mREList.append( rx );
108 QRegExp rx( mFilter.trimmed() );
109 rx.setPatternSyntax( QRegExp::RegExp );
110 rx.setCaseSensitivity( mCaseSensitivity );
111 mREList.append( rx );
118 bool QgsBrowserProxyModel::filterAcceptsString(
const QString &value )
const 120 switch ( mPatternSyntax )
125 for (
const QRegExp &rx : mREList )
127 if ( rx.exactMatch( value ) )
135 for (
const QRegExp &rx : mREList )
137 if ( rx.indexIn( value ) != -1 )
149 if ( ( mFilter.isEmpty() && !mFilterByLayerType ) || !mModel )
152 QModelIndex sourceIndex = mModel->
index( sourceRow, 0, sourceParent );
153 return filterAcceptsItem( sourceIndex ) || filterAcceptsAncestor( sourceIndex ) || filterAcceptsDescendant( sourceIndex );
173 bool QgsBrowserProxyModel::filterAcceptsAncestor(
const QModelIndex &sourceIndex )
const 178 if ( mFilterByLayerType )
181 QModelIndex sourceParentIndex = mModel->
parent( sourceIndex );
182 if ( !sourceParentIndex.isValid() )
184 if ( filterAcceptsItem( sourceParentIndex ) )
187 return filterAcceptsAncestor( sourceParentIndex );
190 bool QgsBrowserProxyModel::filterAcceptsDescendant(
const QModelIndex &sourceIndex )
const 195 for (
int i = 0; i < mModel->
rowCount( sourceIndex ); i++ )
197 QModelIndex sourceChildIndex = mModel->
index( i, 0, sourceIndex );
198 if ( filterAcceptsItem( sourceChildIndex ) )
200 if ( filterAcceptsDescendant( sourceChildIndex ) )
206 bool QgsBrowserProxyModel::filterAcceptsItem(
const QModelIndex &sourceIndex )
const 211 if ( mFilterByLayerType )
214 if (
QgsLayerItem *layerItem = qobject_cast< QgsLayerItem * >( item ) )
216 if ( layerItem->mapLayerType() != mLayerType )
219 else if ( !qobject_cast< QgsDataCollectionItem * >( item ) )
223 if ( !mFilter.isEmpty() )
227 return ( filterAcceptsString( mModel->
data( sourceIndex, Qt::DisplayRole ).toString() )
228 || ( !comment.isEmpty() && filterAcceptsString( comment ) ) );
QString filterString() const
Returns the filter string used when filtering items in the model.
void setLayerType(QgsMapLayer::LayerType type)
Sets the layer type to filter the model by.
FilterSyntax
Filter syntax options.
int rowCount(const QModelIndex &parent=QModelIndex()) const override
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
FilterSyntax filterSyntax() const
Returns the filter syntax.
bool filterByLayerType() const
Returns true if the model is filtered by map layer type.
QgsMapLayer::LayerType layerType() const
Returns the layer type to filter the model by.
void setBrowserModel(QgsBrowserModel *model)
Sets the underlying browser model.
QgsBrowserProxyModel(QObject *parent=nullptr)
Constructor for QgsBrowserProxyModel, with the specified parent object.
void setFilterSyntax(FilterSyntax syntax)
Sets the filter syntax.
Qt::CaseSensitivity caseSensitivity() const
Returns whether item filtering is case sensitive.
QModelIndex parent(const QModelIndex &index) const override
LayerType
Types of layers that can be added to a map.
QgsDataItem * dataItem(const QModelIndex &idx) const
Returns the data item at the specified index, or a nullptr if no item exists at the index...
Regular expression filtering.
void setFilterString(const QString &filter)
Sets the filter string to use when filtering items in the model.
void setFilterCaseSensitivity(Qt::CaseSensitivity sensitivity)
Sets whether item filtering should be case sensitive.
Base class for all items in the model.
Custom sort role, see QgsDataItem::sortKey()
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
QgsDataItem * dataItem(const QModelIndex &index) const
Returns the data item at the specified proxy index, or a nullptr if no item exists at the index...
Standard string filtering.
A model for showing available data sources and other items in a structured tree.
Item that represents a layer that can be opened with one of the providers.
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override
void setFilterByLayerType(bool enabled)
Sets whether the model is filtered by map layer type.