diff options
Diffstat (limited to 'src/widgets/dialogs/qfiledialog.cpp')
-rw-r--r-- | src/widgets/dialogs/qfiledialog.cpp | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index d9d318765d..9a2e32b631 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -552,7 +552,7 @@ void QFileDialogPrivate::helperPrepareShow(QPlatformDialogHelper *) directory.absolutePath() : QString()); options->setInitiallySelectedNameFilter(q->selectedNameFilter()); - options->setInitiallySelectedFiles(q->selectedFiles()); + options->setInitiallySelectedFiles(userSelectedFiles()); } void QFileDialogPrivate::helperDone(QDialog::DialogCode code, QPlatformDialogHelper *) @@ -1009,6 +1009,24 @@ QStringList QFileDialogPrivate::typedFiles() const return addDefaultSuffixToFiles(files); } +// Return selected files without defaulting to the root of the file system model +// used for initializing QFileDialogOptions for native dialogs. The default is +// not suitable for native dialogs since it mostly equals directory(). +QStringList QFileDialogPrivate::userSelectedFiles() const +{ + if (nativeDialogInUse) + return addDefaultSuffixToFiles(selectedFiles_sys()); + + QStringList files; + foreach (const QModelIndex &index, qFileDialogUi->listView->selectionModel()->selectedRows()) + files.append(index.data(QFileSystemModel::FilePathRole).toString()); + + if (files.isEmpty() && !lineEdit()->text().isEmpty()) + files = typedFiles(); + + return files; +} + QStringList QFileDialogPrivate::addDefaultSuffixToFiles(const QStringList filesToFix) const { QStringList files; @@ -1046,19 +1064,13 @@ QStringList QFileDialogPrivate::addDefaultSuffixToFiles(const QStringList filesT QStringList QFileDialog::selectedFiles() const { Q_D(const QFileDialog); - if (d->nativeDialogInUse) - return d->addDefaultSuffixToFiles(d->selectedFiles_sys()); - QModelIndexList indexes = d->qFileDialogUi->listView->selectionModel()->selectedRows(); - QStringList files; - for (int i = 0; i < indexes.count(); ++i) - files.append(indexes.at(i).data(QFileSystemModel::FilePathRole).toString()); - - if (files.isEmpty() && !d->lineEdit()->text().isEmpty()) - files = d->typedFiles(); - const FileMode fm = fileMode(); - if (files.isEmpty() && !(fm == ExistingFile || fm == ExistingFiles)) - files.append(d->rootIndex().data(QFileSystemModel::FilePathRole).toString()); + QStringList files = d->userSelectedFiles(); + if (files.isEmpty()) { + const FileMode fm = fileMode(); + if (fm != ExistingFile && fm != ExistingFiles) + files.append(d->rootIndex().data(QFileSystemModel::FilePathRole).toString()); + } return files; } @@ -1201,9 +1213,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); } @@ -1770,7 +1784,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) @@ -1855,7 +1869,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) @@ -1942,7 +1956,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) |