From cca7611e260c8ba86da3b01a83e70447c1c362bc Mon Sep 17 00:00:00 2001 From: Chris Adams Date: Mon, 23 May 2011 15:38:53 +1000 Subject: Ensure that showDirs is respected in FolderListModel Calling index() on a QDirModel can modify the filters applied. This patch to FolderListModel ensures that filtering is reset if required, so that programmatically selecting a subfolder in a folder does not cause that subfolder to become visible if showDirs is set to false. Task-number: QTBUG-17837 Reviewed-by: Martin Jones Change-Id: I449321d5170ecedf2a0cb36483d50020305a26dd --- .../qdeclarativefolderlistmodel.cpp | 64 ++++++++++++++++++---- .../folderlistmodel/qdeclarativefolderlistmodel.h | 1 + 2 files changed, 55 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp b/src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp index 9fe01bf22c..8a9166751d 100644 --- a/src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp +++ b/src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp @@ -53,7 +53,7 @@ class QDeclarativeFolderListModelPrivate { public: QDeclarativeFolderListModelPrivate() - : sortField(QDeclarativeFolderListModel::Name), sortReversed(false), count(0) { + : sortField(QDeclarativeFolderListModel::Name), sortReversed(false), count(0), showDirs(true), showDots(false), showOnlyReadable(false), insideRefresh(false) { nameFilters << QLatin1String("*"); } @@ -90,6 +90,10 @@ public: QDeclarativeFolderListModel::SortField sortField; bool sortReversed; int count; + bool showDirs; + bool showDots; + bool showOnlyReadable; + bool insideRefresh; }; /*! @@ -222,15 +226,39 @@ void QDeclarativeFolderListModel::setFolder(const QUrl &folder) { if (folder == d->folder) return; - QModelIndex index = d->model.index(folder.toLocalFile()); - if ((index.isValid() && d->model.isDir(index)) || folder.toLocalFile().isEmpty()) { + QModelIndex index = d->model.index(folder.toLocalFile()); // This can modify the filtering rules. + if ((index.isValid() && d->model.isDir(index)) || folder.toLocalFile().isEmpty()) { d->folder = folder; - QMetaObject::invokeMethod(this, "refresh", Qt::QueuedConnection); + QMetaObject::invokeMethod(this, "resetFiltering", Qt::QueuedConnection); // resetFiltering will invoke refresh(). emit folderChanged(); } } +void QDeclarativeFolderListModel::resetFiltering() +{ + // ensure that we reset the filtering rules, because the QDirModel::index() + // function isn't quite as const as it claims to be. + QDir::Filters filt = d->model.filter(); + + if (d->showDirs) + filt |= (QDir::AllDirs | QDir::Drives); + else + filt &= ~(QDir::AllDirs | QDir::Drives); + + if (d->showDots) + filt &= ~QDir::NoDotAndDotDot; + else + filt |= QDir::NoDotAndDotDot; + + if (d->showOnlyReadable) + filt |= QDir::Readable; + else + filt &= ~QDir::Readable; + + d->model.setFilter(filt); // this causes a refresh(). +} + /*! \qmlproperty url FolderListModel::parentFolder @@ -363,12 +391,17 @@ bool QDeclarativeFolderListModel::isFolder(int index) const void QDeclarativeFolderListModel::refresh() { + if (d->insideRefresh) + return; + d->insideRefresh = true; + d->folderIndex = QModelIndex(); if (d->count) { emit beginRemoveRows(QModelIndex(), 0, d->count-1); d->count = 0; emit endRemoveRows(); } + d->folderIndex = d->model.index(d->folder.toLocalFile()); int newcount = d->model.rowCount(d->folderIndex); if (newcount) { @@ -376,6 +409,8 @@ void QDeclarativeFolderListModel::refresh() d->count = newcount; emit endInsertRows(); } + + d->insideRefresh = false; // finished refreshing. } void QDeclarativeFolderListModel::inserted(const QModelIndex &index, int start, int end) @@ -423,10 +458,13 @@ void QDeclarativeFolderListModel::setShowDirs(bool on) { if (!(d->model.filter() & QDir::AllDirs) == !on) return; - if (on) + if (on) { + d->showDirs = true; d->model.setFilter(d->model.filter() | QDir::AllDirs | QDir::Drives); - else + } else { + d->showDirs = false; d->model.setFilter(d->model.filter() & ~(QDir::AllDirs | QDir::Drives)); + } } /*! @@ -448,10 +486,13 @@ void QDeclarativeFolderListModel::setShowDotAndDotDot(bool on) { if (!(d->model.filter() & QDir::NoDotAndDotDot) == on) return; - if (on) + if (on) { + d->showDots = true; d->model.setFilter(d->model.filter() & ~QDir::NoDotAndDotDot); - else + } else { + d->showDots = false; d->model.setFilter(d->model.filter() | QDir::NoDotAndDotDot); + } } /*! @@ -473,10 +514,13 @@ void QDeclarativeFolderListModel::setShowOnlyReadable(bool on) { if (!(d->model.filter() & QDir::Readable) == !on) return; - if (on) + if (on) { + d->showOnlyReadable = true; d->model.setFilter(d->model.filter() | QDir::Readable); - else + } else { + d->showOnlyReadable = false; d->model.setFilter(d->model.filter() & ~QDir::Readable); + } } //![code] diff --git a/src/imports/folderlistmodel/qdeclarativefolderlistmodel.h b/src/imports/folderlistmodel/qdeclarativefolderlistmodel.h index 17dc84c026..b0d91e4797 100644 --- a/src/imports/folderlistmodel/qdeclarativefolderlistmodel.h +++ b/src/imports/folderlistmodel/qdeclarativefolderlistmodel.h @@ -136,6 +136,7 @@ Q_SIGNALS: //![class end] private Q_SLOTS: void refresh(); + void resetFiltering(); void inserted(const QModelIndex &index, int start, int end); void removed(const QModelIndex &index, int start, int end); void handleDataChanged(const QModelIndex &start, const QModelIndex &end); -- cgit v1.2.3