From fc6d5ed18da29138494803baa11c0edc22ace7f4 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 3 Feb 2016 12:45:21 +0100 Subject: QFileDialogOptions: Expose default name filter setting. Move the bool QFileDialogPrivate::defaultFileTypes to QFileDialogOptions as defaultNameFilters and add a static function returning the translated default filter string. Let QFileDialogOptions::nameFilters() return the default filter until a value has been set. This removes the need for special handling for empty filter lists in the QPA plugins. As a side effect, Qt Quick Controls's FileDialog will then also default to "All files" if no filters have been set. Task-number: QTBUG-50644 Change-Id: I9ba271a472d4fa03767b540ef6f1399f5ca4408e Reviewed-by: Richard Moe Gustavsen --- src/gui/kernel/qplatformdialoghelper.cpp | 41 ++++++++++++++++++++++++++++++-- src/gui/kernel/qplatformdialoghelper.h | 5 ++++ src/widgets/dialogs/qfiledialog.cpp | 6 ++--- src/widgets/dialogs/qfiledialog_p.h | 1 - 4 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/gui/kernel/qplatformdialoghelper.cpp b/src/gui/kernel/qplatformdialoghelper.cpp index af0d71a57a..f2a1d20d54 100644 --- a/src/gui/kernel/qplatformdialoghelper.cpp +++ b/src/gui/kernel/qplatformdialoghelper.cpp @@ -39,6 +39,7 @@ #include "qplatformdialoghelper.h" +#include #include #include #include @@ -411,7 +412,8 @@ public: viewMode(QFileDialogOptions::Detail), fileMode(QFileDialogOptions::AnyFile), acceptMode(QFileDialogOptions::AcceptOpen), - filters(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs) + filters(QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs), + useDefaultNameFilters(true) {} QFileDialogOptions::FileDialogOptions options; @@ -423,6 +425,7 @@ public: QString labels[QFileDialogOptions::DialogLabelCount]; QDir::Filters filters; QList sidebarUrls; + bool useDefaultNameFilters; QStringList nameFilters; QStringList mimeTypeFilters; QString defaultSuffix; @@ -534,14 +537,48 @@ QList QFileDialogOptions::sidebarUrls() const return d->sidebarUrls; } +/*! + \since 5.7 + \internal + The bool property useDefaultNameFilters indicates that no name filters have been + set or that they are equivalent to \gui{All Files (*)}. If it is true, the + platform can choose to hide the filter combo box. + + \sa defaultNameFilterString(). +*/ +bool QFileDialogOptions::useDefaultNameFilters() const +{ + return d->useDefaultNameFilters; +} + +void QFileDialogOptions::setUseDefaultNameFilters(bool dnf) +{ + d->useDefaultNameFilters = dnf; +} + void QFileDialogOptions::setNameFilters(const QStringList &filters) { + d->useDefaultNameFilters = filters.size() == 1 + && filters.first() == QFileDialogOptions::defaultNameFilterString(); d->nameFilters = filters; } QStringList QFileDialogOptions::nameFilters() const { - return d->nameFilters; + return d->useDefaultNameFilters ? + QStringList(QFileDialogOptions::defaultNameFilterString()) : d->nameFilters; +} + +/*! + \since 5.6 + \internal + \return The translated default name filter string (\gui{All Files (*)}). + \sa defaultNameFilters(), nameFilters() +*/ + +QString QFileDialogOptions::defaultNameFilterString() +{ + return QCoreApplication::translate("QFileDialog", "All Files (*)"); } void QFileDialogOptions::setMimeTypeFilters(const QStringList &filters) diff --git a/src/gui/kernel/qplatformdialoghelper.h b/src/gui/kernel/qplatformdialoghelper.h index d0594593dd..825dcf293d 100644 --- a/src/gui/kernel/qplatformdialoghelper.h +++ b/src/gui/kernel/qplatformdialoghelper.h @@ -349,6 +349,9 @@ public: void setSidebarUrls(const QList &urls); QList sidebarUrls() const; + bool useDefaultNameFilters() const; + void setUseDefaultNameFilters(bool d); + void setNameFilters(const QStringList &filters); QStringList nameFilters() const; @@ -377,6 +380,8 @@ public: void setSupportedSchemes(const QStringList &schemes); QStringList supportedSchemes() const; + static QString defaultNameFilterString(); + private: QSharedDataPointer d; }; diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index 07422f8811..4d74292e8f 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -532,7 +532,6 @@ QFileDialogPrivate::QFileDialogPrivate() deleteAction(0), showHiddenAction(0), useDefaultCaption(true), - defaultFileTypes(true), qFileDialogUi(0), options(new QFileDialogOptions) { @@ -663,8 +662,8 @@ void QFileDialogPrivate::retranslateStrings() { Q_Q(QFileDialog); /* WIDGETS */ - if (defaultFileTypes) - q->setNameFilter(QFileDialog::tr("All Files (*)")); + if (options->useDefaultNameFilters()) + q->setNameFilter(QFileDialogOptions::defaultNameFilterString()); if (nativeDialogInUse) return; @@ -1400,7 +1399,6 @@ QStringList qt_strip_filters(const QStringList &filters) void QFileDialog::setNameFilters(const QStringList &filters) { Q_D(QFileDialog); - d->defaultFileTypes = (filters == QStringList(QFileDialog::tr("All Files (*)"))); QStringList cleanedFilters; const int numFilters = filters.count(); cleanedFilters.reserve(numFilters); diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h index 84831ac03e..f273a4fb37 100644 --- a/src/widgets/dialogs/qfiledialog_p.h +++ b/src/widgets/dialogs/qfiledialog_p.h @@ -250,7 +250,6 @@ public: QAction *newFolderAction; bool useDefaultCaption; - bool defaultFileTypes; // setVisible_sys returns true if it ends up showing a native // dialog. Returning false means that a non-native dialog must be -- cgit v1.2.3