QFileDialog: Do not pass on file model root to QFileDialogOptions.
authorFriedemann Kleint <Friedemann.Kleint@digia.com>
Fri, 26 Oct 2012 13:03:00 +0000 (15:03 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 2 Nov 2012 11:16:49 +0000 (12:16 +0100)
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>
src/widgets/dialogs/qfiledialog.cpp
src/widgets/dialogs/qfiledialog_p.h

index 2ff0d03..9a2e32b 100644 (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;
 }
 
index b13f36a..592c4a0 100644 (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);