diff --git a/autotests/kfiledialog_unittest.cpp b/autotests/kfiledialog_unittest.cpp --- a/autotests/kfiledialog_unittest.cpp +++ b/autotests/kfiledialog_unittest.cpp @@ -75,6 +75,45 @@ QCOMPARE(dialog.selectedNameFilter(), selectNameFilter); } +#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) + void testSelectedMimeTypeFilter_data() + { + QTest::addColumn("mimeTypeFilters"); + QTest::addColumn("targetMimeTypeFilter"); + + 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; + + QTest::newRow("single mime filter (JSON file)") + << QStringList {jsonMime} + << jsonMime; + + QTest::newRow("multiple mime filters") + << QStringList {jsonMime, zipMime} + << jsonMime; + } + + void testSelectedMimeTypeFilter() + { + QFileDialog dialog; + + QFETCH(QStringList, mimeTypeFilters); + dialog.setMimeTypeFilters(mimeTypeFilters); + dialog.show(); + + QFETCH(QString, targetMimeTypeFilter); + dialog.selectMimeTypeFilter(targetMimeTypeFilter); + + QCOMPARE(dialog.selectedMimeTypeFilter(), targetMimeTypeFilter); + } +#endif + + void testSetDirectory() { QFileDialog dialog; diff --git a/src/platformtheme/kdeplatformfiledialogbase_p.h b/src/platformtheme/kdeplatformfiledialogbase_p.h --- a/src/platformtheme/kdeplatformfiledialogbase_p.h +++ b/src/platformtheme/kdeplatformfiledialogbase_p.h @@ -35,9 +35,11 @@ explicit KDEPlatformFileDialogBase(); virtual QUrl directory() = 0; + virtual void selectMimeTypeFilter(const QString &filter) = 0; virtual void selectNameFilter(const QString &filter) = 0; virtual void setDirectory(const QUrl &directory) = 0; virtual void selectFile(const QUrl &filename) = 0; + virtual QString selectedMimeTypeFilter() = 0; virtual QString selectedNameFilter() = 0; virtual QList selectedFiles() = 0; diff --git a/src/platformtheme/kdeplatformfiledialoghelper.h b/src/platformtheme/kdeplatformfiledialoghelper.h --- a/src/platformtheme/kdeplatformfiledialoghelper.h +++ b/src/platformtheme/kdeplatformfiledialoghelper.h @@ -34,12 +34,14 @@ explicit KDEPlatformFileDialog(); QUrl directory() Q_DECL_OVERRIDE; + void selectMimeTypeFilter(const QString &filter) Q_DECL_OVERRIDE; void selectNameFilter(const QString &filter) Q_DECL_OVERRIDE; void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE; void selectFile(const QUrl &filename) Q_DECL_OVERRIDE; void setViewMode(QFileDialogOptions::ViewMode view); void setFileMode(QFileDialogOptions::FileMode mode); void setCustomLabel(QFileDialogOptions::DialogLabel label, const QString & text); + QString selectedMimeTypeFilter() Q_DECL_OVERRIDE; QString selectedNameFilter() Q_DECL_OVERRIDE; QList selectedFiles() Q_DECL_OVERRIDE; @@ -59,6 +61,10 @@ bool defaultNameFilterDisables() const Q_DECL_OVERRIDE; QUrl directory() const Q_DECL_OVERRIDE; QList selectedFiles() const Q_DECL_OVERRIDE; +#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) + QString selectedMimeTypeFilter() const Q_DECL_OVERRIDE; + void selectMimeTypeFilter(const QString &filter) Q_DECL_OVERRIDE; +#endif QString selectedNameFilter() const Q_DECL_OVERRIDE; void selectNameFilter(const QString &filter) Q_DECL_OVERRIDE; void selectFile(const QUrl &filename) Q_DECL_OVERRIDE; diff --git a/src/platformtheme/kdeplatformfiledialoghelper.cpp b/src/platformtheme/kdeplatformfiledialoghelper.cpp --- a/src/platformtheme/kdeplatformfiledialoghelper.cpp +++ b/src/platformtheme/kdeplatformfiledialoghelper.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -176,11 +177,35 @@ } } +QString KDEPlatformFileDialog::selectedMimeTypeFilter() +{ + if (m_fileWidget->filterWidget()->isMimeFilter()) { + const auto mimeTypeFromFilter = QMimeDatabase().mimeTypeForName(m_fileWidget->filterWidget()->currentFilter()); + // If one does not call selectMimeTypeFilter(), KFileFilterCombo::currentFilter() returns invalid mimeTypes, + // such as "application/json application/zip". + if (mimeTypeFromFilter.isValid()) { + return mimeTypeFromFilter.name(); + } + } + + if (selectedFiles().isEmpty()) { + return QString(); + } + + // Works for both KFile::File and KFile::Files modes. + return QMimeDatabase().mimeTypeForUrl(selectedFiles().at(0)).name(); +} + QString KDEPlatformFileDialog::selectedNameFilter() { return m_fileWidget->filterWidget()->currentFilter(); } +void KDEPlatformFileDialog::selectMimeTypeFilter(const QString &filter) +{ + m_fileWidget->filterWidget()->setCurrentFilter(filter); +} + void KDEPlatformFileDialog::selectNameFilter(const QString &filter) { m_fileWidget->filterWidget()->setCurrentFilter(filter); @@ -348,6 +373,18 @@ return m_dialog->selectedFiles(); } +#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) +QString KDEPlatformFileDialogHelper::selectedMimeTypeFilter() const +{ + return m_dialog->selectedMimeTypeFilter(); +} + +void KDEPlatformFileDialogHelper::selectMimeTypeFilter(const QString &filter) +{ + m_dialog->selectMimeTypeFilter(filter); +} +#endif + QString KDEPlatformFileDialogHelper::selectedNameFilter() const { return kde2QtFilter(options()->nameFilters(), m_dialog->selectedNameFilter()); diff --git a/src/platformtheme/kdirselectdialog.cpp b/src/platformtheme/kdirselectdialog.cpp --- a/src/platformtheme/kdirselectdialog.cpp +++ b/src/platformtheme/kdirselectdialog.cpp @@ -559,6 +559,11 @@ setCurrentUrl(directory); } +QString KDirSelectDialog::selectedMimeTypeFilter() +{ + return QString(); +} + QString KDirSelectDialog::selectedNameFilter() { return QString(); @@ -569,6 +574,11 @@ Q_UNUSED(filename) } +void KDirSelectDialog::selectMimeTypeFilter(const QString &filter) +{ + Q_UNUSED(filter) +} + void KDirSelectDialog::selectNameFilter(const QString &filter) { Q_UNUSED(filter) diff --git a/src/platformtheme/kdirselectdialog_p.h b/src/platformtheme/kdirselectdialog_p.h --- a/src/platformtheme/kdirselectdialog_p.h +++ b/src/platformtheme/kdirselectdialog_p.h @@ -98,9 +98,11 @@ QUrl startDir() const; QUrl directory() Q_DECL_OVERRIDE; + void selectMimeTypeFilter(const QString &filter) Q_DECL_OVERRIDE; void selectNameFilter(const QString &filter) Q_DECL_OVERRIDE; void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE; void selectFile(const QUrl &filename) Q_DECL_OVERRIDE; + QString selectedMimeTypeFilter() Q_DECL_OVERRIDE; QString selectedNameFilter() Q_DECL_OVERRIDE; QList selectedFiles() Q_DECL_OVERRIDE; diff --git a/tests/qfiledialogtest.cpp b/tests/qfiledialogtest.cpp --- a/tests/qfiledialogtest.cpp +++ b/tests/qfiledialogtest.cpp @@ -35,7 +35,7 @@ parser.addOption(QCommandLineOption(QStringList(QStringLiteral("nativeDialog")), QStringLiteral("Use the platform native dialog: 'on' or 'off'"), QStringLiteral("option"), QStringLiteral("on"))); parser.addOption(QCommandLineOption(QStringList(QStringLiteral("fileMode")), QStringLiteral("File dialog fileMode: 'AnyFile' or 'ExistingFile' or 'Directory' or 'ExistingFiles'"), QStringLiteral("type"))); parser.addOption(QCommandLineOption(QStringList(QStringLiteral("nameFilter")), QStringLiteral("Dialog nameFilter, e. g. 'cppfiles (*.cpp *.h *.hpp)', can be specified multiple times"), QStringLiteral("nameFilter"), QStringLiteral("Everything (*)"))); - // add option mimeTypeFilter later + parser.addOption(QCommandLineOption(QStringList(QStringLiteral("mimeTypeFilter")), QStringLiteral("Dialog mimeTypeFilter, e. g. 'application/json', can be specified multiple times"), QStringLiteral("mimeTypeFilter"))); parser.addOption(QCommandLineOption(QStringList(QStringLiteral("selectNameFilter")), QStringLiteral("Initially selected nameFilter"), QStringLiteral("selectNameFilter"))); parser.addOption(QCommandLineOption(QStringList(QStringLiteral("selectFile")), QStringLiteral("Initially selected file"), QStringLiteral("filename"))); parser.addOption(QCommandLineOption(QStringList(QStringLiteral("selectDirectory")), QStringLiteral("Initially selected directory"), QStringLiteral("dirname"))); @@ -80,6 +80,11 @@ dialog.setNameFilters(nameFilterList); } + const auto mimeFilterList = parser.values(QStringLiteral("mimeTypeFilter")); + if (!mimeFilterList.isEmpty()) { + dialog.setMimeTypeFilters(mimeFilterList); + } + QString selectNameFilter = parser.value(QStringLiteral("selectNameFilter")); if (!selectNameFilter.isEmpty()) { dialog.selectNameFilter(selectNameFilter); @@ -107,7 +112,12 @@ if (dialog.result() == QDialog::Accepted) { qDebug() << "selected files" << dialog.selectedFiles(); qDebug() << "selected urls" << dialog.selectedUrls(); - qDebug() << "selected name nameFilter" << dialog.selectedNameFilter(); +#if QT_VERSION >= QT_VERSION_CHECK(5, 9, 0) + qDebug() << "selected mime type filter" << dialog.selectedMimeTypeFilter(); +#endif } + + qDebug() << "mime type filter(s):" << dialog.mimeTypeFilters(); + return ret; }