summaryrefslogtreecommitdiff
path: root/src/dialogs
diff options
context:
space:
mode:
Diffstat (limited to 'src/dialogs')
-rw-r--r--src/dialogs/qquickabstractfiledialog.cpp82
-rw-r--r--src/dialogs/qquickabstractfiledialog_p.h14
-rw-r--r--src/dialogs/qquickfiledialog.cpp86
-rw-r--r--src/dialogs/qquickfiledialog_p.h17
4 files changed, 94 insertions, 105 deletions
diff --git a/src/dialogs/qquickabstractfiledialog.cpp b/src/dialogs/qquickabstractfiledialog.cpp
index 233a2db7..26c7218b 100644
--- a/src/dialogs/qquickabstractfiledialog.cpp
+++ b/src/dialogs/qquickabstractfiledialog.cpp
@@ -38,9 +38,10 @@
#include "qquickitem.h"
#include <private/qguiapplication_p.h>
+#include <QQmlEngine>
+#include <QQuickWindow>
#include <QRegularExpression>
#include <QWindow>
-#include <QQuickWindow>
QT_BEGIN_NAMESPACE
@@ -221,4 +222,83 @@ void QQuickAbstractFileDialog::updateModes()
emit fileModeChanged();
}
+void QQuickAbstractFileDialog::addShortcut(const QString &name, const QString &visibleName, const QString &path)
+{
+ QQmlEngine *engine = qmlEngine(this);
+ QUrl url = QUrl::fromLocalFile(path);
+
+ // Since the app can have bindings to the shortcut, we always add it
+ // to the public API, even if the directory doesn't (yet) exist.
+ m_shortcuts.setProperty(name, url.toString());
+
+ // ...but we are more strict about showing it as a clickable link inside the dialog
+ if (visibleName.isEmpty() || !QDir(path).exists())
+ return;
+
+ QJSValue o = engine->newObject();
+ o.setProperty("name", visibleName);
+ // TODO maybe some day QJSValue could directly store a QUrl
+ o.setProperty("url", url.toString());
+
+ int length = m_shortcutDetails.property(QLatin1String("length")).toInt();
+ m_shortcutDetails.setProperty(length, o);
+}
+
+void QQuickAbstractFileDialog::addShortcutFromStandardLocation(const QString &name, QStandardPaths::StandardLocation loc, bool local)
+{
+ if (m_selectExisting) {
+ QStringList readPaths = QStandardPaths::standardLocations(loc);
+ QString path = readPaths.isEmpty() ? QString() : local ? readPaths.first() : readPaths.last();
+ addShortcut(name, QStandardPaths::displayName(loc), path);
+ } else {
+ QString path = QStandardPaths::writableLocation(loc);
+ addShortcut(name, QStandardPaths::displayName(loc), path);
+ }
+}
+
+void QQuickAbstractFileDialog::populateShortcuts()
+{
+ QJSEngine *engine = qmlEngine(this);
+ m_shortcutDetails = engine->newArray();
+ m_shortcuts = engine->newObject();
+
+ addShortcutFromStandardLocation(QLatin1String("desktop"), QStandardPaths::DesktopLocation);
+ addShortcutFromStandardLocation(QLatin1String("documents"), QStandardPaths::DocumentsLocation);
+ addShortcutFromStandardLocation(QLatin1String("music"), QStandardPaths::MusicLocation);
+ addShortcutFromStandardLocation(QLatin1String("movies"), QStandardPaths::MoviesLocation);
+ addShortcutFromStandardLocation(QLatin1String("home"), QStandardPaths::HomeLocation);
+
+#ifndef Q_OS_IOS
+ addShortcutFromStandardLocation(QLatin1String("pictures"), QStandardPaths::PicturesLocation);
+#else
+ // On iOS we point pictures to the system picture folder when loading
+ addShortcutFromStandardLocation(QLatin1String("pictures"), QStandardPaths::PicturesLocation, !m_selectExisting);
+#endif
+
+#ifndef Q_OS_IOS
+ // on iOS, this returns only "/", which is never a useful path to read or write anything
+ QFileInfoList drives = QDir::drives();
+ foreach (QFileInfo fi, drives)
+ addShortcut(fi.absoluteFilePath(), fi.absoluteFilePath(), fi.absoluteFilePath());
+#endif
+
+ emit shortcutsChanged();
+}
+
+QJSValue QQuickAbstractFileDialog::shortcuts()
+{
+ if (m_shortcuts.isUndefined())
+ populateShortcuts();
+
+ return m_shortcuts;
+}
+
+QJSValue QQuickAbstractFileDialog::__shortcuts()
+{
+ if (m_shortcutDetails.isUndefined())
+ populateShortcuts();
+
+ return m_shortcutDetails;
+}
+
QT_END_NAMESPACE
diff --git a/src/dialogs/qquickabstractfiledialog_p.h b/src/dialogs/qquickabstractfiledialog_p.h
index 9275c1da..8f094783 100644
--- a/src/dialogs/qquickabstractfiledialog_p.h
+++ b/src/dialogs/qquickabstractfiledialog_p.h
@@ -48,6 +48,8 @@
// We mean it.
//
+#include <QJSValue>
+#include <QStandardPaths>
#include <QQuickView>
#include <QtGui/qpa/qplatformdialoghelper.h>
#include <qpa/qplatformtheme.h>
@@ -69,6 +71,8 @@ class QQuickAbstractFileDialog : public QQuickAbstractDialog
Q_PROPERTY(QUrl fileUrl READ fileUrl NOTIFY selectionAccepted)
Q_PROPERTY(QList<QUrl> fileUrls READ fileUrls NOTIFY selectionAccepted)
Q_PROPERTY(bool sidebarVisible READ sidebarVisible WRITE setSidebarVisible NOTIFY sidebarVisibleChanged)
+ Q_PROPERTY(QJSValue shortcuts READ shortcuts NOTIFY shortcutsChanged) // map of QStandardDirectory names to QUrls
+ Q_PROPERTY(QJSValue __shortcuts READ __shortcuts NOTIFY shortcutsChanged) // map of details for QML dialog implementations
public:
QQuickAbstractFileDialog(QObject *parent = 0);
@@ -86,6 +90,8 @@ public:
QUrl fileUrl() const;
virtual QList<QUrl> fileUrls() const = 0;
bool sidebarVisible() const { return m_sidebarVisible; }
+ QJSValue shortcuts();
+ QJSValue __shortcuts();
public Q_SLOTS:
void setVisible(bool v);
@@ -106,13 +112,19 @@ Q_SIGNALS:
void fileModeChanged();
void selectionAccepted();
void sidebarVisibleChanged();
+ void shortcutsChanged();
protected:
- virtual void updateModes();
+ void updateModes();
+ void addShortcut(const QString &name, const QString &visibleName, const QString &path);
+ void addShortcutFromStandardLocation(const QString &name, QStandardPaths::StandardLocation loc, bool local = true);
+ void populateShortcuts();
protected:
QPlatformFileDialogHelper *m_dlgHelper;
QSharedPointer<QFileDialogOptions> m_options;
+ QJSValue m_shortcuts;
+ QJSValue m_shortcutDetails;
bool m_selectExisting;
bool m_selectMultiple;
bool m_selectFolder;
diff --git a/src/dialogs/qquickfiledialog.cpp b/src/dialogs/qquickfiledialog.cpp
index 6fb15314..65507260 100644
--- a/src/dialogs/qquickfiledialog.cpp
+++ b/src/dialogs/qquickfiledialog.cpp
@@ -39,7 +39,6 @@
#include <QQmlEngine>
#include <QJSValueIterator>
#include <private/qguiapplication_p.h>
-#include <private/qv4object_p.h>
QT_BEGIN_NAMESPACE
@@ -116,91 +115,6 @@ QList<QUrl> QQuickFileDialog::fileUrls() const
return m_selections;
}
-void QQuickFileDialog::addShortcut(const QString &name, const QString &visibleName, const QString &path)
-{
- QJSEngine *engine = qmlEngine(this);
- QUrl url = QUrl::fromLocalFile(path);
-
- // Since the app can have bindings to the shortcut, we always add it
- // to the public API, even if the directory doesn't (yet) exist.
- m_shortcuts.setProperty(name, url.toString());
-
- // ...but we are more strict about showing it as a clickable link inside the dialog
- if (visibleName.isEmpty() || !QDir(path).exists())
- return;
-
- QJSValue o = engine->newObject();
- o.setProperty("name", visibleName);
- // TODO maybe some day QJSValue could directly store a QUrl
- o.setProperty("url", url.toString());
-
- int length = m_shortcutDetails.property(QLatin1String("length")).toInt();
- m_shortcutDetails.setProperty(length, o);
-}
-
-void QQuickFileDialog::addShortcutFromStandardLocation(const QString &name, QStandardPaths::StandardLocation loc, bool local)
-{
- if (m_selectExisting) {
- QStringList readPaths = QStandardPaths::standardLocations(loc);
- QString path = readPaths.isEmpty() ? QString() : local ? readPaths.first() : readPaths.last();
- addShortcut(name, QStandardPaths::displayName(loc), path);
- } else {
- QString path = QStandardPaths::writableLocation(loc);
- addShortcut(name, QStandardPaths::displayName(loc), path);
- }
-}
-
-void QQuickFileDialog::populateShortcuts()
-{
- QJSEngine *engine = qmlEngine(this);
- m_shortcutDetails = engine->newArray();
- m_shortcuts = engine->newObject();
-
- addShortcutFromStandardLocation(QLatin1String("desktop"), QStandardPaths::DesktopLocation);
- addShortcutFromStandardLocation(QLatin1String("documents"), QStandardPaths::DocumentsLocation);
- addShortcutFromStandardLocation(QLatin1String("music"), QStandardPaths::MusicLocation);
- addShortcutFromStandardLocation(QLatin1String("movies"), QStandardPaths::MoviesLocation);
- addShortcutFromStandardLocation(QLatin1String("home"), QStandardPaths::HomeLocation);
-
-#ifndef Q_OS_IOS
- addShortcutFromStandardLocation(QLatin1String("pictures"), QStandardPaths::PicturesLocation);
-#else
- // On iOS we point pictures to the system picture folder when loading
- addShortcutFromStandardLocation(QLatin1String("pictures"), QStandardPaths::PicturesLocation, !m_selectExisting);
-#endif
-
-#ifndef Q_OS_IOS
- // on iOS, this returns only "/", which is never a useful path to read or write anything
- QFileInfoList drives = QDir::drives();
- foreach (QFileInfo fi, drives)
- addShortcut(fi.absoluteFilePath(), fi.absoluteFilePath(), fi.absoluteFilePath());
-#endif
-
- emit shortcutsChanged();
-}
-
-void QQuickFileDialog::updateModes()
-{
- QQuickAbstractFileDialog::updateModes();
- populateShortcuts();
-}
-
-QJSValue QQuickFileDialog::shortcuts()
-{
- if (m_shortcuts.isUndefined())
- populateShortcuts();
-
- return m_shortcuts;
-}
-
-QJSValue QQuickFileDialog::__shortcuts()
-{
- if (m_shortcutDetails.isUndefined())
- populateShortcuts();
-
- return m_shortcutDetails;
-}
-
/*!
\qmlproperty bool AbstractFileDialog::visible
diff --git a/src/dialogs/qquickfiledialog_p.h b/src/dialogs/qquickfiledialog_p.h
index 1dd65531..b621fed5 100644
--- a/src/dialogs/qquickfiledialog_p.h
+++ b/src/dialogs/qquickfiledialog_p.h
@@ -49,8 +49,6 @@
//
#include "qquickabstractfiledialog_p.h"
-#include <QJSValue>
-#include <QStandardPaths>
QT_BEGIN_NAMESPACE
@@ -58,8 +56,6 @@ class QQuickFileDialog : public QQuickAbstractFileDialog
{
Q_OBJECT
Q_PROPERTY(QQuickItem* contentItem READ contentItem WRITE setContentItem DESIGNABLE false)
- Q_PROPERTY(QJSValue shortcuts READ shortcuts NOTIFY shortcutsChanged) // map of QStandardDirectory names to QUrls
- Q_PROPERTY(QJSValue __shortcuts READ __shortcuts NOTIFY shortcutsChanged) // map of details for QML dialog implementations
Q_CLASSINFO("DefaultProperty", "contentItem") // AbstractFileDialog in QML can have only one child
public:
@@ -67,12 +63,6 @@ public:
~QQuickFileDialog();
virtual QList<QUrl> fileUrls() const Q_DECL_OVERRIDE;
- QJSValue shortcuts();
- QJSValue __shortcuts();
-
-Q_SIGNALS:
- void shortcutsChanged();
-
public Q_SLOTS:
void clearSelection();
bool addSelection(const QUrl &path);
@@ -83,17 +73,10 @@ protected:
Q_INVOKABLE QUrl pathToUrl(const QString &path) { return QUrl::fromLocalFile(path); }
Q_INVOKABLE QUrl pathFolder(const QString &path);
- void addShortcut(const QString &name, const QString &visibleName, const QString &path);
- void addShortcutFromStandardLocation(const QString &name, QStandardPaths::StandardLocation loc, bool local = true);
- void populateShortcuts();
- void updateModes() Q_DECL_OVERRIDE;
-
private:
QList<QUrl> m_selections;
Q_DISABLE_COPY(QQuickFileDialog)
- QJSValue m_shortcuts;
- QJSValue m_shortcutDetails;
};
QT_END_NAMESPACE