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 <eike.ziller@qt.io>
This commit is contained in:
David Schulz
2021-01-13 09:26:59 +01:00
parent 627a96d991
commit 018d49f417
3 changed files with 40 additions and 16 deletions

View File

@@ -432,9 +432,11 @@ DocumentModel::Entry *DocumentModelPrivate::addSuspendedDocument(const QString &
const QString &displayName, const QString &displayName,
Id id) Id id)
{ {
QTC_CHECK(id.isValid());
auto entry = new DocumentModel::Entry; auto entry = new DocumentModel::Entry;
entry->document = new IDocument; entry->document = new IDocument;
entry->document->setFilePath(Utils::FilePath::fromString(fileName)); entry->document->setFilePath(Utils::FilePath::fromString(fileName));
if (!displayName.isEmpty())
entry->document->setPreferredDisplayName(displayName); entry->document->setPreferredDisplayName(displayName);
entry->document->setId(id); entry->document->setId(id);
entry->isSuspended = true; entry->isSuspended = true;

View File

@@ -37,6 +37,7 @@
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/locator/locatorconstants.h> #include <coreplugin/locator/locatorconstants.h>
#include <coreplugin/minisplitter.h> #include <coreplugin/minisplitter.h>
#include <utils/algorithm.h>
#include <utils/infobar.h> #include <utils/infobar.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/theme/theme.h> #include <utils/theme/theme.h>
@@ -400,14 +401,27 @@ void EditorView::closeSplit()
void EditorView::openDroppedFiles(const QList<DropSupport::FileSpec> &files) void EditorView::openDroppedFiles(const QList<DropSupport::FileSpec> &files)
{ {
const int count = files.size(); bool first = true;
for (int i = 0; i < count; ++i) { auto openEntry = [&](const DropSupport::FileSpec &spec) {
const DropSupport::FileSpec spec = files.at(i); if (first) {
EditorManagerPrivate::openEditorAt(this, spec.filePath, spec.line, spec.column, Id(), first = false;
i < count - 1 ? EditorManager::DoNotChangeCurrentEditor EditorManagerPrivate::openEditorAt(this, spec.filePath, spec.line, spec.column);
| EditorManager::DoNotMakeVisible } else if (spec.column != -1 || spec.line != -1) {
: EditorManager::NoFlags); 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) void EditorView::setParentSplitterOrView(SplitterOrView *splitterOrView)

View File

@@ -57,6 +57,7 @@
#include <coreplugin/dialogs/externaltoolconfig.h> #include <coreplugin/dialogs/externaltoolconfig.h>
#include <coreplugin/dialogs/newdialog.h> #include <coreplugin/dialogs/newdialog.h>
#include <coreplugin/dialogs/shortcutsettings.h> #include <coreplugin/dialogs/shortcutsettings.h>
#include <coreplugin/editormanager/documentmodel_p.h>
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/editormanager/editormanager_p.h> #include <coreplugin/editormanager/editormanager_p.h>
#include <coreplugin/editormanager/ieditor.h> #include <coreplugin/editormanager/ieditor.h>
@@ -877,7 +878,7 @@ IDocument *MainWindow::openFiles(const QStringList &fileNames,
const QList<IDocumentFactory*> documentFactories = IDocumentFactory::allDocumentFactories(); const QList<IDocumentFactory*> documentFactories = IDocumentFactory::allDocumentFactories();
IDocument *res = nullptr; IDocument *res = nullptr;
foreach (const QString &fileName, fileNames) { for (const QString &fileName : fileNames) {
const QDir workingDir(workingDirectory.isEmpty() ? QDir::currentPath() : workingDirectory); const QDir workingDir(workingDirectory.isEmpty() ? QDir::currentPath() : workingDirectory);
const QFileInfo fi(workingDir, fileName); const QFileInfo fi(workingDir, fileName);
const QString absoluteFilePath = fi.absoluteFilePath(); const QString absoluteFilePath = fi.absoluteFilePath();
@@ -898,6 +899,7 @@ IDocument *MainWindow::openFiles(const QStringList &fileNames,
emFlags |= EditorManager::CanContainLineAndColumnNumber; emFlags |= EditorManager::CanContainLineAndColumnNumber;
if (flags & ICore::SwitchSplitIfAlreadyVisible) if (flags & ICore::SwitchSplitIfAlreadyVisible)
emFlags |= EditorManager::SwitchSplitIfAlreadyVisible; emFlags |= EditorManager::SwitchSplitIfAlreadyVisible;
if (emFlags != EditorManager::NoFlags || !res) {
IEditor *editor = EditorManager::openEditor(absoluteFilePath, Id(), emFlags); IEditor *editor = EditorManager::openEditor(absoluteFilePath, Id(), emFlags);
if (!editor) { if (!editor) {
if (flags & ICore::StopOnLoadFail) if (flags & ICore::StopOnLoadFail)
@@ -905,6 +907,12 @@ IDocument *MainWindow::openFiles(const QStringList &fileNames,
} else if (!res) { } else if (!res) {
res = editor->document(); res = editor->document();
} }
} else {
auto *factory = IEditorFactory::preferredEditorFactories(absoluteFilePath).value(0);
DocumentModelPrivate::addSuspendedDocument(absoluteFilePath,
{},
factory ? factory->id() : Id());
}
} }
} }
return res; return res;