aboutsummaryrefslogtreecommitdiffstats
path: root/src/imports/folderlistmodel
diff options
context:
space:
mode:
authorChris Adams <christopher.adams@nokia.com>2011-05-23 15:38:53 +1000
committerChris Adams <christopher.adams@nokia.com>2011-05-23 17:07:57 +1000
commitcca7611e260c8ba86da3b01a83e70447c1c362bc (patch)
tree5871e736a8096c744c3279117befdd83e8f56daf /src/imports/folderlistmodel
parent036cdbf1e128ecb4c5563087591958df93a52459 (diff)
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
Diffstat (limited to 'src/imports/folderlistmodel')
-rw-r--r--src/imports/folderlistmodel/qdeclarativefolderlistmodel.cpp64
-rw-r--r--src/imports/folderlistmodel/qdeclarativefolderlistmodel.h1
2 files changed, 55 insertions, 10 deletions
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);