16 #include <QApplication> 18 #include <QtConcurrentMap> 33 #define PROJECT_HOME_PREFIX "project:" 34 #define HOME_PREFIX "home:" 37 : QFutureWatcher( nullptr )
45 return QString::localeAwareCompare( a->
name(), b->
name() ) < 0;
49 : QAbstractItemModel( parent )
70 beginRemoveRows( QModelIndex(), idx, idx );
80 beginInsertRows( QModelIndex(), 0, 0 );
93 setupItemConnections( item );
105 const auto drives { QDir::drives() };
106 for (
const QFileInfo &drive : drives )
108 const QString path = drive.absolutePath();
114 item->
setSortKey( QStringLiteral(
" 3 %1" ).arg( path ) );
115 mDriveItems.insert( path, item );
117 setupItemConnections( item );
122 QString path = QString(
"/Volumes" );
128 QMap<int, QgsDataItem *> providerMap;
133 int capabilities = pr->capabilities();
140 QgsDataItem *item = pr->createDataItem( QString(),
nullptr );
146 setupItemConnections( item );
147 providerMap.insertMulti( capabilities, item );
152 const auto constUniqueKeys = providerMap.uniqueKeys();
153 for (
int key : constUniqueKeys )
155 QList<QgsDataItem *> providerGroup = providerMap.values( key );
156 if ( providerGroup.size() > 1 )
158 std::sort( providerGroup.begin(), providerGroup.end(), cmpByDataItemName_ );
161 const auto constProviderGroup = providerGroup;
189 if ( ! mInitialized )
200 if ( !index.isValid() )
201 return Qt::ItemFlags();
203 Qt::ItemFlags
flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
210 return Qt::ItemFlags();
214 flags |= Qt::ItemIsDragEnabled;
218 flags |= Qt::ItemIsDropEnabled;
222 flags |= Qt::ItemIsEditable;
229 if ( !index.isValid() )
237 else if ( role == Qt::DisplayRole || role == Qt::EditRole )
245 else if ( role == Qt::ToolTipRole )
249 else if ( role == Qt::DecorationRole && index.column() == 0 )
275 if ( !index.isValid() )
293 return item->
rename( value.toString() );
303 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
305 return QVariant(
"header" );
315 if ( !parent.isValid() )
331 if ( !parent.isValid() )
346 return findPath(
this, path, matchFlag );
352 return QModelIndex();
355 bool foundChild =
true;
361 for (
int i = 0; i < model->rowCount( index ); i++ )
363 QModelIndex idx = model->index( i, 0, index );
365 QString itemPath = model->data( idx,
PathRole ).toString();
366 if ( itemPath == path )
373 if ( path.startsWith( itemPath +
'/' ) )
382 if ( matchFlag == Qt::MatchStartsWith )
386 return QModelIndex();
391 for (
int i = 0; i < this->
rowCount( index ); i++ )
393 QModelIndex idx = this->
index( i, 0, index );
395 if ( qobject_cast<QgsLayerItem *>(
dataItem( idx ) ) )
399 if ( itemUri == uri )
406 QModelIndex childIdx =
findUri( uri, idx );
407 if ( childIdx.isValid() )
410 return QModelIndex();
429 const QList< QFileInfo > drives = QDir::drives();
431 const QStringList existingDrives = mDriveItems.keys();
432 for (
const QString &drivePath : existingDrives )
434 bool stillExists =
false;
435 for (
const QFileInfo &drive : drives )
437 if ( drivePath == drive.absolutePath() )
449 removeRootItem( driveItem );
452 for (
const QFileInfo &drive : drives )
454 const QString path = drive.absolutePath();
460 if ( !mDriveItems.contains( path ) )
463 item->
setSortKey( QStringLiteral(
" 3 %1" ).arg( path ) );
465 mDriveItems.insert( path, item );
466 setupItemConnections( item );
477 if ( column < 0 || column >=
columnCount() || row < 0 )
478 return QModelIndex();
483 return item ? createIndex( row, column, item ) : QModelIndex();
490 return QModelIndex();
499 for (
int i = 0; i < items.size(); i++ )
501 if ( items[i] == item )
502 return createIndex( i, 0, item );
504 QModelIndex childIndex =
findItem( item, items[i] );
505 if ( childIndex.isValid() )
508 return QModelIndex();
514 QModelIndex idx =
findItem( parent );
515 if ( !idx.isValid() )
518 beginInsertRows( idx, first, last );
529 QModelIndex idx =
findItem( parent );
530 if ( !idx.isValid() )
532 beginRemoveRows( idx, first, last );
543 if ( !idx.isValid() )
545 emit dataChanged( idx, idx );
552 if ( !idx.isValid() )
554 QgsDebugMsgLevel( QStringLiteral(
"item %1 state changed %2 -> %3" ).arg( item->
path() ).arg( oldState ).arg( item->
state() ), 4 );
558 void QgsBrowserModel::setupItemConnections(
QgsDataItem *item )
575 if ( collectionItem )
584 types << QStringLiteral(
"application/x-vnd.qgis.qgis.uri" );
591 const auto constIndexes = indexes;
592 for (
const QModelIndex &
index : constIndexes )
594 if (
index.isValid() )
621 void *v = idx.internalPointer();
692 QStringList hiddenItems = settings.
value( QStringLiteral(
"browser/hiddenPaths" ),
693 QStringList() ).toStringList();
694 int idx = hiddenItems.indexOf( item->
path() );
697 hiddenItems.removeAt( idx );
701 hiddenItems << item->
path();
703 settings.
setValue( QStringLiteral(
"browser/hiddenPaths" ), hiddenItems );
710 removeRootItem( item );
715 void QgsBrowserModel::removeRootItem(
QgsDataItem *item )
718 beginRemoveRows( QModelIndex(), i, i );
721 if ( !mDriveItems.key( dirItem ).isEmpty() )
723 mDriveItems.remove( mDriveItems.key( dirItem ) );
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:
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.
void refreshDrives()
Refreshes the list of drive items, removing any corresponding to removed drives and adding newly adde...
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)
Q_DECL_DEPRECATED void connectItem(QgsDataItem *item)
#define Q_NOWARN_DEPRECATED_PUSH
#define PROJECT_HOME_PREFIX
static QMimeData * encodeUriList(const UriList &layers)
Encodes a URI list to a new QMimeData object.
bool isValid() const
Returns whether the object contains valid data.
virtual Q_DECL_DEPRECATED bool rename(const QString &name)
Sets a new name for the item, and returns true if the item was successfully renamed.
void itemStateChanged(QgsDataItem *item, QgsDataItem::State oldState)
QStringList mimeTypes() const override
QMap< QString, QgsDirectoryItem * > driveItems() const
Returns a map of the root drive items shown in the browser.
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)
QList< QgsDataItemProvider * > providers() const
Returns the list of available providers.
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
Children not yet created.
virtual Q_DECL_DEPRECATED bool acceptDrop()
Returns whether the item accepts drag and dropped layers - e.g.
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
Returns the data item at the specified index, or nullptr if no item exists at the index...
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 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
#define Q_NOWARN_DEPRECATED_POP
QModelIndex findItem(QgsDataItem *item, QgsDataItem *parent=nullptr) const
Returns the model index corresponding to the specified data item.
QModelIndex findUri(const QString &uri, QModelIndex index=QModelIndex())
Returns index of layer item with given uri.
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.
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
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 Q_DECL_DEPRECATED bool handleDrop(const QMimeData *, Qt::DropAction)
Attempts to process the mime data dropped on this item.
virtual void deleteChildItem(QgsDataItem *child)
Removes and deletes a child item, emitting relevant signals to the model.
void itemDataChanged(QgsDataItem *item)
Qt::ItemFlags flags(const QModelIndex &index) const override
virtual void populate(const QVector< QgsDataItem *> &children)
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)
virtual Capabilities capabilities2() const
Returns the capabilities for the data item.