diff options
Diffstat (limited to 'src/plugins/coreplugin/editormanager/documentmodel.cpp')
-rw-r--r-- | src/plugins/coreplugin/editormanager/documentmodel.cpp | 108 |
1 files changed, 39 insertions, 69 deletions
diff --git a/src/plugins/coreplugin/editormanager/documentmodel.cpp b/src/plugins/coreplugin/editormanager/documentmodel.cpp index 04a877ec491..876b22b1281 100644 --- a/src/plugins/coreplugin/editormanager/documentmodel.cpp +++ b/src/plugins/coreplugin/editormanager/documentmodel.cpp @@ -11,6 +11,8 @@ #include <utils/algorithm.h> #include <utils/dropsupport.h> +#include <utils/filepath.h> +#include <utils/fileutils.h> #include <utils/hostosinfo.h> #include <utils/qtcassert.h> #include <utils/utilsicons.h> @@ -121,63 +123,55 @@ DocumentModel::Entry *DocumentModelPrivate::addEntry(DocumentModel::Entry *entry bool DocumentModelPrivate::disambiguateDisplayNames(DocumentModel::Entry *entry) { const QString displayName = entry->plainDisplayName(); - int minIdx = -1, maxIdx = -1; - QList<DynamicEntry> dups; + QList<DocumentModel::Entry *> dups; + FilePaths paths; + int minIdx = m_entries.count(); + int maxIdx = 0; - for (int i = 0, total = m_entries.count(); i < total; ++i) { + for (int i = 0; i < m_entries.count(); ++i) { DocumentModel::Entry *e = m_entries.at(i); if (e == entry || e->plainDisplayName() == displayName) { - e->document->setUniqueDisplayName(QString()); - dups += DynamicEntry(e); - maxIdx = i; - if (minIdx < 0) + if (minIdx > i) minIdx = i; + if (maxIdx < i) + maxIdx = i; + dups += e; + if (!e->filePath().isEmpty()) + paths += e->filePath(); } } - const int dupsCount = dups.count(); - if (dupsCount == 0) + const auto triggerDataChanged = [this](int minIdx, int maxIdx) { + const QModelIndex idxMin = index(minIdx + 1 /*<no document>*/, 0); + const QModelIndex idxMax = index(maxIdx + 1 /*<no document>*/, 0); + if (idxMin.isValid() && idxMax.isValid()) + emit dataChanged(idxMin, idxMax); + }; + + if (dups.count() == 1) { + dups.at(0)->document->setUniqueDisplayName({}); + triggerDataChanged(minIdx, maxIdx); return false; + } - if (dupsCount > 1) { - int serial = 0; - int count = 0; - // increase uniqueness unless no dups are left - forever { - bool seenDups = false; - for (int i = 0; i < dupsCount - 1; ++i) { - DynamicEntry &e = dups[i]; - const Utils::FilePath myFileName = e->document->filePath(); - if (e->document->isTemporary() || myFileName.isEmpty() || count > 10) { - // path-less entry, append number - e.setNumberedName(++serial); - continue; - } - for (int j = i + 1; j < dupsCount; ++j) { - DynamicEntry &e2 = dups[j]; - if (e->displayName().compare(e2->displayName(), Utils::HostOsInfo::fileNameCaseSensitivity()) == 0) { - const Utils::FilePath otherFileName = e2->document->filePath(); - if (otherFileName.isEmpty()) - continue; - seenDups = true; - e2.disambiguate(); - if (j > maxIdx) - maxIdx = j; - } - } - if (seenDups) { - e.disambiguate(); - ++count; - break; - } - } - if (!seenDups) - break; + const FilePath commonAncestor = FileUtils::commonPath(paths); + + int countWithoutFilePath = 0; + for (DocumentModel::Entry *e : std::as_const(dups)) { + const FilePath path = e->filePath(); + if (path.isEmpty()) { + e->document->setUniqueDisplayName(QStringLiteral("%1 (%2)") + .arg(e->document->displayName()) + .arg(++countWithoutFilePath)); + continue; + } + const QString uniqueDisplayName = path.relativeChildPath(commonAncestor).toString(); + if (uniqueDisplayName != "" && e->document->uniqueDisplayName() != uniqueDisplayName) { + e->document->setUniqueDisplayName(uniqueDisplayName); } } - - emit dataChanged(index(minIdx + 1, 0), index(maxIdx + 1, 0)); + triggerDataChanged(minIdx, maxIdx); return true; } @@ -483,30 +477,6 @@ void DocumentModelPrivate::removeAllSuspendedEntries(PinnedFileRemovalPolicy pin } } -DocumentModelPrivate::DynamicEntry::DynamicEntry(DocumentModel::Entry *e) : - entry(e), - pathComponents(0) -{ -} - -DocumentModel::Entry *DocumentModelPrivate::DynamicEntry::operator->() const -{ - return entry; -} - -void DocumentModelPrivate::DynamicEntry::disambiguate() -{ - const QString display = entry->filePath().fileNameWithPathComponents(++pathComponents); - entry->document->setUniqueDisplayName(display); -} - -void DocumentModelPrivate::DynamicEntry::setNumberedName(int number) -{ - entry->document->setUniqueDisplayName(QStringLiteral("%1 (%2)") - .arg(entry->document->displayName()) - .arg(number)); -} - } // Internal DocumentModel::Entry::Entry() : |