From 018d49f417eb75f060bdbb0acdb9958d1ef99583 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 13 Jan 2021 09:26:59 +0100 Subject: [PATCH] Core: Do not open documents for all dropped files Only open one visible editor and add all other dropped files as suspended documents to the document model. Change-Id: Iade95b3891fb90c06cc8852859346bbfe10bc292 Reviewed-by: Eike Ziller --- .../editormanager/documentmodel.cpp | 4 ++- .../coreplugin/editormanager/editorview.cpp | 30 ++++++++++++++----- src/plugins/coreplugin/mainwindow.cpp | 22 +++++++++----- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/documentmodel.cpp b/src/plugins/coreplugin/editormanager/documentmodel.cpp index 259448cc394..ad3e5aca832 100644 --- a/src/plugins/coreplugin/editormanager/documentmodel.cpp +++ b/src/plugins/coreplugin/editormanager/documentmodel.cpp @@ -432,10 +432,12 @@ DocumentModel::Entry *DocumentModelPrivate::addSuspendedDocument(const QString & const QString &displayName, Id id) { + QTC_CHECK(id.isValid()); auto entry = new DocumentModel::Entry; entry->document = new IDocument; entry->document->setFilePath(Utils::FilePath::fromString(fileName)); - entry->document->setPreferredDisplayName(displayName); + if (!displayName.isEmpty()) + entry->document->setPreferredDisplayName(displayName); entry->document->setId(id); entry->isSuspended = true; d->addEntry(entry); diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index ec49b44eca2..8a2a2dbe4f0 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -400,14 +401,27 @@ void EditorView::closeSplit() void EditorView::openDroppedFiles(const QList &files) { - const int count = files.size(); - for (int i = 0; i < count; ++i) { - const DropSupport::FileSpec spec = files.at(i); - EditorManagerPrivate::openEditorAt(this, spec.filePath, spec.line, spec.column, Id(), - i < count - 1 ? EditorManager::DoNotChangeCurrentEditor - | EditorManager::DoNotMakeVisible - : EditorManager::NoFlags); - } + bool first = true; + auto openEntry = [&](const DropSupport::FileSpec &spec) { + if (first) { + first = false; + EditorManagerPrivate::openEditorAt(this, spec.filePath, spec.line, spec.column); + } else if (spec.column != -1 || spec.line != -1) { + EditorManagerPrivate::openEditorAt(this, + spec.filePath, + spec.line, + spec.column, + Id(), + EditorManager::DoNotChangeCurrentEditor + | EditorManager::DoNotMakeVisible); + } else { + auto *factory = IEditorFactory::preferredEditorFactories(spec.filePath).value(0); + DocumentModelPrivate::addSuspendedDocument(spec.filePath, + {}, + factory ? factory->id() : Id()); + } + }; + Utils::reverseForeach(files, openEntry); } void EditorView::setParentSplitterOrView(SplitterOrView *splitterOrView) diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index 85a825ac7a3..1ac481ee4df 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -57,6 +57,7 @@ #include #include #include +#include #include #include #include @@ -877,7 +878,7 @@ IDocument *MainWindow::openFiles(const QStringList &fileNames, const QList documentFactories = IDocumentFactory::allDocumentFactories(); IDocument *res = nullptr; - foreach (const QString &fileName, fileNames) { + for (const QString &fileName : fileNames) { const QDir workingDir(workingDirectory.isEmpty() ? QDir::currentPath() : workingDirectory); const QFileInfo fi(workingDir, fileName); const QString absoluteFilePath = fi.absoluteFilePath(); @@ -898,12 +899,19 @@ IDocument *MainWindow::openFiles(const QStringList &fileNames, emFlags |= EditorManager::CanContainLineAndColumnNumber; if (flags & ICore::SwitchSplitIfAlreadyVisible) emFlags |= EditorManager::SwitchSplitIfAlreadyVisible; - IEditor *editor = EditorManager::openEditor(absoluteFilePath, Id(), emFlags); - if (!editor) { - if (flags & ICore::StopOnLoadFail) - return res; - } else if (!res) { - res = editor->document(); + if (emFlags != EditorManager::NoFlags || !res) { + IEditor *editor = EditorManager::openEditor(absoluteFilePath, Id(), emFlags); + if (!editor) { + if (flags & ICore::StopOnLoadFail) + return res; + } else if (!res) { + res = editor->document(); + } + } else { + auto *factory = IEditorFactory::preferredEditorFactories(absoluteFilePath).value(0); + DocumentModelPrivate::addSuspendedDocument(absoluteFilePath, + {}, + factory ? factory->id() : Id()); } } }