QFileDialog: Do not pass on file model root to QFileDialogOptions.

QFileDialog::selectedFiles() defaults to file model root
for 'AnyFile', which confuses native dialogs since
selectedFiles == directory in that case. Split up
QFileDialog::selectedFiles() and skip the default when
initializing QFileDialogOptions for native dialogs.

Change-Id: I65cda182df8b1748159058fc361c10d97f5650ce
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
This commit is contained in:
Friedemann Kleint 2012-10-26 15:03:00 +02:00 committed by The Qt Project
parent c6f3d919dd
commit 8727826871
2 changed files with 26 additions and 13 deletions

View File

@ -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;
}

View File

@ -128,6 +128,7 @@ public:
static QString workingDirectory(const QString &path);
static QString initialSelection(const QString &path);
QStringList typedFiles() const;
QStringList userSelectedFiles() const;
QStringList addDefaultSuffixToFiles(const QStringList filesToFix) const;
bool removeDirectory(const QString &path);
void setLabelTextControl(QFileDialog::DialogLabel label, const QString &text);