summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/dialogs/qfiledialog.cpp12
-rw-r--r--tests/auto/qfiledialog/tst_qfiledialog.cpp49
2 files changed, 54 insertions, 7 deletions
diff --git a/src/gui/dialogs/qfiledialog.cpp b/src/gui/dialogs/qfiledialog.cpp
index e7b6b22783..2dd342a15f 100644
--- a/src/gui/dialogs/qfiledialog.cpp
+++ b/src/gui/dialogs/qfiledialog.cpp
@@ -1184,9 +1184,11 @@ void QFileDialog::selectNameFilter(const QString &filter)
d->selectNameFilter_sys(filter);
return;
}
- int i;
+ int i = -1;
if (testOption(HideNameFilterDetails)) {
- i = d->qFileDialogUi->fileTypeCombo->findText(qt_strip_filters(qt_make_filter_list(filter)).first());
+ const QStringList filters = qt_strip_filters(qt_make_filter_list(filter));
+ if (!filters.isEmpty())
+ i = d->qFileDialogUi->fileTypeCombo->findText(filters.first());
} else {
i = d->qFileDialogUi->fileTypeCombo->findText(filter);
}
@@ -1793,7 +1795,7 @@ QString QFileDialog::getOpenFileName(QWidget *parent,
// create a qt dialog
QFileDialog dialog(args);
- if (selectedFilter)
+ if (selectedFilter && !selectedFilter->isEmpty())
dialog.selectNameFilter(*selectedFilter);
if (dialog.exec() == QDialog::Accepted) {
if (selectedFilter)
@@ -1886,7 +1888,7 @@ QStringList QFileDialog::getOpenFileNames(QWidget *parent,
// create a qt dialog
QFileDialog dialog(args);
- if (selectedFilter)
+ if (selectedFilter && !selectedFilter->isEmpty())
dialog.selectNameFilter(*selectedFilter);
if (dialog.exec() == QDialog::Accepted) {
if (selectedFilter)
@@ -1981,7 +1983,7 @@ QString QFileDialog::getSaveFileName(QWidget *parent,
// create a qt dialog
QFileDialog dialog(args);
dialog.setAcceptMode(AcceptSave);
- if (selectedFilter)
+ if (selectedFilter && !selectedFilter->isEmpty())
dialog.selectNameFilter(*selectedFilter);
if (dialog.exec() == QDialog::Accepted) {
if (selectedFilter)
diff --git a/tests/auto/qfiledialog/tst_qfiledialog.cpp b/tests/auto/qfiledialog/tst_qfiledialog.cpp
index 8e69b3c3da..795caf6b41 100644
--- a/tests/auto/qfiledialog/tst_qfiledialog.cpp
+++ b/tests/auto/qfiledialog/tst_qfiledialog.cpp
@@ -138,7 +138,9 @@ private slots:
void selectFilter();
void viewMode();
void proxymodel();
+ void setNameFilter_data();
void setNameFilter();
+ void setEmptyNameFilter();
void focus();
void caption();
void historyBack();
@@ -1019,11 +1021,54 @@ void tst_QFiledialog::proxymodel()
QCOMPARE(fd.proxyModel(), (QAbstractProxyModel*)0);
}
+void tst_QFiledialog::setEmptyNameFilter()
+{
+ QNonNativeFileDialog fd;
+ fd.setNameFilter(QString());
+ fd.setNameFilters(QStringList());
+}
+
+void tst_QFiledialog::setNameFilter_data()
+{
+ QTest::addColumn<bool>("nameFilterDetailsVisible");
+ QTest::addColumn<QStringList>("filters");
+ QTest::addColumn<QString>("selectFilter");
+ QTest::addColumn<QString>("expectedSelectedFilter");
+
+ QTest::newRow("namedetailsvisible-empty") << true << QStringList() << QString() << QString();
+ QTest::newRow("namedetailsinvisible-empty") << false << QStringList() << QString() << QString();
+
+ const QString anyFileNoDetails = QLatin1String("Any files");
+ const QString anyFile = anyFileNoDetails + QLatin1String(" (*)");
+ const QString imageFilesNoDetails = QLatin1String("Image files");
+ const QString imageFiles = imageFilesNoDetails + QLatin1String(" (*.png *.xpm *.jpg)");
+ const QString textFileNoDetails = QLatin1String("Text files");
+ const QString textFile = textFileNoDetails + QLatin1String(" (*.txt)");
+
+ QStringList filters;
+ filters << anyFile << imageFiles << textFile;
+
+ QTest::newRow("namedetailsvisible-images") << true << filters << imageFiles << imageFiles;
+ QTest::newRow("namedetailsinvisible-images") << false << filters << imageFiles << imageFilesNoDetails;
+
+ const QString invalid = "foo";
+ QTest::newRow("namedetailsvisible-invalid") << true << filters << invalid << anyFile;
+ // Potential crash when trying to convert the invalid filter into a list and stripping it, resulting in an empty list.
+ QTest::newRow("namedetailsinvisible-invalid") << false << filters << invalid << anyFileNoDetails;
+}
+
void tst_QFiledialog::setNameFilter()
{
+ QFETCH(bool, nameFilterDetailsVisible);
+ QFETCH(QStringList, filters);
+ QFETCH(QString, selectFilter);
+ QFETCH(QString, expectedSelectedFilter);
+
QNonNativeFileDialog fd;
- fd.setFilter(QString());
- fd.setFilters(QStringList());
+ fd.setNameFilters(filters);
+ fd.setNameFilterDetailsVisible(nameFilterDetailsVisible);
+ fd.selectNameFilter(selectFilter);
+ QCOMPARE(fd.selectedNameFilter(), expectedSelectedFilter);
}
void tst_QFiledialog::focus()