QGIS API Documentation 4.0.0-Norrköping (1ddcee3d0e4)
Loading...
Searching...
No Matches
qgsprovidersublayermodel.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsprovidersublayermodel.cpp
3 ----------------------
4 begin : June 2021
5 copyright : (C) 2021 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 ***************************************************************************/
17
19
20#include "qgsapplication.h"
21#include "qgsiconutils.h"
23
24#include <QLocale>
25#include <QString>
26
27#include "moc_qgsprovidersublayermodel.cpp"
28
29using namespace Qt::StringLiterals;
30
31//
32// QgsProviderSublayerModelNode
33//
34
36QgsProviderSublayerModelNode::~QgsProviderSublayerModelNode() = default;
37
38void QgsProviderSublayerModelGroup::populateFromSublayers( const QList<QgsProviderSublayerDetails> &sublayers )
39{
40 for ( const QgsProviderSublayerDetails &sublayer : sublayers )
41 {
42 if ( !sublayer.path().isEmpty() )
43 {
44 QStringList currentPath;
45 QStringList remainingPaths = sublayer.path();
46 QgsProviderSublayerModelGroup *groupNode = this;
47
48 while ( !remainingPaths.empty() )
49 {
50 currentPath << remainingPaths.takeAt( 0 );
51
52 QgsProviderSublayerModelGroup *nextChild = groupNode->findGroup( currentPath.constLast() );
53 if ( !nextChild )
54 {
55 auto newNode = std::make_unique< QgsProviderSublayerModelGroup >( currentPath.constLast() );
56 groupNode = qgis::down_cast< QgsProviderSublayerModelGroup * >( groupNode->addChild( std::move( newNode ) ) );
57 }
58 else
59 {
60 groupNode = nextChild;
61 }
62 }
63
64 groupNode->addChild( std::make_unique< QgsProviderSublayerModelSublayerNode >( sublayer ) );
65 }
66 else
67 {
68 addChild( std::make_unique< QgsProviderSublayerModelSublayerNode >( sublayer ) );
69 }
70 }
71}
72
73QgsProviderSublayerModelGroup::QgsProviderSublayerModelGroup( const QString &title )
74 : mGroupTitle( title )
75{}
76
77QgsProviderSublayerModelNode *QgsProviderSublayerModelGroup::addChild( std::unique_ptr<QgsProviderSublayerModelNode> child )
78{
79 if ( !child )
80 return nullptr;
81
82 Q_ASSERT( !child->mParent );
83 child->mParent = this;
84
85 QgsProviderSublayerModelNode *res = child.get();
86 mChildren.emplace_back( std::move( child ) );
87 // cppcheck-suppress returnDanglingLifetime
88 return res;
89}
90
91int QgsProviderSublayerModelGroup::indexOf( QgsProviderSublayerModelNode *child ) const
92{
93 Q_ASSERT( child->mParent == this );
94 auto it = std::find_if( mChildren.begin(), mChildren.end(), [&]( const std::unique_ptr<QgsProviderSublayerModelNode> &p ) { return p.get() == child; } );
95 if ( it != mChildren.end() )
96 return std::distance( mChildren.begin(), it );
97 return -1;
98}
99
100QgsProviderSublayerModelNode *QgsProviderSublayerModelGroup::childAt( int index )
101{
102 if ( static_cast< std::size_t >( index ) < mChildren.size() )
103 return mChildren[index].get();
104
105 return nullptr;
106}
107
108void QgsProviderSublayerModelGroup::removeChildAt( int index )
109{
110 mChildren.erase( mChildren.begin() + index );
111}
112
113QgsProviderSublayerModelGroup *QgsProviderSublayerModelGroup::findGroup( const QString &name ) const
114{
115 for ( const auto &node : mChildren )
116 {
117 if ( QgsProviderSublayerModelGroup *group = dynamic_cast< QgsProviderSublayerModelGroup * >( node.get() ) )
118 {
119 if ( group->name() == name )
120 return group;
121 }
122 }
123 return nullptr;
124}
125
126QgsProviderSublayerModelGroup *QgsProviderSublayerModelGroup::findGroupForPath( const QStringList &path ) const
127{
128 const QgsProviderSublayerModelGroup *currentGroup = this;
129 for ( const QString &part : path )
130 {
131 currentGroup = currentGroup->findGroup( part );
132 }
133 return const_cast< QgsProviderSublayerModelGroup * >( currentGroup );
134}
135
136QgsProviderSublayerModelSublayerNode *QgsProviderSublayerModelGroup::findSublayer( const QgsProviderSublayerDetails &sublayer )
137{
138 for ( const auto &node : mChildren )
139 {
140 if ( QgsProviderSublayerModelGroup *group = dynamic_cast< QgsProviderSublayerModelGroup * >( node.get() ) )
141 {
142 if ( QgsProviderSublayerModelSublayerNode *node = group->findSublayer( sublayer ) )
143 return node;
144 }
145 else if ( QgsProviderSublayerModelSublayerNode *sublayerNode = dynamic_cast< QgsProviderSublayerModelSublayerNode * >( node.get() ) )
146 {
147 if ( sublayerNode->sublayer() == sublayer )
148 return sublayerNode;
149 }
150 }
151 return nullptr;
152}
153
154QVariant QgsProviderSublayerModelGroup::data( int role, int column ) const
155{
156 switch ( role )
157 {
158 case Qt::DisplayRole:
159 case Qt::ToolTipRole:
160 case Qt::EditRole:
161 {
162 switch ( static_cast< QgsProviderSublayerModel::Column >( column ) )
163 {
165 return mGroupTitle;
166
168 return QVariant();
169 }
170 return QVariant();
171 }
172
173 case Qt::DecorationRole:
174 {
175 if ( column == 0 )
176 return QgsApplication::getThemeIcon( u"/mIconDbSchema.svg"_s );
177 else
178 return QVariant();
179 }
180
181 default:
182 return QVariant();
183 }
184}
185
186QgsProviderSublayerModelSublayerNode::QgsProviderSublayerModelSublayerNode( const QgsProviderSublayerDetails &sublayer )
187 : mSublayer( sublayer )
188{}
189
190QVariant QgsProviderSublayerModelSublayerNode::data( int role, int column ) const
191{
192 switch ( role )
193 {
194 case Qt::DisplayRole:
195 case Qt::ToolTipRole:
196 case Qt::EditRole:
197 {
198 switch ( static_cast< QgsProviderSublayerModel::Column >( column ) )
199 {
201 return mSublayer.name();
203 {
204 switch ( mSublayer.type() )
205 {
207 {
208 QString count;
209 if ( mSublayer.featureCount() == static_cast< long long >( Qgis::FeatureCountState::Uncounted )
210 || mSublayer.featureCount() == static_cast< long long >( Qgis::FeatureCountState::UnknownCount ) )
211 count = QObject::tr( "Uncounted" );
212 else
213 count = QLocale().toString( mSublayer.featureCount() );
214
215 if ( !mSublayer.description().isEmpty() )
216 return u"%1 - %2 (%3)"_s.arg( mSublayer.description(), QgsWkbTypes::displayString( mSublayer.wkbType() ), count );
217 else
218 return u"%2 (%3)"_s.arg( QgsWkbTypes::displayString( mSublayer.wkbType() ), count );
219 }
220
229 return mSublayer.description();
230 }
231 break;
232 }
233 }
234 return mSublayer.name();
235 }
236
237 case Qt::DecorationRole:
238 {
239 if ( column == 0 )
240 return mSublayer.type() == Qgis::LayerType::Vector ? ( mSublayer.wkbType() != Qgis::WkbType::Unknown ? QgsIconUtils::iconForWkbType( mSublayer.wkbType() ) : QVariant() )
241 : QgsIconUtils::iconForLayerType( mSublayer.type() );
242 else
243 return QVariant();
244 }
245
246 case static_cast< int >( QgsProviderSublayerModel::Role::IsNonLayerItem ):
247 return false;
248
249 case static_cast< int >( QgsProviderSublayerModel::Role::ProviderKey ):
250 return mSublayer.providerKey();
251
252 case static_cast< int >( QgsProviderSublayerModel::Role::LayerType ):
253 return static_cast< int >( mSublayer.type() );
254
255 case static_cast< int >( QgsProviderSublayerModel::Role::Uri ):
256 return mSublayer.uri();
257
258 case static_cast< int >( QgsProviderSublayerModel::Role::Name ):
259 return mSublayer.name();
260
261 case static_cast< int >( QgsProviderSublayerModel::Role::Description ):
262 return mSublayer.description();
263
264 case static_cast< int >( QgsProviderSublayerModel::Role::Path ):
265 return mSublayer.path();
266
267 case static_cast< int >( QgsProviderSublayerModel::Role::FeatureCount ):
268 return mSublayer.featureCount();
269
270 case static_cast< int >( QgsProviderSublayerModel::Role::WkbType ):
271 return static_cast< quint32>( mSublayer.wkbType() );
272
274 return mSublayer.geometryColumnName();
275
276 case static_cast< int >( QgsProviderSublayerModel::Role::LayerNumber ):
277 return mSublayer.layerNumber();
278
279 case static_cast< int >( QgsProviderSublayerModel::Role::Flags ):
280 return static_cast< int >( mSublayer.flags() );
281
282 default:
283 return QVariant();
284 }
285}
286
287QgsProviderSublayerModelNonLayerItemNode::QgsProviderSublayerModelNonLayerItemNode( const QgsProviderSublayerModel::NonLayerItem &item )
288 : mItem( item )
289{}
290
291QVariant QgsProviderSublayerModelNonLayerItemNode::data( int role, int column ) const
292{
293 switch ( role )
294 {
295 case Qt::DisplayRole:
296 case Qt::ToolTipRole:
297 case Qt::EditRole:
298 {
299 switch ( static_cast< QgsProviderSublayerModel::Column >( column ) )
300 {
302 return mItem.name();
304 return mItem.description();
305 }
306 return QVariant();
307 }
308
309 case Qt::DecorationRole:
310 {
311 if ( column == 0 )
312 return mItem.icon();
313 else
314 return QVariant();
315 }
316
317 case static_cast< int >( QgsProviderSublayerModel::Role::IsNonLayerItem ):
318 return true;
319
320 case static_cast< int >( QgsProviderSublayerModel::Role::Uri ):
321 return mItem.uri();
322
323 case static_cast< int >( QgsProviderSublayerModel::Role::Name ):
324 return mItem.name();
325
326 case static_cast< int >( QgsProviderSublayerModel::Role::Description ):
327 return mItem.description();
328
329 case static_cast< int >( QgsProviderSublayerModel::Role::NonLayerItemType ):
330 return mItem.type();
331
332 default:
333 return QVariant();
334 }
335}
336
338
339//
340// QgsProviderSublayerModel
341//
342
344 : QAbstractItemModel( parent )
345 , mRootNode( std::make_unique< QgsProviderSublayerModelGroup >( QString() ) )
346{}
347
348void QgsProviderSublayerModel::setSublayerDetails( const QList<QgsProviderSublayerDetails> &details )
349{
350 if ( mSublayers.isEmpty() )
351 {
352 // initial population, just keep things simple and reset the model
353 beginResetModel();
354 mRootNode->populateFromSublayers( details );
355 mSublayers = details;
356 endResetModel();
357 }
358 else
359 {
360 // gracefully go item by item...
361
362 // remove layers which don't exist in new list
363 for ( int i = mSublayers.count() - 1; i >= 0; --i )
364 {
365 if ( !details.contains( mSublayers.at( i ) ) )
366 {
367 QgsProviderSublayerModelSublayerNode *sublayerNode = mRootNode->findSublayer( mSublayers.at( i ) );
368 Q_ASSERT( sublayerNode );
369 Q_ASSERT( sublayerNode->parent() );
370 const int row = sublayerNode->parent()->indexOf( sublayerNode );
371
372 beginRemoveRows( node2index( sublayerNode->parent() ), row, row );
373 sublayerNode->parent()->removeChildAt( row );
374 mSublayers.removeAt( i );
375 endRemoveRows();
376 }
377 }
378
379 // and add new layers which exist only in new list
380 for ( const QgsProviderSublayerDetails &sublayer : details )
381 {
382 if ( !mSublayers.contains( sublayer ) )
383 {
384 // need to add new layer
385 QgsProviderSublayerModelGroup *group = mRootNode->findGroupForPath( sublayer.path() );
386 beginInsertRows( node2index( group ), group->childCount(), group->childCount() );
387 group->addChild( std::make_unique< QgsProviderSublayerModelSublayerNode >( sublayer ) );
388 mSublayers.append( sublayer );
389 endInsertRows();
390 }
391 }
392 }
393}
394
395QList<QgsProviderSublayerDetails> QgsProviderSublayerModel::sublayerDetails() const
396{
397 return mSublayers;
398}
399
401{
402 if ( QgsProviderSublayerModelSublayerNode *n = dynamic_cast< QgsProviderSublayerModelSublayerNode *>( index2node( index ) ) )
403 return n->sublayer();
404 else
406}
407
409{
410 if ( QgsProviderSublayerModelNonLayerItemNode *n = dynamic_cast< QgsProviderSublayerModelNonLayerItemNode *>( index2node( index ) ) )
411 return n->item();
412 else
414}
415
417{
418 beginInsertRows( QModelIndex(), mRootNode->childCount(), mRootNode->childCount() );
419 mRootNode->addChild( std::make_unique< QgsProviderSublayerModelNonLayerItemNode >( item ) );
420 endInsertRows();
421}
422
423QModelIndex QgsProviderSublayerModel::index( int row, int column, const QModelIndex &parent ) const
424{
425 if ( column < 0 || column >= columnCount() || row < 0 || row >= rowCount( parent ) )
426 {
427 // out of bounds
428 return QModelIndex();
429 }
430
431 QgsProviderSublayerModelGroup *n = dynamic_cast< QgsProviderSublayerModelGroup *>( index2node( parent ) );
432 if ( !n )
433 return QModelIndex(); // have no children
434
435 return createIndex( row, column, n->childAt( row ) );
436}
437
438QModelIndex QgsProviderSublayerModel::parent( const QModelIndex &child ) const
439{
440 if ( !child.isValid() )
441 return QModelIndex();
442
443 if ( QgsProviderSublayerModelNode *n = index2node( child ) )
444 {
445 return indexOfParentNode( n->parent() ); // must not be null
446 }
447 else
448 {
449 Q_ASSERT( false );
450 return QModelIndex();
451 }
452}
453
454int QgsProviderSublayerModel::columnCount( const QModelIndex &parent ) const
455{
456 Q_UNUSED( parent )
457 return static_cast< int >( Column::Description ) + 1;
458}
459
460int QgsProviderSublayerModel::rowCount( const QModelIndex &parent ) const
461{
462 QgsProviderSublayerModelNode *n = index2node( parent );
463 if ( !n )
464 return 0;
465
466 return n->childCount();
467}
468
469Qt::ItemFlags QgsProviderSublayerModel::flags( const QModelIndex &index ) const
470{
471 if ( !index.isValid() )
472 {
473 Qt::ItemFlags rootFlags = Qt::ItemFlags();
474 return rootFlags;
475 }
476
477 Qt::ItemFlags f = Qt::ItemIsEnabled;
478
479 // if index is a group, it is not selectable ...
480 if ( !dynamic_cast< QgsProviderSublayerModelGroup * >( index2node( index ) ) )
481 {
482 f |= Qt::ItemIsSelectable;
483 }
484 return f;
485}
486
487QVariant QgsProviderSublayerModel::data( const QModelIndex &index, int role ) const
488{
489 if ( !index.isValid() )
490 return QVariant();
491
492
493 QgsProviderSublayerModelNode *node = index2node( index );
494 if ( !node )
495 return QVariant();
496
497 return node->data( role, index.column() );
498}
499
500QVariant QgsProviderSublayerModel::headerData( int section, Qt::Orientation orientation, int role ) const
501{
502 switch ( orientation )
503 {
504 case Qt::Vertical:
505 break;
506 case Qt::Horizontal:
507 {
508 switch ( role )
509 {
510 case Qt::DisplayRole:
511 case Qt::ToolTipRole:
512 {
513 switch ( static_cast< Column>( section ) )
514 {
516 return tr( "Item" );
518 return tr( "Description" );
519 }
520 break;
521 }
522 }
523 break;
524 }
525 }
526 return QVariant();
527}
528
530QgsProviderSublayerModelNode *QgsProviderSublayerModel::index2node( const QModelIndex &index ) const
531{
532 if ( !index.isValid() )
533 return mRootNode.get();
534
535 return reinterpret_cast<QgsProviderSublayerModelNode *>( index.internalPointer() );
536}
537
538QModelIndex QgsProviderSublayerModel::indexOfParentNode( QgsProviderSublayerModelNode *parentNode ) const
539{
540 Q_ASSERT( parentNode );
541
542 QgsProviderSublayerModelGroup *grandParentNode = parentNode->parent();
543 if ( !grandParentNode )
544 return QModelIndex(); // root node -> invalid index
545
546 int row = grandParentNode->indexOf( parentNode );
547 Q_ASSERT( row >= 0 );
548
549 return createIndex( row, 0, parentNode );
550}
551
552QModelIndex QgsProviderSublayerModel::node2index( QgsProviderSublayerModelNode *node ) const
553{
554 if ( !node || !node->parent() )
555 return QModelIndex(); // this is the only root item -> invalid index
556
557 QModelIndex parentIndex = node2index( node->parent() );
558
559 int row = node->parent()->indexOf( node );
560 Q_ASSERT( row >= 0 );
561 return index( row, 0, parentIndex );
562}
564
565//
566// QgsProviderSublayerModel::NonLayerItem
567//
568
570{
571 return mType;
572}
573
575{
576 mType = type;
577}
578
580{
581 return mName;
582}
583
585{
586 mName = name;
587}
588
590{
591 return mDescription;
592}
593
595{
596 mDescription = description;
597}
598
600{
601 return mUri;
602}
603
605{
606 mUri = uri;
607}
608
610{
611 return mIcon;
612}
613
615{
616 mIcon = icon;
617}
618
620{
621 return mType == other.mType && mName == other.mName && mDescription == other.mDescription && mUri == other.mUri;
622}
623
625{
626 return !( *this == other );
627}
628
629//
630// QgsProviderSublayerProxyModel
631//
632
634 : QSortFilterProxyModel( parent )
635{
636 setRecursiveFilteringEnabled( true );
637 setDynamicSortFilter( true );
638 sort( 0 );
639}
640
641bool QgsProviderSublayerProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
642{
643 const QModelIndex sourceIndex = sourceModel()->index( source_row, 0, source_parent );
644
645 if ( !mIncludeSystemTables
646 && static_cast< Qgis::SublayerFlags >( sourceModel()->data( sourceIndex, static_cast< int >( QgsProviderSublayerModel::Role::Flags ) ).toInt() ) & Qgis::SublayerFlag::SystemTable )
647 return false;
648
649 if ( !mIncludeEmptyLayers && sourceModel()->data( sourceIndex, static_cast< int >( QgsProviderSublayerModel::Role::FeatureCount ) ) == 0 )
650 return false;
651
652 if ( mFilterString.trimmed().isEmpty() )
653 return true;
654
655 if ( sourceModel()->data( sourceIndex, static_cast< int >( QgsProviderSublayerModel::Role::Name ) ).toString().contains( mFilterString, Qt::CaseInsensitive ) )
656 return true;
657
658 // check against the Description column's display role as it might be different from QgsProviderSublayerModel::Role::Description
659 const QModelIndex descriptionColumnIndex = sourceModel()->index( source_row, 1, source_parent );
660 if ( sourceModel()->data( descriptionColumnIndex, static_cast< int >( Qt::DisplayRole ) ).toString().contains( mFilterString, Qt::CaseInsensitive ) )
661 return true;
662
663 const QVariant wkbTypeVariant = sourceModel()->data( sourceIndex, static_cast< int >( QgsProviderSublayerModel::Role::WkbType ) );
664 if ( wkbTypeVariant.isValid() )
665 {
666 const Qgis::WkbType wkbType = static_cast< Qgis::WkbType >( wkbTypeVariant.toUInt() );
667 if ( QgsWkbTypes::displayString( wkbType ).contains( mFilterString, Qt::CaseInsensitive ) )
668 return true;
669 }
670
671 return false;
672}
673
674bool QgsProviderSublayerProxyModel::lessThan( const QModelIndex &source_left, const QModelIndex &source_right ) const
675{
676 const bool leftIsNonLayer = sourceModel()->data( source_left, static_cast< int >( QgsProviderSublayerModel::Role::IsNonLayerItem ) ).toBool();
677 const bool rightIsNonLayer = sourceModel()->data( source_right, static_cast< int >( QgsProviderSublayerModel::Role::IsNonLayerItem ) ).toBool();
678
679 if ( leftIsNonLayer && !rightIsNonLayer )
680 return true;
681 else if ( rightIsNonLayer && !leftIsNonLayer )
682 return false;
683
684 const QString leftName = sourceModel()->data( source_left, static_cast< int >( QgsProviderSublayerModel::Role::Name ) ).toString();
685 const QString rightName = sourceModel()->data( source_right, static_cast< int >( QgsProviderSublayerModel::Role::Name ) ).toString();
686
687 return QString::localeAwareCompare( leftName, rightName ) < 0;
688}
689
691{
692 return mIncludeSystemTables;
693}
694
696{
697 mIncludeSystemTables = include;
698 invalidateFilter();
699}
700
702{
703 return mIncludeEmptyLayers;
704}
705
707{
708 mIncludeEmptyLayers = include;
709 invalidateFilter();
710}
711
713{
714 return mFilterString;
715}
716
718{
719 mFilterString = filter;
720 invalidateFilter();
721}
@ SystemTable
Sublayer is a system or internal table, which should be hidden by default.
Definition qgis.h:1488
QFlags< SublayerFlag > SublayerFlags
Sublayer flags.
Definition qgis.h:1491
@ Group
Composite group layer. Added in QGIS 3.24.
Definition qgis.h:214
@ Plugin
Plugin based layer.
Definition qgis.h:209
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
Definition qgis.h:215
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
Definition qgis.h:212
@ Vector
Vector layer.
Definition qgis.h:207
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
Definition qgis.h:211
@ Mesh
Mesh layer. Added in QGIS 3.2.
Definition qgis.h:210
@ Raster
Raster layer.
Definition qgis.h:208
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
Definition qgis.h:213
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:294
@ Unknown
Unknown.
Definition qgis.h:295
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Contains utility functions for working with icons.
static QIcon iconForWkbType(Qgis::WkbType type)
Returns the icon for a vector layer whose geometry type is provided.
Contains details about a sub layer available from a dataset.
QStringList path() const
Returns the path to the sublayer.
Contains details for a non-sublayer item to include in a QgsProviderSublayerModel.
void setName(const QString &name)
Sets the item's name.
void setDescription(const QString &description)
Sets the item's description.
void setType(const QString &type)
Sets the item's type.
QString type() const
Returns the item's type.
QString uri() const
Returns the item's URI.
QString name() const
Returns the item's name.
QIcon icon() const
Returns the item's icon.
bool operator!=(const QgsProviderSublayerModel::NonLayerItem &other) const
void setUri(const QString &uri)
Set the item's uri.
bool operator==(const QgsProviderSublayerModel::NonLayerItem &other) const
QString description() const
Returns the item's description.
void setIcon(const QIcon &icon)
Sets the item's icon.
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
QList< QgsProviderSublayerDetails > mSublayers
Sublayer list.
QList< QgsProviderSublayerDetails > sublayerDetails() const
Returns the sublayer details shown in the model.
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
QVariant data(const QModelIndex &index, int role) const override
QgsProviderSublayerModel(QObject *parent=nullptr)
Constructor for QgsProviderSublayerModel, with the specified parent object.
QgsProviderSublayerDetails indexToSublayer(const QModelIndex &index) const
Returns the sublayer corresponding to the given index.
std::unique_ptr< QgsProviderSublayerModelGroup > mRootNode
@ NonLayerItemType
Item type (for non-sublayer items).
@ IsNonLayerItem
true if item is a non-sublayer item (e.g. an embedded project)
@ FeatureCount
Feature count (for vector sublayers).
@ GeometryColumnName
Geometry column name (for vector sublayers).
@ WkbType
WKB geometry type (for vector sublayers).
QgsProviderSublayerModel::NonLayerItem indexToNonLayerItem(const QModelIndex &index) const
Returns the non layer item corresponding to the given index.
void addNonLayerItem(const QgsProviderSublayerModel::NonLayerItem &item)
Adds a non-layer item (e.g.
void setSublayerDetails(const QList< QgsProviderSublayerDetails > &details)
Sets the sublayer details to show in the model.
QModelIndex parent(const QModelIndex &index) const override
int columnCount(const QModelIndex &parent=QModelIndex()) const override
int rowCount(const QModelIndex &parent) const override
Qt::ItemFlags flags(const QModelIndex &index) const override
bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override
bool includeSystemTables() const
Returns true if system and internal tables will be shown in the model.
void setIncludeSystemTables(bool include)
Sets whether system and internal tables will be shown in the model.
QgsProviderSublayerProxyModel(QObject *parent=nullptr)
Constructor for QgsProviderSublayerProxyModel, with the specified parent object.
QString filterString() const
Returns the filter string used for filtering items in the model.
bool includeEmptyLayers() const
Returns true if empty tables will be shown in the model.
void setFilterString(const QString &filter)
Sets the filter string used for filtering items in the model.
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override
void setIncludeEmptyLayers(bool include)
Sets whether empty tables will be shown in the model.
static Q_INVOKABLE QString displayString(Qgis::WkbType type)
Returns a non-translated display string type for a WKB type, e.g., the geometry name used in WKT geom...
@ Uncounted
Feature count not yet computed.
Definition qgis.h:572
@ UnknownCount
Provider returned an unknown feature count.
Definition qgis.h:573