22#include <QRegularExpression>
25#include "moc_qgsbrowserproxymodel.cpp"
27using namespace Qt::StringLiterals;
30 : QSortFilterProxyModel( parent )
32 setDynamicSortFilter(
true );
34 setSortCaseSensitivity( Qt::CaseInsensitive );
41 setSourceModel( model );
46 const QModelIndex sourceIndex = mapToSource( index );
47 return mModel ?
mModel->dataItem( sourceIndex ) :
nullptr;
52 if ( mPatternSyntax == syntax )
54 mPatternSyntax = syntax;
60 return mPatternSyntax;
65 if ( mFilter == filter )
78 mCaseSensitivity = sensitivity;
84 return mCaseSensitivity;
87void QgsBrowserProxyModel::updateFilter()
90 switch ( mPatternSyntax )
94 const QStringList filterParts = mFilter.split(
'|' );
95 for (
const QString &f : filterParts )
97 const QRegularExpression
98 rx( QRegularExpression::wildcardToRegularExpression( u
"*%1*"_s.arg( f.trimmed() ) ), mCaseSensitivity == Qt::CaseInsensitive ? QRegularExpression::CaseInsensitiveOption : QRegularExpression::NoPatternOption );
105 const QStringList filterParts = mFilter.split(
'|' );
106 for (
const QString &f : filterParts )
108 const QRegularExpression
109 rx( QRegularExpression::wildcardToRegularExpression( f.trimmed() ), mCaseSensitivity == Qt::CaseInsensitive ? QRegularExpression::CaseInsensitiveOption : QRegularExpression::NoPatternOption );
110 mREList.append( rx );
116 const QRegularExpression rx( mFilter.trimmed(), mCaseSensitivity == Qt::CaseInsensitive ? QRegularExpression::CaseInsensitiveOption : QRegularExpression::NoPatternOption );
117 mREList.append( rx );
124bool QgsBrowserProxyModel::filterAcceptsString(
const QString &value )
const
126 for (
const QRegularExpression &rx : mREList )
128 if ( rx.match( value ).hasMatch() )
140 const QModelIndex sourceIndex =
mModel->index( sourceRow, 0, sourceParent );
141 if ( !filterAcceptsProviderKey( sourceIndex ) || !filterRootAcceptsProviderKey( sourceIndex ) )
147 if ( qobject_cast< QgsLayerItem * >( item ) )
152 else if ( item && !mFilterByLayerType )
158 return filterAcceptsItem( sourceIndex ) || filterAcceptsAncestor( sourceIndex ) || filterAcceptsDescendant( sourceIndex );
188bool QgsBrowserProxyModel::filterAcceptsAncestor(
const QModelIndex &sourceIndex )
const
193 if ( mFilterByLayerType )
196 const QModelIndex sourceParentIndex =
mModel->
parent( sourceIndex );
197 if ( !sourceParentIndex.isValid() )
199 if ( filterAcceptsItem( sourceParentIndex ) )
202 return filterAcceptsAncestor( sourceParentIndex );
205bool QgsBrowserProxyModel::filterAcceptsDescendant(
const QModelIndex &sourceIndex )
const
210 for (
int i = 0; i <
mModel->rowCount( sourceIndex ); i++ )
212 const QModelIndex sourceChildIndex =
mModel->index( i, 0, sourceIndex );
213 if ( filterAcceptsItem( sourceChildIndex ) )
215 if ( filterAcceptsDescendant( sourceChildIndex ) )
221bool QgsBrowserProxyModel::filterAcceptsItem(
const QModelIndex &sourceIndex )
const
226 QgsDataItem *item =
mModel->dataItem( sourceIndex );
227 if ( mFilterByLayerType )
231 if ( QgsLayerItem *layerItem = qobject_cast< QgsLayerItem * >( item ) )
233 if ( layerItem->mapLayerType() != mLayerType )
236 else if ( !qobject_cast< QgsDataCollectionItem * >( item ) )
244 if ( !mFilter.isEmpty() )
249 filterAcceptsString(
mModel->data( sourceIndex, Qt::DisplayRole ).toString() )
250 || ( !comment.isEmpty() && filterAcceptsString( comment ) )
258bool QgsBrowserProxyModel::filterAcceptsProviderKey(
const QModelIndex &sourceIndex )
const
264 if ( providerKey.isEmpty() )
267 return !mHiddenDataItemsKeys.contains( providerKey ) && ( mShownDataItemsKeys.isEmpty() || mShownDataItemsKeys.contains( providerKey ) );
270bool QgsBrowserProxyModel::filterRootAcceptsProviderKey(
const QModelIndex &sourceIndex )
const
275 const QModelIndex sourceParentIndex =
mModel->parent( sourceIndex );
276 if ( !sourceParentIndex.isValid() )
278 return filterAcceptsProviderKey( sourceIndex );
281 return filterRootAcceptsProviderKey( sourceParentIndex );
286 mHiddenDataItemsKeys = filter;
292 mShownDataItemsKeys = filter;
299 const bool isFertile { QSortFilterProxyModel::hasChildren( parent ) };
300 if ( isFertile && parent.isValid() )
303 if ( item && !mShowLayers )
308 else if ( mFilterByLayerType && qobject_cast< QgsLayerItem * >( item ) )
LayerType
Types of layers that can be added to a map.
@ HideWhenNotFilteringByLayerType
Item should be hidden from the view when no layer type filter is in place.
A model for showing available data sources and other items in a structured tree.
QModelIndex parent(const QModelIndex &index) const override
@ Sort
Custom sort role, see QgsDataItem::sortKey().
@ ProviderKey
Data item provider key that created the item, see QgsDataItem::providerKey().
void setShowLayers(bool showLayers)
Sets show layers to showLayers.
FilterSyntax
Filter syntax options.
@ RegularExpression
Regular expression filtering.
@ Wildcards
Wildcard filtering.
@ Normal
Standard string filtering.
void setShownDataItemProviderKeyFilter(const QStringList &shownItemsFilter)
Sets a filter to show data items based on QgsDataItem::providerKey() associated with the item.
void setHiddenDataItemProviderKeyFilter(const QStringList &hiddenItemsFilter)
Sets a filter to hide data items based on QgsDataItem::providerKey() associated with the item.
void setFilterByLayerType(bool enabled)
Sets whether the model is filtered by map layer type.
bool hasChildren(const QModelIndex &parent=QModelIndex()) const override
void setFilterString(const QString &filter)
Sets the filter string to use when filtering items in the model.
QgsDataItem * dataItem(const QModelIndex &index) const
Returns the data item at the specified proxy index, or nullptr if no item exists at the index.
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override
void setLayerType(Qgis::LayerType type)
Sets the layer type to filter the model by.
void setFilterCaseSensitivity(Qt::CaseSensitivity sensitivity)
Sets whether item filtering should be case sensitive.
QString filterString() const
Returns the filter string used when filtering items in the 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.
bool filterByLayerType() const
Returns true if the model is filtered by map layer type.
bool showLayers() const
Returns true if layers must be shown, this flag is TRUE by default.
FilterSyntax filterSyntax() const
Returns the filter syntax.
Qgis::LayerType layerType() const
Returns the layer type to filter the model by.
void setBrowserModel(QgsBrowserModel *model)
Sets the underlying browser model.
QgsBrowserModel * mModel
Reference to associated browser model.
Base class for all items in the model.
virtual bool layerCollection() const
Returns true if the data item is a collection of layers The default implementation returns false,...
virtual Qgis::BrowserItemFilterFlags filterFlags() const
Returns the filter flags for the data item.