Improve mime type filters in QFileDialog
This patch improves the handling of mime type filters in QFileDialog. The main change is in selectMimeTypeFilter(), which was just falling back unconditionally on selectNameFilter(). Instead, mime type filters should have an higher priority than name filters. This patch also adds a new selectedMimeTypeFilter() method, which is used in the unit test. Change-Id: Ice8bb08f5ff46e4a942d539f6001424eca878f74 Reviewed-by: David Faure <david.faure@kdab.com>bb10
parent
bc80cef1d4
commit
34f82b8abc
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1460,6 +1460,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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue