Support for QFileDialog static get methods
authorKevin Krammer <kevin.krammer@kdab.com>
Mon, 22 Oct 2012 13:33:05 +0000 (15:33 +0200)
committerKevin Krammer <kevin.krammer@kdab.com>
Mon, 22 Oct 2012 13:33:05 +0000 (15:33 +0200)
declarativeobjects.cpp
declarativeobjects_p.h
declarativewidgetdocument.cpp
filedialog.qml [new file with mode: 0644]

index b34c07c..fc174f4 100644 (file)
@@ -703,11 +703,66 @@ DeclarativeDialogButtonBox::DeclarativeDialogButtonBox(QObject *parent) : Declar
 CUSTOM_METAOBJECT(DeclarativeDialogButtonBox, QDialogButtonBox)
 
 // DeclarativeFileDialog
+DeclarativeFileDialogAttached::DeclarativeFileDialogAttached(QObject *parent) : QObject(parent)
+{
+}
+
+QString DeclarativeFileDialogAttached::getExistingDirectory(QObject *parent, const QString &caption,
+                                                            const QString &dir, int options)
+{
+  return QFileDialog::getExistingDirectory(bestParentWindow(parent), caption, dir, static_cast<QFileDialog::Options>(options));
+}
+
+QString DeclarativeFileDialogAttached::getOpenFileName(QObject *parent, const QString &caption,
+                                                       const QString &dir, const QString &filter, int options)
+{
+  return QFileDialog::getOpenFileName(bestParentWindow(parent), caption, dir, filter, 0, static_cast<QFileDialog::Options>(options));
+}
+
+QStringList DeclarativeFileDialogAttached::getOpenFileNames(QObject *parent, const QString &caption,
+                                                            const QString &dir, const QString &filter, int options)
+{
+  return QFileDialog::getOpenFileNames(bestParentWindow(parent), caption, dir, filter, 0, static_cast<QFileDialog::Options>(options));
+
+}
+
+QString DeclarativeFileDialogAttached::getSaveFileName(QObject *parent, const QString &caption,
+                                                       const QString &dir, const QString &filter, int options)
+{
+  return QFileDialog::getSaveFileName(bestParentWindow(parent), caption, dir, filter, 0, static_cast<QFileDialog::Options>(options));
+}
+
+QWidget *DeclarativeFileDialogAttached::bestParentWindow(QObject *parent) const
+{
+  if (!parent)
+    parent = this->parent();
+
+  // if parent is a Declarative Object, search the proxied hierarchy
+  AbstractDeclarativeObject *declarativeObject = dynamic_cast<AbstractDeclarativeObject*>(parent);
+  if (declarativeObject)
+    parent = declarativeObject->object();
+
+  while (parent) {
+    QWidget *widget = qobject_cast<QWidget*>(parent);
+    if (widget)
+      return widget->topLevelWidget();
+
+    parent = parent->parent();
+  }
+
+  return 0;
+}
+
 DeclarativeFileDialog::DeclarativeFileDialog(QObject *parent) : DeclarativeWidgetProxy<FileDialog>(parent)
 {
   connectAllSignals(m_proxiedObject, this);
 }
 
+DeclarativeFileDialogAttached *DeclarativeFileDialog::qmlAttachedProperties(QObject *parent)
+{
+  return new DeclarativeFileDialogAttached(parent);
+}
+
 CUSTOM_METAOBJECT(DeclarativeFileDialog, FileDialog)
 
 // DeclarativeFontDialog
index fd170e5..3cb552b 100644 (file)
@@ -442,14 +442,43 @@ class DeclarativeDialogButtonBox : public DeclarativeWidgetProxy<QDialogButtonBo
     DeclarativeDialogButtonBox(QObject *parent = 0);
 };
 
+class DeclarativeFileDialogAttached : public QObject
+{
+  Q_OBJECT
+
+  public:
+    DeclarativeFileDialogAttached(QObject *parent = 0);
+
+    Q_INVOKABLE QString getExistingDirectory(QObject *parent = 0, const QString &caption = QString(),
+                                             const QString &dir = QString(), int options = QFileDialog::ShowDirsOnly);
+
+    Q_INVOKABLE QString getOpenFileName(QObject *parent = 0, const QString &caption = QString(),
+                                        const QString &dir = QString(), const QString &filter = QString(),
+                                        int options = QFileDialog::ShowDirsOnly);
+
+    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);
+
+  private:
+    QWidget *bestParentWindow(QObject *parent) const;
+};
+
 class DeclarativeFileDialog : public DeclarativeWidgetProxy<FileDialog>
 {
   DECLARATIVE_OBJECT
 
   public:
     DeclarativeFileDialog(QObject *parent = 0);
+
+    static DeclarativeFileDialogAttached *qmlAttachedProperties(QObject *parent);
 };
 
+QML_DECLARE_TYPEINFO(DeclarativeFileDialog, QML_HAS_ATTACHED_PROPERTIES)
+
 class DeclarativeFontDialog : public DeclarativeWidgetProxy<QFontDialog>
 {
   DECLARATIVE_OBJECT
index 31e0d13..05d22ad 100644 (file)
@@ -50,6 +50,7 @@ DeclarativeWidgetDocument::DeclarativeWidgetDocument(const QUrl &url, QObject *p
   qmlRegisterType<DeclarativeColorDialog>("QtGui", 1, 0, "ColorDialog");
   qmlRegisterType<DeclarativeDialog>("QtGui", 1, 0, "Dialog");
   qmlRegisterType<DeclarativeDialogButtonBox>("QtGui", 1, 0, "DialogButtonBox");
+  qmlRegisterType<DeclarativeFileDialogAttached>();
   qmlRegisterType<DeclarativeFileDialog>("QtGui", 1, 0, "FileDialog");
   qmlRegisterType<DeclarativeFontDialog>("QtGui", 1, 0, "FontDialog");
   qmlRegisterType<DeclarativeInputDialog>("QtGui", 1, 0, "InputDialog");
diff --git a/filedialog.qml b/filedialog.qml
new file mode 100644 (file)
index 0000000..8c0a79b
--- /dev/null
@@ -0,0 +1,34 @@
+import QtGui 1.0
+
+Widget {
+  VBoxLayout {
+    PushButton {
+      text: "FileDialog::getExistingDirectory"
+      onClicked: {
+        var file = FileDialog.getExistingDirectory()
+        console.log("FileDialog.getExistingDirectory returned " + file)
+      }
+    }
+    PushButton {
+      text: "FileDialog::getOpenFileName"
+      onClicked: {
+        var file = FileDialog.getOpenFileName()
+        console.log("FileDialog.getOpenFileName returned " + file)
+      }
+    }
+    PushButton {
+      text: "FileDialog::getOpenFileNames"
+      onClicked: {
+        var files = FileDialog.getOpenFileNames()
+        console.log("FileDialog.getOpenFileNames returned " + files)
+      }
+    }
+    PushButton {
+      text: "FileDialog::getSaveFileName"
+      onClicked: {
+        var file = FileDialog.getSaveFileName()
+        console.log("FileDialog.getSaveFileName returned " + file)
+      }
+    }
+  }
+}