diff --git a/src/lib/repository.h b/src/lib/repository.h --- a/src/lib/repository.h +++ b/src/lib/repository.h @@ -167,7 +167,7 @@ Definition definitionForFileName(const QString &fileName) const; /** - * Returns all Definition%s for the file named @p fileName. + * Returns all Definition%s for the file named @p fileName sorted by priority. * The match is performed based on the \e extensions and @e mimetype of * the definition files. * @@ -186,7 +186,7 @@ Definition definitionForMimeType(const QString &mimeType) const; /** - * Returns all Definition%s to the type named @p mimeType + * Returns all Definition%s to the type named @p mimeType sorted by priority * * @since 5.56 */ diff --git a/src/lib/repository.cpp b/src/lib/repository.cpp --- a/src/lib/repository.cpp +++ b/src/lib/repository.cpp @@ -78,59 +78,55 @@ return d->m_defs.value(defName); } -static Definition bestCandidate(QVector &&candidates) +static void sortDefinitions(QVector &definitions) { - if (candidates.isEmpty()) - return Definition(); - - std::partial_sort(candidates.begin(), candidates.begin() + 1, candidates.end(), [](const Definition &lhs, const Definition &rhs) { + std::stable_sort(definitions.begin(), definitions.end(), [](const Definition &lhs, const Definition &rhs) { return lhs.priority() > rhs.priority(); }); - - return candidates.at(0); } Definition Repository::definitionForFileName(const QString& fileName) const { - return bestCandidate(definitionsForFileName(fileName)); + return definitionsForFileName(fileName).value(0); } QVector Repository::definitionsForFileName(const QString &fileName) const { QFileInfo fi(fileName); const auto name = fi.fileName(); QVector candidates; - for (auto it = d->m_defs.constBegin(); it != d->m_defs.constEnd(); ++it) { - auto def = it.value(); + for (const Definition &def : qAsConst(d->m_sortedDefs)) { for (const auto &pattern : def.extensions()) { if (WildcardMatcher::exactMatch(name, pattern)) { candidates.push_back(def); break; } } } + sortDefinitions(candidates); return candidates; } Definition Repository::definitionForMimeType(const QString& mimeType) const { - return bestCandidate(definitionsForMimeType(mimeType)); + return definitionsForMimeType(mimeType).value(0); } QVector Repository::definitionsForMimeType(const QString &mimeType) const { QVector candidates; - for (auto it = d->m_defs.constBegin(); it != d->m_defs.constEnd(); ++it) { - auto def = it.value(); + for (const Definition &def : qAsConst(d->m_sortedDefs)) { for (const auto &matchType : def.mimeTypes()) { if (mimeType == matchType) { candidates.push_back(def); break; } } } + + sortDefinitions(candidates); return candidates; }