16 #include <QApplication> 18 #include <QtConcurrentMap> 34 : QFutureWatcher( nullptr )
42 return QString::localeAwareCompare( a->
name(), b->
name() ) < 0;
46 : QAbstractItemModel( parent )
67 beginRemoveRows( QModelIndex(), idx, idx );
72 mProjectHome = home.isNull() ? nullptr :
new QgsProjectHomeItem(
nullptr, tr(
"Project Home" ), home,
"project:" + home );
77 beginInsertRows( QModelIndex(), 0, 0 );
90 QStyle *style = QApplication::style();
91 QIcon homeIcon( style->standardPixmap( QStyle::SP_DirHomeIcon ) );
105 Q_FOREACH (
const QFileInfo &drive, QDir::drives() )
107 QString path = drive.absolutePath();
113 item->
setSortKey( QStringLiteral(
" 3 %1" ).arg( path ) );
120 QString path = QString(
"/Volumes" );
127 QMap<int, QgsDataItem *> providerMap;
145 providerMap.insertMulti( capabilities, item );
150 Q_FOREACH (
int key, providerMap.uniqueKeys() )
152 QList<QgsDataItem *> providerGroup = providerMap.values( key );
153 if ( providerGroup.size() > 1 )
155 std::sort( providerGroup.begin(), providerGroup.end(), cmpByDataItemName_ );
177 if ( ! mInitialized )
190 if ( !index.isValid() )
191 return Qt::ItemFlags();
193 Qt::ItemFlags
flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
197 flags |= Qt::ItemIsDragEnabled;
200 flags |= Qt::ItemIsDropEnabled;
206 if ( !index.isValid() )
214 else if ( role == Qt::DisplayRole )
222 else if ( role == Qt::ToolTipRole )
226 else if ( role == Qt::DecorationRole && index.column() == 0 )
253 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
255 return QVariant(
"header" );
265 if ( !parent.isValid() )
281 if ( !parent.isValid() )
296 return findPath(
this, path, matchFlag );
302 return QModelIndex();
305 bool foundChild =
true;
311 for (
int i = 0; i < model->rowCount( index ); i++ )
313 QModelIndex idx = model->index( i, 0, index );
315 QString itemPath = model->data( idx,
PathRole ).toString();
316 if ( itemPath == path )
323 if ( path.startsWith( itemPath +
'/' ) )
332 if ( matchFlag == Qt::MatchStartsWith )
336 return QModelIndex();
350 if ( column < 0 || column >=
columnCount() || row < 0 )
351 return QModelIndex();
356 return item ? createIndex( row, column, item ) : QModelIndex();
363 return QModelIndex();
372 for (
int i = 0; i < items.size(); i++ )
374 if ( items[i] == item )
375 return createIndex( i, 0, item );
377 QModelIndex childIndex =
findItem( item, items[i] );
378 if ( childIndex.isValid() )
382 return QModelIndex();
388 QModelIndex idx =
findItem( parent );
389 if ( !idx.isValid() )
392 beginInsertRows( idx, first, last );
403 QModelIndex idx =
findItem( parent );
404 if ( !idx.isValid() )
406 beginRemoveRows( idx, first, last );
417 if ( !idx.isValid() )
419 emit dataChanged( idx, idx );
426 if ( !idx.isValid() )
428 QgsDebugMsgLevel( QString(
"item %1 state changed %2 -> %3" ).arg( item->
path() ).arg( oldState ).arg( item->
state() ), 4 );
449 if ( collectionItem )
458 types << QStringLiteral(
"application/x-vnd.qgis.qgis.uri" );
465 Q_FOREACH (
const QModelIndex &
index, indexes )
467 if ( index.isValid() )
495 void *v = idx.internalPointer();
558 QStringList hiddenItems = settings.
value( QStringLiteral(
"browser/hiddenPaths" ),
559 QStringList() ).toStringList();
560 int idx = hiddenItems.indexOf( item->
path() );
563 hiddenItems.removeAt( idx );
567 hiddenItems << item->
path();
569 settings.
setValue( QStringLiteral(
"browser/hiddenPaths" ), hiddenItems );
577 beginRemoveRows( QModelIndex(), i, i );
A Collection: logical collection of layers or subcollections, e.g.
virtual QVariant sortKey() const
Returns the sorting key for the item.
void beginInsertItems(QgsDataItem *parent, int first, int last)
void setSortKey(const QVariant &key)
Sets a custom sorting key for the item.
bool canFetchMore(const QModelIndex &parent) const override
QString name() const
Returns the name of the item (the displayed text for the item).
void connectionsChanged()
Connections changed in the browser, forwarded to the widget and used to notify the provider dialogs o...
void dataChanged(QgsDataItem *item)
void hidePath(QgsDataItem *item)
Hide the given path in the browser model.
QgsBrowserModel(QObject *parent=nullptr)
Constructor for QgsBrowserModel, with the specified parent object.
This class is a composition of two QSettings instances:
virtual QgsDataItem * createDataItem(const QString &path, QgsDataItem *parentItem)=0
Create a new instance of QgsDataItem (or null) for given path and parent item.
void connectionsChanged()
Emitted when the provider's connections of the child items have changed This signal is normally forwa...
int rowCount(const QModelIndex &parent=QModelIndex()) const override
void fetchMore(const QModelIndex &parent) override
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
virtual bool handleDrop(const QMimeData *, Qt::DropAction)
Attempts to process the mime data dropped on this item.
QModelIndex findPath(const QString &path, Qt::MatchFlag matchFlag=Qt::MatchExactly)
Returns index of item with given path.
void beginRemoveItems(QgsDataItem *parent, int first, int last)
void connectItem(QgsDataItem *item)
static QMimeData * encodeUriList(const UriList &layers)
void setIcon(const QIcon &icon)
bool isValid() const
Returns whether the object contains valid data.
void itemStateChanged(QgsDataItem *item, QgsDataItem::State oldState)
QStringList mimeTypes() const override
void projectSaved()
Emitted when the project file has been written and closed.
bool hasChildren(const QModelIndex &parent=QModelIndex()) const override
Item path used to access path in the tree, see QgsDataItem::mPath.
QgsDirectoryItem * mProjectHome
static void deleteLater(QVector< QgsDataItem *> &items)
QgsDataItem * parent() const
Gets item parent.
QgsFavoritesItem * mFavorites
void beginRemoveItems(QgsDataItem *parent, int first, int last)
#define QgsDebugMsgLevel(str, level)
QModelIndex parent(const QModelIndex &index) const override
QVector< QgsDataItem * > mRootItems
void readProject(const QDomDocument &)
Emitted when a project is being read.
Children not yet created.
Creating children in separate thread (populating or refreshing)
void initialize()
Delayed initialization, needed because the provider registry must be already populated.
QgsDataItem * dataItem(const QModelIndex &idx) const
void removeFavorite(const QModelIndex &index)
Removes a favorite directory from its corresponding model index.
virtual bool hasDragEnabled() const
Returns true if the item may be dragged.
virtual int capabilities()=0
Returns combination of flags from QgsDataProvider::DataCapabilities.
virtual QgsMimeDataUtils::Uri mimeUri() const
Returns mime URI for the data item.
QgsBrowserWatcher(QgsDataItem *item)
static bool hiddenPath(const QString &path)
Check if the given path is hidden from the browser model.
void reload()
Reload the whole model.
A directory: contains subdirectories and layers.
Base class for all items in the model.
Custom sort role, see QgsDataItem::sortKey()
QVector< QgsDataItem * > children() const
QModelIndex findItem(QgsDataItem *item, QgsDataItem *parent=nullptr) const
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
~QgsBrowserModel() override
void addFavoriteDirectory(const QString &directory, const QString &name=QString())
Adds a directory to the favorites group.
void beginInsertItems(QgsDataItem *parent, int first, int last)
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
Contains various Favorites directories.
void removeDirectory(QgsDirectoryItem *item)
Removes an existing directory from the favorites group.
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
void addDirectory(const QString &directory, const QString &name=QString())
Adds a new directory to the favorites group.
static QgsProject * instance()
Returns the QgsProject singleton instance.
int columnCount(const QModelIndex &parent=QModelIndex()) const override
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
void stateChanged(const QModelIndex &index, QgsDataItem::State oldState)
Emitted when item children fetch was finished.
void refresh(const QString &path)
Refresh item specified by path.
QList< QgsMimeDataUtils::Uri > UriList
QMimeData * mimeData(const QModelIndexList &indexes) const override
void homePathChanged()
Emitted when the home path of the project changes.
Item that represents a layer that can be opened with one of the providers.
virtual void deleteChildItem(QgsDataItem *child)
Removes and deletes a child item, emitting relevant signals to the model.
virtual QString name()=0
Human-readable name of the provider name.
void itemDataChanged(QgsDataItem *item)
Qt::ItemFlags flags(const QModelIndex &index) const override
virtual void populate(const QVector< QgsDataItem *> &children)
virtual bool acceptDrop()
Returns whether the item accepts drag and dropped layers - e.g.
virtual QString comments() const
Returns comments of the layer.
void addRootItems()
Populates the model.
static QgsDataItemProviderRegistry * dataItemProviderRegistry()
Returns the application's data item provider registry, which keeps a list of data item providers that...
virtual void refresh(const QVector< QgsDataItem *> &children)
Refresh the items from a specified list of child items.
This is the interface for those who want to add custom data items to the browser tree.
void stateChanged(QgsDataItem *item, QgsDataItem::State oldState)