diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index ff7745761c8..48d9fc5a21c 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -405,5 +405,76 @@ void withNtfsPermissions(const std::function &task) } #endif -} // namespace Utils +#ifdef QT_WIDGETS_LIB + +static std::function s_dialogParentGetter; + +void FileUtils::setDialogParentGetter(const std::function &getter) +{ + s_dialogParentGetter = getter; +} + +static QWidget *dialogParent() +{ + return s_dialogParentGetter ? s_dialogParentGetter() : nullptr; +} + +FilePath FileUtils::getOpenFilePath(const QString &caption, + const FilePath &dir, + const QString &filter, + QString *selectedFilter, + QFileDialog::Options options) +{ + const QString result = QFileDialog::getOpenFileName(dialogParent(), + caption, + dir.toString(), + filter, + selectedFilter, + options); + return FilePath::fromString(result); +} + +FilePath FileUtils::getSaveFilePath(const QString &caption, + const FilePath &dir, + const QString &filter, + QString *selectedFilter, + QFileDialog::Options options) +{ + const QString result = QFileDialog::getSaveFileName(dialogParent(), + caption, + dir.toString(), + filter, + selectedFilter, + options); + return FilePath::fromString(result); +} + +FilePath FileUtils::getExistingDirectory(const QString &caption, + const FilePath &dir, + QFileDialog::Options options) +{ + const QString result = QFileDialog::getExistingDirectory(dialogParent(), + caption, + dir.toString(), + options); + return FilePath::fromString(result); +} + +FilePaths FileUtils::getOpenFilePaths(const QString &caption, + const FilePath &dir, + const QString &filter, + QString *selectedFilter, + QFileDialog::Options options) +{ + const QStringList result = QFileDialog::getOpenFileNames(dialogParent(), + caption, + dir.toString(), + filter, + selectedFilter, + options); + return transform(result, &FilePath::fromString); +} +#endif // QT_WIDGETS_LIB + +} // namespace Utils diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 9901f678763..8b5f97b6cde 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -38,6 +38,10 @@ #include #include // Mac. +#ifdef QT_WIDGETS_LIB +#include +#endif + #include #include @@ -128,6 +132,32 @@ public: static bool renameFile(const FilePath &srcFilePath, const FilePath &tgtFilePath); static void setDeviceFileHooks(const DeviceFileHooks &hooks); + +#ifdef QT_WIDGETS_LIB + static void setDialogParentGetter(const std::function &getter); + + static FilePath getOpenFilePath(const QString &caption = {}, + const FilePath &dir = {}, + const QString &filter = {}, + QString *selectedFilter = nullptr, + QFileDialog::Options options = {}); + + static FilePath getSaveFilePath(const QString &caption = {}, + const FilePath &dir = {}, + const QString &filter = {}, + QString *selectedFilter = nullptr, + QFileDialog::Options options = {}); + + static FilePath getExistingDirectory(const QString &caption = {}, + const FilePath &dir = {}, + QFileDialog::Options options = QFileDialog::ShowDirsOnly); + + static FilePaths getOpenFilePaths(const QString &caption = {}, + const FilePath &dir = {}, + const QString &filter = {}, + QString *selectedFilter = nullptr, + QFileDialog::Options options = {}); +#endif }; template diff --git a/src/plugins/coreplugin/icore.cpp b/src/plugins/coreplugin/icore.cpp index aef14225f0d..73bcc5e793d 100644 --- a/src/plugins/coreplugin/icore.cpp +++ b/src/plugins/coreplugin/icore.cpp @@ -214,6 +214,8 @@ ICore::ICore(MainWindow *mainwindow) emit coreAboutToClose(); QCoreApplication::exit(exitCode); }); + + FileUtils::setDialogParentGetter(&ICore::dialogParent); } /*!