QFileSystemModel: Handle QDir::NoDot and QDir::NoDotDot for setFilter
authorJonathan Liu <net147@gmail.com>
Mon, 27 Dec 2010 00:59:40 +0000 (11:59 +1100)
committerOlivier Goffart <olivier.goffart@nokia.com>
Tue, 10 May 2011 10:54:44 +0000 (12:54 +0200)
Add support for QDir::NoDot and QDir::NoDotDot for setFilter in
QFileSystemModel.

Task-number: QTBUG-14760
Reviewed-by: Frederik
(cherry picked from commit b60d82fd56897b1a1d3cc730172f71c27a497ede)

src/gui/dialogs/qfilesystemmodel.cpp
tests/auto/qfilesystemmodel/tst_qfilesystemmodel.cpp

index cb8eb6a..ff4410d 100644 (file)
@@ -1977,13 +1977,14 @@ bool QFileSystemModelPrivate::filtersAcceptsNode(const QFileSystemNode *node) co
     const bool hideHidden        = !(filters & QDir::Hidden);
     const bool hideSystem        = !(filters & QDir::System);
     const bool hideSymlinks      = (filters & QDir::NoSymLinks);
-    const bool hideDotAndDotDot  = (filters & QDir::NoDotAndDotDot);
+    const bool hideDot           = (filters & QDir::NoDot) || (filters & QDir::NoDotAndDotDot); // ### Qt5: simplify (because NoDotAndDotDot=NoDot|NoDotDot)
+    const bool hideDotDot        = (filters & QDir::NoDotDot) || (filters & QDir::NoDotAndDotDot); // ### Qt5: simplify (because NoDotAndDotDot=NoDot|NoDotDot)
 
     // Note that we match the behavior of entryList and not QFileInfo on this and this
     // incompatibility won't be fixed until Qt 5 at least
-    bool isDotOrDot = (  (node->fileName == QLatin1String(".")
-                       || node->fileName == QLatin1String("..")));
-    if (   (hideHidden && (!isDotOrDot && node->isHidden()))
+    bool isDot    = (node->fileName == QLatin1String("."));
+    bool isDotDot = (node->fileName == QLatin1String(".."));
+    if (   (hideHidden && !(isDot || isDotDot) && node->isHidden())
         || (hideSystem && node->isSystem())
         || (hideDirs && node->isDir())
         || (hideFiles && node->isFile())
@@ -1991,7 +1992,8 @@ bool QFileSystemModelPrivate::filtersAcceptsNode(const QFileSystemNode *node) co
         || (hideReadable && node->isReadable())
         || (hideWritable && node->isWritable())
         || (hideExecutable && node->isExecutable())
-        || (hideDotAndDotDot && isDotOrDot))
+        || (hideDot && isDot)
+        || (hideDotDot && isDotDot))
         return false;
 
     return nameFilterDisables || passNameFilters(node);
index 53781c9..e8d0f57 100644 (file)
@@ -632,7 +632,12 @@ void tst_QFileSystemModel::filters_data()
     QTest::addColumn<int>("rowCount");
 #if !defined(Q_OS_WINCE) && !defined(Q_OS_SYMBIAN)
     QTest::newRow("no dirs") << (QStringList() << "a" << "b" << "c") << QStringList() << (int)(QDir::Dirs) << QStringList() << 2;
-    QTest::newRow("one dir - dotdot") << (QStringList() << "a" << "b" << "c") << (QStringList() << "Z") << (int)(QDir::Dirs | QDir::NoDotAndDotDot) << QStringList() << 1;
+    QTest::newRow("no dirs - dot") << (QStringList() << "a" << "b" << "c") << QStringList() << (int)(QDir::Dirs | QDir::NoDot) << QStringList() << 1;
+    QTest::newRow("no dirs - dotdot") << (QStringList() << "a" << "b" << "c") << QStringList() << (int)(QDir::Dirs | QDir::NoDotDot) << QStringList() << 1;
+    QTest::newRow("no dirs - dotanddotdot") << (QStringList() << "a" << "b" << "c") << QStringList() << (int)(QDir::Dirs | QDir::NoDotAndDotDot) << QStringList() << 0;
+    QTest::newRow("one dir - dot") << (QStringList() << "a" << "b" << "c") << (QStringList() << "Z") << (int)(QDir::Dirs | QDir::NoDot) << QStringList() << 2;
+    QTest::newRow("one dir - dotdot") << (QStringList() << "a" << "b" << "c") << (QStringList() << "Z") << (int)(QDir::Dirs | QDir::NoDotDot) << QStringList() << 2;
+    QTest::newRow("one dir - dotanddotdot") << (QStringList() << "a" << "b" << "c") << (QStringList() << "Z") << (int)(QDir::Dirs | QDir::NoDotAndDotDot) << QStringList() << 1;
     QTest::newRow("one dir") << (QStringList() << "a" << "b" << "c") << (QStringList() << "Z") << (int)(QDir::Dirs) << QStringList() << 3;
     QTest::newRow("no dir + hidden") << (QStringList() << "a" << "b" << "c") << QStringList() << (int)(QDir::Dirs | QDir::Hidden) << QStringList() << 2;
     QTest::newRow("dir+hid+files") << (QStringList() << "a" << "b" << "c") << QStringList() <<
@@ -650,7 +655,12 @@ void tst_QFileSystemModel::filters_data()
 #else
     QTest::qWait(3000); // We need to calm down a bit...
     QTest::newRow("no dirs") << (QStringList() << "a" << "b" << "c") << QStringList() << (int)(QDir::Dirs) << QStringList() << 0;
-    QTest::newRow("one dir - dotdot") << (QStringList() << "a" << "b" << "c") << (QStringList() << "Z") << (int)(QDir::Dirs | QDir::NoDotAndDotDot) << QStringList() << 1;
+    QTest::newRow("no dirs - dot") << (QStringList() << "a" << "b" << "c") << QStringList() << (int)(QDir::Dirs | QDir::NoDot) << QStringList() << 1;
+    QTest::newRow("no dirs - dotdot") << (QStringList() << "a" << "b" << "c") << QStringList() << (int)(QDir::Dirs | QDir::NoDotDot) << QStringList() << 1;
+    QTest::newRow("no dirs - dotanddotdot") << (QStringList() << "a" << "b" << "c") << QStringList() << (int)(QDir::Dirs | QDir::NoDotAndDotDot) << QStringList() << 0;
+    QTest::newRow("one dir - dot") << (QStringList() << "a" << "b" << "c") << (QStringList() << "Z") << (int)(QDir::Dirs | QDir::NoDot) << QStringList() << 2;
+    QTest::newRow("one dir - dotdot") << (QStringList() << "a" << "b" << "c") << (QStringList() << "Z") << (int)(QDir::Dirs | QDir::NoDotDot) << QStringList() << 2;
+    QTest::newRow("one dir - dotanddotdot") << (QStringList() << "a" << "b" << "c") << (QStringList() << "Z") << (int)(QDir::Dirs | QDir::NoDotAndDotDot) << QStringList() << 1;
     QTest::newRow("one dir") << (QStringList() << "a" << "b" << "c") << (QStringList() << "Z") << (int)(QDir::Dirs) << QStringList() << 1;
     QTest::newRow("no dir + hidden") << (QStringList() << "a" << "b" << "c") << QStringList() << (int)(QDir::Dirs | QDir::Hidden) << QStringList() << 0;
     QTest::newRow("dir+hid+files") << (QStringList() << "a" << "b" << "c") << QStringList() <<
@@ -699,10 +709,23 @@ void tst_QFileSystemModel::filters()
     // Make sure that we do what QDir does
     QDir xFactor(tmp);
     QDir::Filters  filters = (QDir::Filters)dirFilters;
+    QStringList dirEntries;
+
     if (nameFilters.count() > 0)
-        QCOMPARE(xFactor.entryList(nameFilters, filters).count(), rowCount);
+        dirEntries = xFactor.entryList(nameFilters, filters);
     else
-        QVERIFY(xFactor.entryList(filters).count() == rowCount);
+        dirEntries = xFactor.entryList(filters);
+
+    QCOMPARE(dirEntries.count(), rowCount);
+
+    QStringList modelEntries;
+
+    for (int i = 0; i < rowCount; ++i)
+        modelEntries.append(model->data(model->index(i, 0, root), QFileSystemModel::FileNameRole).toString());
+
+    qSort(dirEntries);
+    qSort(modelEntries);
+    QCOMPARE(dirEntries, modelEntries);
 
 #ifdef Q_OS_LINUX
     if (files.count() >= 3 && rowCount >= 3 && rowCount != 5) {