diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index defc39ede64..b96d9de0254 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -828,6 +829,27 @@ FilePath FileUtils::homePath() return FilePath::fromUserInput(QDir::homePath()); } +expected_str FileUtils::scratchBufferFilePath(const QString &pattern) +{ + QString tmp = pattern; + QFileInfo fi(tmp); + if (!fi.isAbsolute()) { + QString tempPattern = QDir::tempPath(); + if (!tempPattern.endsWith(QLatin1Char('/'))) + tempPattern += QLatin1Char('/'); + tmp = tempPattern + tmp; + } + + QTemporaryFile file(tmp); + file.setAutoRemove(false); + if (!file.open()) { + return make_unexpected(Tr::tr("Failed to set up scratch buffer in \"%1\".") + .arg(FilePath::fromString(tmp).parentDir().toUserOutput())); + } + file.close(); + return FilePath::fromString(file.fileName()); +} + FilePaths FileUtils::toFilePathList(const QStringList &paths) { return transform(paths, &FilePath::fromString); diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 32e7da429f4..aeb07f1fabd 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -5,6 +5,7 @@ #include "utils_global.h" +#include "expected.h" #include "filepath.h" #include @@ -79,6 +80,7 @@ public: static FilePath commonPath(const FilePath &oldCommonPath, const FilePath &fileName); static FilePath commonPath(const FilePaths &paths); static FilePath homePath(); + static expected_str scratchBufferFilePath(const QString &pattern); static FilePaths toFilePathList(const QStringList &paths); diff --git a/src/plugins/coreplugin/corejsextensions.cpp b/src/plugins/coreplugin/corejsextensions.cpp index 05c3ea82e52..f5d06f8b1c9 100644 --- a/src/plugins/coreplugin/corejsextensions.cpp +++ b/src/plugins/coreplugin/corejsextensions.cpp @@ -3,6 +3,8 @@ #include "corejsextensions.h" +#include "messagemanager.h" + #include #include #include @@ -126,20 +128,12 @@ QString UtilsJsExtension::mktemp(const QString &pattern) const QString tmp = pattern; if (tmp.isEmpty()) tmp = QStringLiteral("qt_temp.XXXXXX"); - QFileInfo fi(tmp); - if (!fi.isAbsolute()) { - QString tempPattern = QDir::tempPath(); - if (!tempPattern.endsWith(QLatin1Char('/'))) - tempPattern += QLatin1Char('/'); - tmp = tempPattern + tmp; + const auto res = FileUtils::scratchBufferFilePath(tmp); + if (!res) { + MessageManager::writeDisrupting(res.error()); + return {}; } - - QTemporaryFile file(tmp); - file.setAutoRemove(false); - const bool isOpen = file.open(); - QTC_ASSERT(isOpen, return {}); - file.close(); - return file.fileName(); + return res->toFSPathString(); } QString UtilsJsExtension::asciify(const QString &input) const diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp index b4bead7746c..9d1efc12fc9 100644 --- a/src/plugins/coreplugin/outputwindow.cpp +++ b/src/plugins/coreplugin/outputwindow.cpp @@ -10,9 +10,11 @@ #include "editormanager/editormanager.h" #include "find/basetextfind.h" #include "icore.h" +#include "messagemanager.h" #include +#include #include #include @@ -294,6 +296,27 @@ void OutputWindow::contextMenuEvent(QContextMenuEvent *event) QFileDialog::saveFileContent(toPlainText().toUtf8(), d->outputFileNameHint); }); saveAction->setEnabled(!document()->isEmpty()); + QAction *openAction = menu->addAction(Tr::tr("Copy Contents to Scratch Buffer")); + connect(openAction, &QAction::triggered, this, [this] { + QString scratchBufferPrefix = FilePath::fromString(d->outputFileNameHint).baseName(); + if (scratchBufferPrefix.isEmpty()) + scratchBufferPrefix = "scratch"; + const auto tempPath = FileUtils::scratchBufferFilePath( + QString::fromUtf8("%1-XXXXXX.txt").arg(scratchBufferPrefix)); + if (!tempPath) { + MessageManager::writeDisrupting(tempPath.error()); + return; + } + IEditor * const editor = EditorManager::openEditor(*tempPath); + if (!editor) { + MessageManager::writeDisrupting( + Tr::tr("Failed to open editor for \"%1\".").arg(tempPath->toUserOutput())); + return; + } + editor->document()->setTemporary(true); + editor->document()->setContents(toPlainText().toUtf8()); + }); + openAction->setEnabled(!document()->isEmpty()); menu->addSeparator(); QAction *clearAction = menu->addAction(Tr::tr("Clear"));