QFileDialog static methods optional arguments and output arguments
authorKevin Krammer <kevin.krammer@kdab.com>
Tue, 23 Oct 2012 15:59:27 +0000 (17:59 +0200)
committerKevin Krammer <kevin.krammer@kdab.com>
Tue, 23 Oct 2012 16:05:24 +0000 (18:05 +0200)
declarativeobjects.cpp
declarativeobjects_p.h
filedialog.qml

index 378a874..a6771db 100644 (file)
@@ -703,33 +703,117 @@ DeclarativeDialogButtonBox::DeclarativeDialogButtonBox(QObject *parent) : Declar
 CUSTOM_METAOBJECT(DeclarativeDialogButtonBox, QDialogButtonBox)
 
 // DeclarativeFileDialog
-DeclarativeFileDialogAttached::DeclarativeFileDialogAttached(QObject *parent) : QObject(parent)
+class DeclarativeFileDialogAttached::Private
 {
+  public:
+    QPointer<QObject> dialogParent;
+    QString caption;
+    QString dir;
+    QStringList nameFilters;
+    QString selectedFilter;
+};
+
+DeclarativeFileDialogAttached::DeclarativeFileDialogAttached(QObject *parent)
+  : QObject(parent), d(new Private)
+{
+}
+
+DeclarativeFileDialogAttached::~DeclarativeFileDialogAttached()
+{
+  delete d;
+}
+
+void DeclarativeFileDialogAttached::setDialogParent(QObject *parent)
+{
+  if (parent == d->dialogParent)
+    return;
+
+  d->dialogParent = parent;
+  emit dialogParentChanged(parent);
+}
+
+QObject *DeclarativeFileDialogAttached::dialogParent() const
+{
+  return d->dialogParent;
+}
+
+void DeclarativeFileDialogAttached::setCaption(const QString &caption)
+{
+  if (caption == d->caption)
+    return;
+
+  d->caption = caption;
+  emit captionChanged(caption);
+}
+
+QString DeclarativeFileDialogAttached::caption() const
+{
+  return d->caption;
+}
+
+void DeclarativeFileDialogAttached::setDir(const QString &dir)
+{
+  if (dir == d->dir)
+    return;
+
+  d->dir = dir;
+  emit dirChanged(dir);
+}
+
+QString DeclarativeFileDialogAttached::dir() const
+{
+  return d->dir;
+}
+
+void DeclarativeFileDialogAttached::setNameFilters(const QStringList &nameFilters)
+{
+  if (nameFilters == d->nameFilters)
+    return;
+
+  d->nameFilters = nameFilters;
+  emit nameFiltersChanged(nameFilters);
+}
+
+QStringList DeclarativeFileDialogAttached::nameFilters() const
+{
+  return d->nameFilters;
 }
 
-QString DeclarativeFileDialogAttached::getExistingDirectory(QObject *parent, const QString &caption,
-                                                            const QString &dir, int options)
+QString DeclarativeFileDialogAttached::selectedFilter() const
 {
-  return QFileDialog::getExistingDirectory(bestParentWindow(parent), caption, dir, static_cast<QFileDialog::Options>(options));
+  return d->selectedFilter;
 }
 
-QString DeclarativeFileDialogAttached::getOpenFileName(QObject *parent, const QString &caption,
-                                                       const QString &dir, const QString &filter, int options)
+QString DeclarativeFileDialogAttached::getExistingDirectory()
 {
-  return QFileDialog::getOpenFileName(bestParentWindow(parent), caption, dir, filter, 0, static_cast<QFileDialog::Options>(options));
+  return QFileDialog::getExistingDirectory(bestParentWindow(d->dialogParent), d->caption, d->dir, QFileDialog::ShowDirsOnly);
 }
 
-QStringList DeclarativeFileDialogAttached::getOpenFileNames(QObject *parent, const QString &caption,
-                                                            const QString &dir, const QString &filter, int options)
+QString DeclarativeFileDialogAttached::getOpenFileName()
 {
-  return QFileDialog::getOpenFileNames(bestParentWindow(parent), caption, dir, filter, 0, static_cast<QFileDialog::Options>(options));
+  QString selectedFilter;
+  const QString retVal = QFileDialog::getOpenFileName(bestParentWindow(d->dialogParent), d->caption, d->dir,
+                                                      d->nameFilters.join(";;"), &selectedFilter, 0);
+  setSelectedFilter(selectedFilter);
+  return retVal;
+}
 
+QStringList DeclarativeFileDialogAttached::getOpenFileNames()
+{
+  QString selectedFilter;
+  const QStringList retVal = QFileDialog::getOpenFileNames(bestParentWindow(d->dialogParent), d->caption, d->dir,
+                                                           d->nameFilters.join(";;"), &selectedFilter, 0);
+  setSelectedFilter(selectedFilter);
+  return retVal;
 }
 
-QString DeclarativeFileDialogAttached::getSaveFileName(QObject *parent, const QString &caption,
-                                                       const QString &dir, const QString &filter, int options)
+QString DeclarativeFileDialogAttached::getSaveFileName()
 {
-  return QFileDialog::getSaveFileName(bestParentWindow(parent), caption, dir, filter, 0, static_cast<QFileDialog::Options>(options));
+  QString selectedFilter;
+  const QString retVal = QFileDialog::getSaveFileName(bestParentWindow(d->dialogParent), d->caption, d->dir,
+                                                      d->nameFilters.join(";;"), &selectedFilter, 0);
+  setSelectedFilter(selectedFilter);
+  return retVal;
 }
 
 QWidget *DeclarativeFileDialogAttached::bestParentWindow(QObject *parent) const
@@ -753,6 +837,15 @@ QWidget *DeclarativeFileDialogAttached::bestParentWindow(QObject *parent) const
   return 0;
 }
 
+void DeclarativeFileDialogAttached::setSelectedFilter(const QString &filter)
+{
+  if (filter == d->selectedFilter)
+    return;
+
+  d->selectedFilter = filter;
+  emit selectedFilterChanged(filter);
+}
+
 DeclarativeFileDialog::DeclarativeFileDialog(QObject *parent) : DeclarativeWidgetProxy<FileDialog>(parent)
 {
   connectAllSignals(m_proxiedObject, this);
index 078212d..8f80f8d 100644 (file)
@@ -445,26 +445,52 @@ class DeclarativeDialogButtonBox : public DeclarativeWidgetProxy<QDialogButtonBo
 class DeclarativeFileDialogAttached : public QObject
 {
   Q_OBJECT
+  Q_PROPERTY(QObject* parent READ dialogParent WRITE setDialogParent NOTIFY dialogParentChanged)
+  Q_PROPERTY(QString caption READ caption WRITE setCaption NOTIFY captionChanged)
+  Q_PROPERTY(QString dir READ dir WRITE setDir NOTIFY dirChanged)
+  Q_PROPERTY(QStringList nameFilters READ nameFilters WRITE setNameFilters NOTIFY nameFiltersChanged)
+  // TODO dialog option
+  Q_PROPERTY(QString selectedFilter READ selectedFilter NOTIFY selectedFilterChanged)
 
   public:
     DeclarativeFileDialogAttached(QObject *parent = 0);
+    ~DeclarativeFileDialogAttached();
 
-    Q_INVOKABLE QString getExistingDirectory(QObject *parent = 0, const QString &caption = QString(),
-                                             const QString &dir = QString(), int options = QFileDialog::ShowDirsOnly);
+    void setDialogParent(QObject *parent);
+    QObject *dialogParent() const;
 
-    Q_INVOKABLE QString getOpenFileName(QObject *parent = 0, const QString &caption = QString(),
-                                        const QString &dir = QString(), const QString &filter = QString(),
-                                        int options = QFileDialog::ShowDirsOnly);
+    void setCaption(const QString &caption);
+    QString caption() const;
 
-    Q_INVOKABLE QStringList getOpenFileNames(QObject *parent = 0, const QString &caption = QString(),
-                                             const QString &dir = QString(), const QString &filter = QString(),
-                                             int options = QFileDialog::ShowDirsOnly);
-    Q_INVOKABLE QString getSaveFileName(QObject *parent = 0, const QString &caption = QString(),
-                                        const QString &dir = QString(), const QString &filter = QString(),
-                                        int options = QFileDialog::ShowDirsOnly);
+    void setDir(const QString &dir);
+    QString dir() const;
+
+    void setNameFilters(const QStringList &nameFilters);
+    QStringList nameFilters() const;
+
+    QString selectedFilter() const;
+
+    Q_INVOKABLE QString getExistingDirectory();
+
+    Q_INVOKABLE QString getOpenFileName();
+
+    Q_INVOKABLE QStringList getOpenFileNames();
+
+    Q_INVOKABLE QString getSaveFileName();
+
+  Q_SIGNALS:
+    void dialogParentChanged(QObject *parent);
+    void captionChanged(const QString &caption);
+    void dirChanged(const QString &dir);
+    void nameFiltersChanged(const QStringList &filters);
+    void selectedFilterChanged(const QString &filter);
 
   private:
     QWidget *bestParentWindow(QObject *parent) const;
+    void setSelectedFilter(const QString &filter);
+
+    class Private;
+    Private *const d;
 };
 
 class DeclarativeFileDialog : public DeclarativeWidgetProxy<FileDialog>
index 8c0a79b..4d04cc5 100644 (file)
@@ -17,6 +17,16 @@ Widget {
       }
     }
     PushButton {
+      text: "FileDialog::getOpenFileName, with options"
+      onClicked: {
+        FileDialog.caption = "Select a file to open";
+        FileDialog.nameFilters = [ "Headers (*.h)", "Sources (*.cpp)", "All Files (*.*)" ]
+        var file = FileDialog.getOpenFileName()
+        console.log("FileDialog.getOpenFileName returned " + file)
+        console.log("Selected filter " + FileDialog.selectedFilter)
+      }
+    }
+    PushButton {
       text: "FileDialog::getOpenFileNames"
       onClicked: {
         var files = FileDialog.getOpenFileNames()