diff --git a/src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp b/src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp index d78a3ebac930cfca6e91b3ebd5ec55e3db55d61a..95c17189807d7c0ccef2997416bb567fee0e4ab4 100644 --- a/src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp +++ b/src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp @@ -47,7 +47,21 @@ void FileFilterBaseItem::setFilter(const QString &filter) m_filter = filter; m_regExpList.clear(); + m_fileSuffixes.clear(); + foreach (const QString &pattern, filter.split(QLatin1Char(';'))) { + if (pattern.isEmpty()) + continue; + // decide if it's a canonical pattern like *.x + if (pattern.startsWith(QLatin1String("*."))) { + const QString suffix = pattern.right(pattern.size() - 1); + if (!suffix.contains(QLatin1Char('*')) + && !suffix.contains(QLatin1Char('?')) + && !suffix.contains(QLatin1Char('['))) { + m_fileSuffixes << suffix; + continue; + } + } m_regExpList << QRegExp(pattern, Qt::CaseInsensitive, QRegExp::Wildcard); } @@ -113,16 +127,9 @@ bool FileFilterBaseItem::matchesFile(const QString &filePath) const return true; } - bool regexMatches = false; const QString &fileName = QFileInfo(filePath).fileName(); - foreach (const QRegExp &exp, m_regExpList) { - if (exp.exactMatch(fileName)) { - regexMatches = true; - break; - } - } - if (!regexMatches) + if (!fileMatches(fileName)) return false; const QDir fileDir = QFileInfo(filePath).absoluteDir(); @@ -164,7 +171,7 @@ void FileFilterBaseItem::updateFileList() foreach (const QString &explicitPath, m_explicitFiles) { newFiles << absolutePath(explicitPath); } - if (!m_regExpList.isEmpty() && m_explicitFiles.isEmpty()) + if ((!m_fileSuffixes.isEmpty() || !m_regExpList.isEmpty()) && m_explicitFiles.isEmpty()) newFiles += filesInSubTree(QDir(m_defaultDir), QDir(projectDir), &dirsToBeWatched); if (newFiles != m_files) { @@ -190,6 +197,23 @@ void FileFilterBaseItem::updateFileList() m_dirWatcher.addDirectories(watchDirs.toList()); } +bool FileFilterBaseItem::fileMatches(const QString &fileName) const +{ + foreach (const QString &suffix, m_fileSuffixes) { + if (fileName.endsWith(suffix, Qt::CaseInsensitive)) { + return true; + } + } + + foreach (const QRegExp &filter, m_regExpList) { + if (filter.exactMatch(fileName)) { + return true; + } + } + + return false; +} + QSet<QString> FileFilterBaseItem::filesInSubTree(const QDir &rootDir, const QDir &dir, QSet<QString> *parsedDirs) { QSet<QString> fileSet; @@ -199,12 +223,9 @@ QSet<QString> FileFilterBaseItem::filesInSubTree(const QDir &rootDir, const QDir foreach (const QFileInfo &file, dir.entryInfoList(QDir::Files)) { const QString fileName = file.fileName(); - foreach (const QRegExp &filter, m_regExpList) { - if (filter.exactMatch(fileName)) { - fileSet.insert(file.absoluteFilePath()); - break; - } - } + + if (fileMatches(fileName)) + fileSet.insert(file.absoluteFilePath()); } if (recursive()) { diff --git a/src/plugins/qmlprojectmanager/fileformat/filefilteritems.h b/src/plugins/qmlprojectmanager/fileformat/filefilteritems.h index ec27e1cd26450e953a99f01ebfd92cf3a63ae728..2dcd1d557a6e8ad650942ee51a094e5b40843ec9 100644 --- a/src/plugins/qmlprojectmanager/fileformat/filefilteritems.h +++ b/src/plugins/qmlprojectmanager/fileformat/filefilteritems.h @@ -54,12 +54,15 @@ private: QString absolutePath(const QString &path) const; QString absoluteDir() const; + bool fileMatches(const QString &fileName) const; QSet<QString> filesInSubTree(const QDir &rootDir, const QDir &dir, QSet<QString> *parsedDirs = 0); QString m_rootDir; QString m_defaultDir; QString m_filter; + // simple "*.png" patterns are stored in m_fileSuffixes, otherwise store in m_regExpList + QList<QString> m_fileSuffixes; QList<QRegExp> m_regExpList; enum RecursiveOption { diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/tst_fileformat.cpp b/tests/auto/qml/qmlprojectmanager/fileformat/tst_fileformat.cpp index ac89ce956aeede42f102bb73e5cd7c506c9fba85..c65698f09a91c9a26ec3cf2a4c952f7c9b83e98f 100644 --- a/tests/auto/qml/qmlprojectmanager/fileformat/tst_fileformat.cpp +++ b/tests/auto/qml/qmlprojectmanager/fileformat/tst_fileformat.cpp @@ -208,6 +208,35 @@ void tst_FileFormat::testFileFilter() qDebug() << project->files().toSet() << expectedFiles.toSet(); QCOMPARE(project->files().toSet(), expectedFiles.toSet()); } + + // + // use wildcards + // + projectFile = QLatin1String( + "import QmlProject 1.0\n" + "Project {\n" + " ImageFiles {\n" + " filter: \"?mage.[gf]if\"\n" + " }\n" + "}\n"); + + { + QDeclarativeEngine engine; + QDeclarativeComponent component(&engine); + component.setData(projectFile.toUtf8(), QUrl()); + if (!component.isReady()) + qDebug() << component.errorString(); + QVERIFY(component.isReady()); + + QmlProjectItem *project = qobject_cast<QmlProjectItem*>(component.create()); + QVERIFY(project); + + project->setSourceDirectory(testDataDir); + + QStringList expectedFiles(QStringList() << testDataDir + "/image.gif"); + qDebug() << project->files().toSet() << expectedFiles.toSet(); + QCOMPARE(project->files().toSet(), expectedFiles.toSet()); + } } void tst_FileFormat::testMatchesFile() @@ -269,8 +298,9 @@ void tst_FileFormat::testLibraryPaths() project->setSourceDirectory(testDataDir); - QStringList expectedPaths(QStringList() << "../otherLibrary" - << "library"); + QStringList expectedPaths(QStringList() << SRCDIR "/otherLibrary" + << SRCDIR "/data/library"); + qDebug() << expectedPaths << project->importPaths(); QCOMPARE(project->importPaths().toSet(), expectedPaths.toSet()); } }