From 66421d29501d432da5d1ce884311be1c70d5b800 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 16 Apr 2025 16:31:26 +0200 Subject: [PATCH] Utils: Split user interaction out of FileSaver::finalize() Change-Id: Ib3b968fe6912b659c150481c8cfea7596dbc200b Reviewed-by: David Schulz --- src/libs/utils/fileutils.cpp | 15 +++++---------- src/libs/utils/fileutils.h | 6 +++--- src/plugins/cppeditor/cppfilesettingspage.cpp | 4 +++- src/plugins/debugger/debuggerplugin.cpp | 3 ++- .../extensionmanager/extensionmanagerwidget.cpp | 4 +++- .../genericprojectmanager/genericproject.cpp | 6 ++++-- src/plugins/help/helpviewer.cpp | 14 +++++++++----- src/plugins/help/helpviewer.h | 6 ++---- src/plugins/languageclient/lspinspector.cpp | 4 +++- src/plugins/macros/macro.cpp | 6 +++++- src/plugins/resourceeditor/resourceeditor.cpp | 7 ++++--- src/plugins/texteditor/colorscheme.cpp | 9 ++++++--- src/plugins/valgrind/memcheckerrorview.cpp | 4 +++- 13 files changed, 52 insertions(+), 36 deletions(-) diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 12825fcb9ee..3666de53cc9 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -90,16 +90,6 @@ Result<> FileSaverBase::finalize() return m_result; } -#ifdef QT_GUI_LIB -bool FileSaverBase::finalize(QWidget *parent) -{ - if (finalize()) - return true; - QMessageBox::critical(parent, Tr::tr("File Error"), errorString()); - return false; -} -#endif // QT_GUI_LIB - bool FileSaverBase::write(const char *data, int len) { if (!m_result) @@ -874,6 +864,11 @@ FilePaths usefulExtraSearchPaths() return {}; } +void showError(const QString &errorMessage) +{ + QMessageBox::critical(dialogParent(), Tr::tr("File Error"), errorMessage); +} + } // namespace FileUtils #ifdef Q_OS_WIN diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 16bface0bc6..ff4cf09e7ce 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -107,6 +107,9 @@ QTCREATOR_UTILS_EXPORT FilePaths getOpenFilePaths( const QString &filter = {}, QString *selectedFilter = nullptr, QFileDialog::Options options = {}); + +QTCREATOR_UTILS_EXPORT void showError(const QString &errorMessage); + #endif QTCREATOR_UTILS_EXPORT QString fetchQrc(const QString &fileName); // Only for internal resourcesm @@ -160,9 +163,6 @@ public: bool hasError() const { return !m_result; } QString errorString() const { return m_result.error(); } virtual Utils::Result<> finalize(); -#ifdef QT_GUI_LIB - bool finalize(QWidget *parent); -#endif bool write(const char *data, int len); bool write(const QByteArray &bytes); diff --git a/src/plugins/cppeditor/cppfilesettingspage.cpp b/src/plugins/cppeditor/cppfilesettingspage.cpp index d34e62e4d28..9907d70b1dc 100644 --- a/src/plugins/cppeditor/cppfilesettingspage.cpp +++ b/src/plugins/cppeditor/cppfilesettingspage.cpp @@ -493,8 +493,10 @@ void CppFileSettingsWidget::slotEdit() FileSaver saver(path, QIODevice::Text); saver.write( Tr::tr(licenseTemplateTemplate).arg(QGuiApplication::applicationDisplayName()).toUtf8()); - if (!saver.finalize(this)) + if (const Result<> res = saver.finalize(); !res) { + FileUtils::showError(res.error()); return; + } setLicenseTemplatePath(path); } // Edit (now) existing file with C++ diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index e8a7ff6a133..a51f7bb0ca6 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1971,7 +1971,8 @@ void DebuggerPluginPrivate::dumpLog() ts << logWindow->combinedContents(); saver.setResult(&ts); } - saver.finalize(ICore::dialogParent()); + if (const Result<> res = saver.finalize(); !res) + FileUtils::showError(res.error()); } void DebuggerPluginPrivate::remoteCommand(const QStringList &options) diff --git a/src/plugins/extensionmanager/extensionmanagerwidget.cpp b/src/plugins/extensionmanager/extensionmanagerwidget.cpp index ae79ffecaa8..3bb27e68f2e 100644 --- a/src/plugins/extensionmanager/extensionmanagerwidget.cpp +++ b/src/plugins/extensionmanager/extensionmanagerwidget.cpp @@ -959,7 +959,7 @@ void ExtensionManagerWidget::fetchAndInstallPlugin(const QUrl &url, bool update, TempFileSaver saver(TemporaryDirectory::masterDirectoryPath() + "/XXXXXX-" + filename); saver.write(storage->packageData); - if (saver.finalize(ICore::dialogParent())) { + if (const Result<> res = saver.finalize()) { auto result = executePluginInstallWizard(saver.filePath(), update); switch (result) { case InstallResult::Success: @@ -970,6 +970,8 @@ void ExtensionManagerWidget::fetchAndInstallPlugin(const QUrl &url, bool update, case InstallResult::Error: return false; } + } else { + FileUtils::showError(res.error()); } return false; }; diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index a49f4fb90b8..966ca4a9619 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -319,8 +319,10 @@ bool GenericBuildSystem::saveRawList(const QStringList &rawList, const QString & stream << filePath << '\n'; saver.setResult(&stream); } - bool result = saver.finalize(ICore::dialogParent()); - return result; + const Result<> result = saver.finalize(); + if (!result) + FileUtils::showError(result.error()); + return result.has_value(); } static void insertSorted(QStringList *list, const QString &value) diff --git a/src/plugins/help/helpviewer.cpp b/src/plugins/help/helpviewer.cpp index 2e8a0e59756..3cc6b0b3c76 100644 --- a/src/plugins/help/helpviewer.cpp +++ b/src/plugins/help/helpviewer.cpp @@ -6,8 +6,6 @@ #include "helptr.h" #include "localhelpmanager.h" -#include - #include #include #include @@ -22,7 +20,9 @@ #include -using namespace Help::Internal; +using namespace Utils; + +namespace Help::Internal { struct ExtensionMap { const char *extension; @@ -143,13 +143,15 @@ bool HelpViewer::launchWithExternalApp(const QUrl &url) const QString& path = resolvedUrl.path(); if (!canOpenPage(path)) { - Utils::TempFileSaver saver(Utils::TemporaryDirectory::masterDirectoryPath() + TempFileSaver saver(TemporaryDirectory::masterDirectoryPath() + "/qtchelp_XXXXXX." + QFileInfo(path).completeSuffix()); saver.setAutoRemove(false); if (!saver.hasError()) saver.write(helpEngine.fileData(resolvedUrl)); - if (saver.finalize(Core::ICore::dialogParent())) + if (const Result<> res = saver.finalize()) QDesktopServices::openUrl(QUrl(saver.filePath().toUrlishString())); + else + FileUtils::showError(res.error()); return true; } return false; @@ -256,3 +258,5 @@ bool HelpViewer::handleForwardBackwardMouseButtons(QMouseEvent *event) return false; } + +} // Help::Internal diff --git a/src/plugins/help/helpviewer.h b/src/plugins/help/helpviewer.h index 49d1b236500..2af070cd850 100644 --- a/src/plugins/help/helpviewer.h +++ b/src/plugins/help/helpviewer.h @@ -14,8 +14,7 @@ #include #include -namespace Help { -namespace Internal { +namespace Help::Internal { class HelpViewer : public QWidget { @@ -103,5 +102,4 @@ private: void applyZoom(int percentage); }; -} // namespace Internal -} // namespace Help +} // namespace Help::Internal diff --git a/src/plugins/languageclient/lspinspector.cpp b/src/plugins/languageclient/lspinspector.cpp index 5b568cc408a..31a3d5264bb 100644 --- a/src/plugins/languageclient/lspinspector.cpp +++ b/src/plugins/languageclient/lspinspector.cpp @@ -322,8 +322,10 @@ void LspLogWidget::saveLog() return; FileSaver saver(filePath, QIODevice::Text); saver.write(contents.toUtf8()); - if (!saver.finalize(this)) + if (const Result<> res = saver.finalize(); !res) { + FileUtils::showError(res.error()); saveLog(); + } } class LspInspectorWidget : public QDialog diff --git a/src/plugins/macros/macro.cpp b/src/plugins/macros/macro.cpp index 8a1a607d550..a6b18ca2985 100644 --- a/src/plugins/macros/macro.cpp +++ b/src/plugins/macros/macro.cpp @@ -12,6 +12,8 @@ #include #include +using namespace Utils; + namespace Macros::Internal { /*! @@ -122,8 +124,10 @@ bool Macro::save(const QString &fileName) } saver.setResult(&stream); } - if (!saver.finalize(Core::ICore::dialogParent())) + if (const Result<> res = saver.finalize(); !res) { + FileUtils::showError(res.error()); return false; + } d->fileName = fileName; return true; } diff --git a/src/plugins/resourceeditor/resourceeditor.cpp b/src/plugins/resourceeditor/resourceeditor.cpp index 8d65b196ce5..8767a3e2f76 100644 --- a/src/plugins/resourceeditor/resourceeditor.cpp +++ b/src/plugins/resourceeditor/resourceeditor.cpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include @@ -240,8 +239,10 @@ Result<> ResourceEditorDocument::setContents(const QByteArray &contents) { TempFileSaver saver; saver.write(contents); - if (!saver.finalize(ICore::dialogParent())) - return ResultError(saver.errorString()); + if (const Result<> res = saver.finalize(); !res) { + FileUtils::showError(res.error()); + return res; + } const FilePath originalFileName = m_model.filePath(); m_model.setFilePath(saver.filePath()); diff --git a/src/plugins/texteditor/colorscheme.cpp b/src/plugins/texteditor/colorscheme.cpp index 9963ea30592..0a253cd3005 100644 --- a/src/plugins/texteditor/colorscheme.cpp +++ b/src/plugins/texteditor/colorscheme.cpp @@ -6,8 +6,6 @@ #include "texteditorconstants.h" #include "texteditortr.h" -#include - #include #include @@ -264,7 +262,12 @@ bool ColorScheme::save(const FilePath &filePath) const saver.setResult(&w); } - return saver.finalize(Core::ICore::dialogParent()); + + const Result<> res = saver.finalize(); + if (!res) + FileUtils::showError(res.error()); + + return res.has_value(); } namespace { diff --git a/src/plugins/valgrind/memcheckerrorview.cpp b/src/plugins/valgrind/memcheckerrorview.cpp index 2092dbd05bd..27f4de69371 100644 --- a/src/plugins/valgrind/memcheckerrorview.cpp +++ b/src/plugins/valgrind/memcheckerrorview.cpp @@ -252,8 +252,10 @@ void SuppressionDialog::accept() stream << m_suppressionEdit->toPlainText(); saver.setResult(&stream); } - if (!saver.finalize(this)) + if (const Result<> res = saver.finalize(); !res) { + FileUtils::showError(res.error()); return; + } // Add file to project if there is a project containing this file on the file system. if (!ProjectExplorer::ProjectManager::projectForFile(path)) {