QGIS API Documentation 3.99.0-Master (d270888f95f)
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
77}
78
79QgsProviderSublayerModelNode *QgsProviderSublayerModelGroup::addChild( std::unique_ptr<QgsProviderSublayerModelNode> child )
80{
81 if ( !child )
82 return nullptr;
83
84 Q_ASSERT( !child->mParent );
85 child->mParent = this;
86
87 QgsProviderSublayerModelNode *res = child.get();
88 mChildren.emplace_back( std::move( child ) );
89 // cppcheck-suppress returnDanglingLifetime
90 return res;
91}
92
93int QgsProviderSublayerModelGroup::indexOf( QgsProviderSublayerModelNode *child ) const
94{
95 Q_ASSERT( child->mParent == this );
96 auto it = std::find_if( mChildren.begin(), mChildren.end(), [&]( const std::unique_ptr<QgsProviderSublayerModelNode> &p )
97 {
98 return p.get() == child;
99 } );
100 if ( it != mChildren.end() )
101 return std::distance( mChildren.begin(), it );
102 return -1;
103}
104
105QgsProviderSublayerModelNode *QgsProviderSublayerModelGroup::childAt( int index )
106{
107 if ( static_cast< std::size_t >( index ) < mChildren.size() )
108 return mChildren[ index ].get();
109
110 return nullptr;
111}
112
113void QgsProviderSublayerModelGroup::removeChildAt( int index )
114{
115 mChildren.erase( mChildren.begin() + index );
116}
117
118QgsProviderSublayerModelGroup *QgsProviderSublayerModelGroup::findGroup( const QString &name ) const
119{
120 for ( const auto &node : mChildren )
121 {
122 if ( QgsProviderSublayerModelGroup *group = dynamic_cast< QgsProviderSublayerModelGroup * >( node.get() ) )
123 {
124 if ( group->name() == name )
125 return group;
126 }
127 }
128 return nullptr;
129}
130
131QgsProviderSublayerModelGroup *QgsProviderSublayerModelGroup::findGroupForPath( const QStringList &path ) const
132{
133 const QgsProviderSublayerModelGroup *currentGroup = this;
134 for ( const QString &part : path )
135 {
136 currentGroup = currentGroup->findGroup( part );
137 }
138 return const_cast< QgsProviderSublayerModelGroup * >( currentGroup );
139}
140
141QgsProviderSublayerModelSublayerNode *QgsProviderSublayerModelGroup::findSublayer( const QgsProviderSublayerDetails &sublayer )
142{
143 for ( const auto &node : mChildren )
144 {
145 if ( QgsProviderSublayerModelGroup *group = dynamic_cast< QgsProviderSublayerModelGroup * >( node.get() ) )
146 {
147 if ( QgsProviderSublayerModelSublayerNode *node = group->findSublayer( sublayer ) )
148 return node;
149 }
150 else if ( QgsProviderSublayerModelSublayerNode *sublayerNode = dynamic_cast< QgsProviderSublayerModelSublayerNode * >( node.get() ) )
151 {
152 if ( sublayerNode->sublayer() == sublayer )
153 return sublayerNode;
154 }
155 }
156 return nullptr;
157}
158
159QVariant QgsProviderSublayerModelGroup::data( int role, int column ) const
160{
161 switch ( role )
162 {
163 case Qt::DisplayRole:
164 case Qt::ToolTipRole:
165 case Qt::EditRole:
166 {
167 switch ( static_cast< QgsProviderSublayerModel::Column >( column ) )
168 {
170 return mGroupTitle;
171
173 return QVariant();
174 }
175 return QVariant();
176 }
177
178 case Qt::DecorationRole:
179 {
180 if ( column == 0 )
181 return QgsApplication::getThemeIcon( u"/mIconDbSchema.svg"_s );
182 else
183 return QVariant();
184 }
185
186 default:
187 return QVariant();
188 }
189}
190
191QgsProviderSublayerModelSublayerNode::QgsProviderSublayerModelSublayerNode( const QgsProviderSublayerDetails &sublayer )
192 : mSublayer( sublayer )
193{
194}
195
196QVariant QgsProviderSublayerModelSublayerNode::data( int role, int column ) const
197{
198 switch ( role )
199 {
200 case Qt::DisplayRole:
201 case Qt::ToolTipRole:
202 case Qt::EditRole:
203 {
204 switch ( static_cast< QgsProviderSublayerModel::Column >( column ) )
205 {
207 return mSublayer.name();
209 {
210 switch ( mSublayer.type() )
211 {
213 {
214 QString count;
215 if ( mSublayer.featureCount() == static_cast< long long >( Qgis::FeatureCountState::Uncounted )
216 || mSublayer.featureCount() == static_cast< long long >( Qgis::FeatureCountState::UnknownCount ) )
217 count = QObject::tr( "Uncounted" );
218 else
219 count = QLocale().toString( mSublayer.featureCount() );
220
221 if ( !mSublayer.description().isEmpty() )
222 return u"%1 - %2 (%3)"_s.arg( mSublayer.description(),
223 QgsWkbTypes::displayString( mSublayer.wkbType() ),
224 count );
225 else
226 return u"%2 (%3)"_s.arg(
227 QgsWkbTypes::displayString( mSublayer.wkbType() ),
228 count );
229 }
230
239 return mSublayer.description();
240 }
241 break;
242
243 }
244 }
245 return mSublayer.name();
246
247 }
248
249 case Qt::DecorationRole:
250 {
251 if ( column == 0 )
252 return mSublayer.type() == Qgis::LayerType::Vector
253 ? ( mSublayer.wkbType() != Qgis::WkbType::Unknown ? QgsIconUtils::iconForWkbType( mSublayer.wkbType() ) : QVariant() )
254 : QgsIconUtils::iconForLayerType( mSublayer.type() );
255 else
256 return QVariant();
257 }
258
259 case static_cast< int >( QgsProviderSublayerModel::Role::IsNonLayerItem ):
260 return false;
261
262 case static_cast< int >( QgsProviderSublayerModel::Role::ProviderKey ):
263 return mSublayer.providerKey();
264
265 case static_cast< int >( QgsProviderSublayerModel::Role::LayerType ):
266 return static_cast< int >( mSublayer.type() );
267
268 case static_cast< int >( QgsProviderSublayerModel::Role::Uri ):
269 return mSublayer.uri();
270
271 case static_cast< int >( QgsProviderSublayerModel::Role::Name ):
272 return mSublayer.name();
273
274 case static_cast< int >( QgsProviderSublayerModel::Role::Description ):
275 return mSublayer.description();
276
277 case static_cast< int >( QgsProviderSublayerModel::Role::Path ):
278 return mSublayer.path();
279
280 case static_cast< int >( QgsProviderSublayerModel::Role::FeatureCount ):
281 return mSublayer.featureCount();
282
283 case static_cast< int >( QgsProviderSublayerModel::Role::WkbType ):
284 return static_cast< quint32>( mSublayer.wkbType() );
285
287 return mSublayer.geometryColumnName();
288
289 case static_cast< int >( QgsProviderSublayerModel::Role::LayerNumber ):
290 return mSublayer.layerNumber();
291
292 case static_cast< int >( QgsProviderSublayerModel::Role::Flags ):
293 return static_cast< int >( mSublayer.flags() );
294
295 default:
296 return QVariant();
297 }
298}
299
300QgsProviderSublayerModelNonLayerItemNode::QgsProviderSublayerModelNonLayerItemNode( const QgsProviderSublayerModel::NonLayerItem &item )
301 : mItem( item )
302{
303}
304
305QVariant QgsProviderSublayerModelNonLayerItemNode::data( int role, int column ) const
306{
307 switch ( role )
308 {
309 case Qt::DisplayRole:
310 case Qt::ToolTipRole:
311 case Qt::EditRole:
312 {
313 switch ( static_cast< QgsProviderSublayerModel::Column >( column ) )
314 {
316 return mItem.name();
318 return mItem.description();
319 }
320 return QVariant();
321 }
322
323 case Qt::DecorationRole:
324 {
325 if ( column == 0 )
326 return mItem.icon();
327 else
328 return QVariant();
329 }
330
331 case static_cast< int >( QgsProviderSublayerModel::Role::IsNonLayerItem ):
332 return true;
333
334 case static_cast< int >( QgsProviderSublayerModel::Role::Uri ):
335 return mItem.uri();
336
337 case static_cast< int >( QgsProviderSublayerModel::Role::Name ):
338 return mItem.name();
339
340 case static_cast< int >( QgsProviderSublayerModel::Role::Description ):
341 return mItem.description();
342
343 case static_cast< int >( QgsProviderSublayerModel::Role::NonLayerItemType ):
344 return mItem.type();
345
346 default:
347 return QVariant();
348 }
349}
350
352
353//
354// QgsProviderSublayerModel
355//
356
358 : QAbstractItemModel( parent )
359 , mRootNode( std::make_unique< QgsProviderSublayerModelGroup >( QString() ) )
360{
361
362}
363
364void QgsProviderSublayerModel::setSublayerDetails( const QList<QgsProviderSublayerDetails> &details )
365{
366 if ( mSublayers.isEmpty() )
367 {
368 // initial population, just keep things simple and reset the model
369 beginResetModel();
370 mRootNode->populateFromSublayers( details );
371 mSublayers = details;
372 endResetModel();
373 }
374 else
375 {
376 // gracefully go item by item...
377
378 // remove layers which don't exist in new list
379 for ( int i = mSublayers.count() - 1; i >= 0; --i )
380 {
381 if ( !details.contains( mSublayers.at( i ) ) )
382 {
383 QgsProviderSublayerModelSublayerNode *sublayerNode = mRootNode->findSublayer( mSublayers.at( i ) );
384 Q_ASSERT( sublayerNode );
385 Q_ASSERT( sublayerNode->parent() );
386 const int row = sublayerNode->parent()->indexOf( sublayerNode );
387
388 beginRemoveRows( node2index( sublayerNode->parent() ), row, row );
389 sublayerNode->parent()->removeChildAt( row );
390 mSublayers.removeAt( i );
391 endRemoveRows();
392 }
393 }
394
395 // and add new layers which exist only in new list
396 for ( const QgsProviderSublayerDetails &sublayer : details )
397 {
398 if ( !mSublayers.contains( sublayer ) )
399 {
400 // need to add new layer
401 QgsProviderSublayerModelGroup *group = mRootNode->findGroupForPath( sublayer.path() );
402 beginInsertRows( node2index( group ), group->childCount(), group->childCount() );
403 group->addChild( std::make_unique< QgsProviderSublayerModelSublayerNode >( sublayer ) );
404 mSublayers.append( sublayer );
405 endInsertRows();
406 }
407 }
408 }
409}
410
411QList<QgsProviderSublayerDetails> QgsProviderSublayerModel::sublayerDetails() const
412{
413 return mSublayers;
414}
415
417{
418 if ( QgsProviderSublayerModelSublayerNode *n = dynamic_cast< QgsProviderSublayerModelSublayerNode *>( index2node( index ) ) )
419 return n->sublayer();
420 else
422}
423
425{
426 if ( QgsProviderSublayerModelNonLayerItemNode *n = dynamic_cast< QgsProviderSublayerModelNonLayerItemNode *>( index2node( index ) ) )
427 return n->item();
428 else
430}
431
433{
434 beginInsertRows( QModelIndex(), mRootNode->childCount(), mRootNode->childCount() );
435 mRootNode->addChild( std::make_unique< QgsProviderSublayerModelNonLayerItemNode >( item ) );
436 endInsertRows();
437}
438
439QModelIndex QgsProviderSublayerModel::index( int row, int column, const QModelIndex &parent ) const
440{
441 if ( column < 0 || column >= columnCount()
442 || row < 0 || row >= rowCount( parent ) )
443 {
444 // out of bounds
445 return QModelIndex();
446 }
447
448 QgsProviderSublayerModelGroup *n = dynamic_cast< QgsProviderSublayerModelGroup *>( index2node( parent ) );
449 if ( !n )
450 return QModelIndex(); // have no children
451
452 return createIndex( row, column, n->childAt( row ) );
453}
454
455QModelIndex QgsProviderSublayerModel::parent( const QModelIndex &child ) const
456{
457 if ( !child.isValid() )
458 return QModelIndex();
459
460 if ( QgsProviderSublayerModelNode *n = index2node( child ) )
461 {
462 return indexOfParentNode( n->parent() ); // must not be null
463 }
464 else
465 {
466 Q_ASSERT( false );
467 return QModelIndex();
468 }
469}
470
471int QgsProviderSublayerModel::columnCount( const QModelIndex &parent ) const
472{
473 Q_UNUSED( parent )
474 return static_cast< int >( Column::Description ) + 1;
475}
476
477int QgsProviderSublayerModel::rowCount( const QModelIndex &parent ) const
478{
479 QgsProviderSublayerModelNode *n = index2node( parent );
480 if ( !n )
481 return 0;
482
483 return n->childCount();
484}
485
486Qt::ItemFlags QgsProviderSublayerModel::flags( const QModelIndex &index ) const
487{
488 if ( !index.isValid() )
489 {
490 Qt::ItemFlags rootFlags = Qt::ItemFlags();
491 return rootFlags;
492 }
493
494 Qt::ItemFlags f = Qt::ItemIsEnabled;
495
496 // if index is a group, it is not selectable ...
497 if ( !dynamic_cast< QgsProviderSublayerModelGroup * >( index2node( index ) ) )
498 {
499 f |= Qt::ItemIsSelectable;
500 }
501 return f;
502}
503
504QVariant QgsProviderSublayerModel::data( const QModelIndex &index, int role ) const
505{
506 if ( !index.isValid() )
507 return QVariant();
508
509
510 QgsProviderSublayerModelNode *node = index2node( index );
511 if ( !node )
512 return QVariant();
513
514 return node->data( role, index.column() );
515}
516
517QVariant QgsProviderSublayerModel::headerData( int section, Qt::Orientation orientation, int role ) const
518{
519 switch ( orientation )
520 {
521 case Qt::Vertical:
522 break;
523 case Qt::Horizontal:
524 {
525 switch ( role )
526 {
527 case Qt::DisplayRole:
528 case Qt::ToolTipRole:
529 {
530 switch ( static_cast< Column>( section ) )
531 {
533 return tr( "Item" );
535 return tr( "Description" );
536 }
537 break;
538 }
539 }
540 break;
541 }
542 }
543 return QVariant();
544}
545
547QgsProviderSublayerModelNode *QgsProviderSublayerModel::index2node( const QModelIndex &index ) const
548{
549 if ( !index.isValid() )
550 return mRootNode.get();
551
552 return reinterpret_cast<QgsProviderSublayerModelNode *>( index.internalPointer() );
553}
554
555QModelIndex QgsProviderSublayerModel::indexOfParentNode( QgsProviderSublayerModelNode *parentNode ) const
556{
557 Q_ASSERT( parentNode );
558
559 QgsProviderSublayerModelGroup *grandParentNode = parentNode->parent();
560 if ( !grandParentNode )
561 return QModelIndex(); // root node -> invalid index
562
563 int row = grandParentNode->indexOf( parentNode );
564 Q_ASSERT( row >= 0 );
565
566 return createIndex( row, 0, parentNode );
567}
568
569QModelIndex QgsProviderSublayerModel::node2index( QgsProviderSublayerModelNode *node ) const
570{
571 if ( !node || !node->parent() )
572 return QModelIndex(); // this is the only root item -> invalid index
573
574 QModelIndex parentIndex = node2index( node->parent() );
575
576 int row = node->parent()->indexOf( node );
577 Q_ASSERT( row >= 0 );
578 return index( row, 0, parentIndex );
579}
581
582//
583// QgsProviderSublayerModel::NonLayerItem
584//
585
587{
588 return mType;
589}
590
592{
593 mType = type;
594}
595
597{
598 return mName;
599}
600
602{
603 mName = name;
604}
605
607{
608 return mDescription;
609}
610
612{
613 mDescription = description;
614}
615
617{
618 return mUri;
619}
620
622{
623 mUri = uri;
624}
625
627{
628 return mIcon;
629}
630
632{
633 mIcon = icon;
634}
635
637{
638 return mType == other.mType
639 && mName == other.mName
640 && mDescription == other.mDescription
641 && mUri == other.mUri;
642}
643
645{
646 return !( *this == other );
647}
648
649//
650// QgsProviderSublayerProxyModel
651//
652
654 : QSortFilterProxyModel( parent )
655{
656 setRecursiveFilteringEnabled( true );
657 setDynamicSortFilter( true );
658 sort( 0 );
659}
660
661bool QgsProviderSublayerProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
662{
663 const QModelIndex sourceIndex = sourceModel()->index( source_row, 0, source_parent );
664
665 if ( !mIncludeSystemTables && static_cast< Qgis::SublayerFlags >( sourceModel()->data( sourceIndex, static_cast< int >( QgsProviderSublayerModel::Role::Flags ) ).toInt() ) & Qgis::SublayerFlag::SystemTable )
666 return false;
667
668 if ( !mIncludeEmptyLayers && sourceModel()->data( sourceIndex, static_cast< int >( QgsProviderSublayerModel::Role::FeatureCount ) ) == 0 )
669 return false;
670
671 if ( mFilterString.trimmed().isEmpty() )
672 return true;
673
674 if ( sourceModel()->data( sourceIndex, static_cast< int >( QgsProviderSublayerModel::Role::Name ) ).toString().contains( mFilterString, Qt::CaseInsensitive ) )
675 return true;
676
677 // check against the Description column's display role as it might be different from QgsProviderSublayerModel::Role::Description
678 const QModelIndex descriptionColumnIndex = sourceModel()->index( source_row, 1, source_parent );
679 if ( sourceModel()->data( descriptionColumnIndex, static_cast< int >( Qt::DisplayRole ) ).toString().contains( mFilterString, Qt::CaseInsensitive ) )
680 return true;
681
682 const QVariant wkbTypeVariant = sourceModel()->data( sourceIndex, static_cast< int >( QgsProviderSublayerModel::Role::WkbType ) );
683 if ( wkbTypeVariant.isValid() )
684 {
685 const Qgis::WkbType wkbType = static_cast< Qgis::WkbType >( wkbTypeVariant.toUInt() );
686 if ( QgsWkbTypes::displayString( wkbType ).contains( mFilterString, Qt::CaseInsensitive ) )
687 return true;
688 }
689
690 return false;
691}
692
693bool QgsProviderSublayerProxyModel::lessThan( const QModelIndex &source_left, const QModelIndex &source_right ) const
694{
695 const bool leftIsNonLayer = sourceModel()->data( source_left, static_cast< int >( QgsProviderSublayerModel::Role::IsNonLayerItem ) ).toBool();
696 const bool rightIsNonLayer = sourceModel()->data( source_right, static_cast< int >( QgsProviderSublayerModel::Role::IsNonLayerItem ) ).toBool();
697
698 if ( leftIsNonLayer && !rightIsNonLayer )
699 return true;
700 else if ( rightIsNonLayer && !leftIsNonLayer )
701 return false;
702
703 const QString leftName = sourceModel()->data( source_left, static_cast< int >( QgsProviderSublayerModel::Role::Name ) ).toString();
704 const QString rightName = sourceModel()->data( source_right, static_cast< int >( QgsProviderSublayerModel::Role::Name ) ).toString();
705
706 return QString::localeAwareCompare( leftName, rightName ) < 0;
707}
708
710{
711 return mIncludeSystemTables;
712}
713
715{
716 mIncludeSystemTables = include;
717 invalidateFilter();
718}
719
721{
722 return mIncludeEmptyLayers;
723}
724
726{
727 mIncludeEmptyLayers = include;
728 invalidateFilter();
729}
730
732{
733 return mFilterString;
734}
735
737{
738 mFilterString = filter;
739 invalidateFilter();
740}
@ SystemTable
Sublayer is a system or internal table, which should be hidden by default.
Definition qgis.h:1468
QFlags< SublayerFlag > SublayerFlags
Sublayer flags.
Definition qgis.h:1471
@ Group
Composite group layer. Added in QGIS 3.24.
Definition qgis.h:201
@ Plugin
Plugin based layer.
Definition qgis.h:196
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
Definition qgis.h:202
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
Definition qgis.h:199
@ Vector
Vector layer.
Definition qgis.h:194
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
Definition qgis.h:198
@ Mesh
Mesh layer. Added in QGIS 3.2.
Definition qgis.h:197
@ Raster
Raster layer.
Definition qgis.h:195
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
Definition qgis.h:200
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:280
@ Unknown
Unknown.
Definition qgis.h:281
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:565
@ UnknownCount
Provider returned an unknown feature count.
Definition qgis.h:566