summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/qplatformdialoghelper.cpp21
-rw-r--r--src/gui/kernel/qplatformdialoghelper.h5
-rw-r--r--src/widgets/dialogs/qfiledialog.cpp29
-rw-r--r--src/widgets/dialogs/qfiledialog.h1
-rw-r--r--src/widgets/dialogs/qfiledialog_p.h16
-rw-r--r--tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp30
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;