diff options
-rw-r--r-- | src/gui/kernel/qplatformdialoghelper.cpp | 21 | ||||
-rw-r--r-- | src/gui/kernel/qplatformdialoghelper.h | 5 | ||||
-rw-r--r-- | src/widgets/dialogs/qfiledialog.cpp | 29 | ||||
-rw-r--r-- | src/widgets/dialogs/qfiledialog.h | 1 | ||||
-rw-r--r-- | src/widgets/dialogs/qfiledialog_p.h | 16 | ||||
-rw-r--r-- | tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp | 30 |
6 files changed, 99 insertions, 3 deletions
diff --git a/src/gui/kernel/qplatformdialoghelper.cpp b/src/gui/kernel/qplatformdialoghelper.cpp index c36186b815..16f31db50d 100644 --- a/src/gui/kernel/qplatformdialoghelper.cpp +++ b/src/gui/kernel/qplatformdialoghelper.cpp @@ -451,6 +451,7 @@ public: QString defaultSuffix; QStringList history; QUrl initialDirectory; + QString initiallySelectedMimeTypeFilter; QString initiallySelectedNameFilter; QList<QUrl> initiallySelectedFiles; QStringList supportedSchemes; @@ -668,6 +669,16 @@ void QFileDialogOptions::setInitialDirectory(const QUrl &directory) d->initialDirectory = directory; } +QString QFileDialogOptions::initiallySelectedMimeTypeFilter() const +{ + return d->initiallySelectedMimeTypeFilter; +} + +void QFileDialogOptions::setInitiallySelectedMimeTypeFilter(const QString &filter) +{ + d->initiallySelectedMimeTypeFilter = filter; +} + QString QFileDialogOptions::initiallySelectedNameFilter() const { return d->initiallySelectedNameFilter; @@ -699,6 +710,16 @@ QStringList QFileDialogOptions::supportedSchemes() const return d->supportedSchemes; } +void QPlatformFileDialogHelper::selectMimeTypeFilter(const QString &filter) +{ + Q_UNUSED(filter) +} + +QString QPlatformFileDialogHelper::selectedMimeTypeFilter() const +{ + return QString(); +} + // Return true if the URL is supported by the filedialog implementation *and* by the application. bool QPlatformFileDialogHelper::isSupportedUrl(const QUrl &url) const { diff --git a/src/gui/kernel/qplatformdialoghelper.h b/src/gui/kernel/qplatformdialoghelper.h index 6caef070e2..ed88c19c84 100644 --- a/src/gui/kernel/qplatformdialoghelper.h +++ b/src/gui/kernel/qplatformdialoghelper.h @@ -372,6 +372,9 @@ public: QUrl initialDirectory() const; void setInitialDirectory(const QUrl &); + QString initiallySelectedMimeTypeFilter() const; + void setInitiallySelectedMimeTypeFilter(const QString &); + QString initiallySelectedNameFilter() const; void setInitiallySelectedNameFilter(const QString &); @@ -397,7 +400,9 @@ public: virtual void selectFile(const QUrl &filename) = 0; virtual QList<QUrl> selectedFiles() const = 0; virtual void setFilter() = 0; + virtual void selectMimeTypeFilter(const QString &filter); virtual void selectNameFilter(const QString &filter) = 0; + virtual QString selectedMimeTypeFilter() const; virtual QString selectedNameFilter() const = 0; virtual bool isSupportedUrl(const QUrl &url) const; diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index 8058dee567..5bfb7553a5 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -1461,6 +1461,19 @@ void QFileDialog::selectNameFilter(const QString &filter) } /*! + * \since 5.9 + * \return The mimetype of the file that the user selected in the file dialog. + */ +QString QFileDialog::selectedMimeTypeFilter() const +{ + Q_D(const QFileDialog); + if (!d->usingWidgets()) + return d->selectedMimeTypeFilter_sys(); + + return d->options->initiallySelectedMimeTypeFilter(); +} + +/*! \since 4.4 Returns the filter that the user selected in the file dialog. @@ -1579,9 +1592,19 @@ QStringList QFileDialog::mimeTypeFilters() const */ void QFileDialog::selectMimeTypeFilter(const QString &filter) { - const QString text = nameFilterForMime(filter); - if (!text.isEmpty()) - selectNameFilter(text); + Q_D(QFileDialog); + d->options->setInitiallySelectedMimeTypeFilter(filter); + + const QString filterForMime = nameFilterForMime(filter); + + if (!d->usingWidgets()) { + d->selectMimeTypeFilter_sys(filter); + if (d->selectedMimeTypeFilter_sys().isEmpty() && !filterForMime.isEmpty()) { + selectNameFilter(filterForMime); + } + } else if (!filterForMime.isEmpty()) { + selectNameFilter(filterForMime); + } } #endif // QT_NO_MIMETYPE diff --git a/src/widgets/dialogs/qfiledialog.h b/src/widgets/dialogs/qfiledialog.h index c2ab0b3918..7959eebd7b 100644 --- a/src/widgets/dialogs/qfiledialog.h +++ b/src/widgets/dialogs/qfiledialog.h @@ -125,6 +125,7 @@ public: void setNameFilters(const QStringList &filters); QStringList nameFilters() const; void selectNameFilter(const QString &filter); + QString selectedMimeTypeFilter() const; QString selectedNameFilter() const; #ifndef QT_NO_MIMETYPE diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h index afebad4457..b665b54a9b 100644 --- a/src/widgets/dialogs/qfiledialog_p.h +++ b/src/widgets/dialogs/qfiledialog_p.h @@ -258,6 +258,8 @@ public: void selectFile_sys(const QUrl &filename); QList<QUrl> selectedFiles_sys() const; void setFilter_sys(); + void selectMimeTypeFilter_sys(const QString &filter); + QString selectedMimeTypeFilter_sys() const; void selectNameFilter_sys(const QString &filter); QString selectedNameFilter_sys() const; ////////////////////////////////////////////// @@ -400,6 +402,20 @@ inline void QFileDialogPrivate::setFilter_sys() helper->setFilter(); } +inline void QFileDialogPrivate::selectMimeTypeFilter_sys(const QString &filter) +{ + if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) + helper->selectMimeTypeFilter(filter); +} + +QString QFileDialogPrivate::selectedMimeTypeFilter_sys() const +{ + if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) + return helper->selectedMimeTypeFilter(); + + return QString(); +} + inline void QFileDialogPrivate::selectNameFilter_sys(const QString &filter) { if (QPlatformFileDialogHelper *helper = platformFileDialogHelper()) diff --git a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp index c9aef497af..44cb5a5bf8 100644 --- a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp +++ b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp @@ -119,6 +119,8 @@ private slots: void selectFilter(); void viewMode(); void proxymodel(); + void setMimeTypeFilters_data(); + void setMimeTypeFilters(); void setNameFilter_data(); void setNameFilter(); void setEmptyNameFilter(); @@ -1039,6 +1041,34 @@ void tst_QFiledialog::proxymodel() QCOMPARE(fd.proxyModel(), nullptr); } +void tst_QFiledialog::setMimeTypeFilters_data() +{ + QTest::addColumn<QStringList>("mimeTypeFilters"); + QTest::addColumn<QString>("targetMimeTypeFilter"); + QTest::addColumn<QString>("expectedSelectedMimeTypeFilter"); + + const auto headerMime = QStringLiteral("text/x-chdr"); + const auto jsonMime = QStringLiteral("application/json"); + const auto zipMime = QStringLiteral("application/zip"); + + QTest::newRow("single mime filter (C header file)") << QStringList {headerMime} << headerMime << headerMime; + QTest::newRow("single mime filter (JSON file)") << QStringList {jsonMime} << jsonMime << jsonMime; + QTest::newRow("multiple mime filters") << QStringList {jsonMime, zipMime} << jsonMime << jsonMime; +} + +void tst_QFiledialog::setMimeTypeFilters() +{ + QFETCH(QStringList, mimeTypeFilters); + QFETCH(QString, targetMimeTypeFilter); + QFETCH(QString, expectedSelectedMimeTypeFilter); + + QFileDialog fd; + fd.setMimeTypeFilters(mimeTypeFilters); + fd.selectMimeTypeFilter(targetMimeTypeFilter); + + QCOMPARE(fd.selectedMimeTypeFilter(), expectedSelectedMimeTypeFilter); +} + void tst_QFiledialog::setEmptyNameFilter() { QFileDialog fd; |