summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dialogs/DefaultFileDialog.qml10
-rw-r--r--src/dialogs/qquickfiledialog.cpp73
-rw-r--r--src/dialogs/qquickfiledialog_p.h10
3 files changed, 62 insertions, 31 deletions
diff --git a/src/dialogs/DefaultFileDialog.qml b/src/dialogs/DefaultFileDialog.qml
index db4d74bf1..0336695a0 100644
--- a/src/dialogs/DefaultFileDialog.qml
+++ b/src/dialogs/DefaultFileDialog.qml
@@ -73,7 +73,7 @@ AbstractFileDialog {
property alias width: root.width
property alias height: root.height
property alias sidebarWidth: sidebar.width
- property alias sidebarSplit: shortcuts.height
+ property alias sidebarSplit: shortcutsScroll.height
property alias sidebarVisible: root.sidebarVisible
property variant favoriteFolders: []
}
@@ -169,7 +169,7 @@ AbstractFileDialog {
height: parent.height - favoritesButtons.height
ScrollView {
- id: shortcuts
+ id: shortcutsScroll
Component.onCompleted: {
if (height < 1)
height = sidebarSplitter.rowHeight * 4.65
@@ -178,7 +178,7 @@ AbstractFileDialog {
height: 0 // initial width only; settings and onCompleted will override it
ListView {
id: shortcutsView
- model: root.shortcuts
+ model: __shortcuts.length
anchors.bottomMargin: ControlsPrivate.Settings.hasTouchScreen ? Screen.pixelDensity * 3.5 : anchors.margins
implicitHeight: model.count * sidebarSplitter.rowHeight
delegate: Item {
@@ -187,7 +187,7 @@ AbstractFileDialog {
height: shortcutLabel.implicitHeight * 1.5
Text {
id: shortcutLabel
- text: shortcutsView.model[index]["name"]
+ text: __shortcuts[Object.keys(__shortcuts)[index]].name
anchors {
verticalCenter: parent.verticalCenter
left: parent.left
@@ -204,7 +204,7 @@ AbstractFileDialog {
}
MouseArea {
anchors.fill: parent
- onClicked: root.folder = shortcutsView.model[index]["url"]
+ onClicked: root.folder = __shortcuts[Object.keys(__shortcuts)[index]].url
}
}
}
diff --git a/src/dialogs/qquickfiledialog.cpp b/src/dialogs/qquickfiledialog.cpp
index 384642dd0..f2325a530 100644
--- a/src/dialogs/qquickfiledialog.cpp
+++ b/src/dialogs/qquickfiledialog.cpp
@@ -37,6 +37,7 @@
#include "qquickfiledialog_p.h"
#include <QQuickItem>
#include <QQmlEngine>
+#include <QJSValueIterator>
#include <private/qguiapplication_p.h>
#include <private/qv4object_p.h>
@@ -111,44 +112,70 @@ QList<QUrl> QQuickFileDialog::fileUrls() const
return m_selections;
}
-
-void QQuickFileDialog::addShortcut(int &i, const QString &name, const QString &path)
+void QQuickFileDialog::addShortcut(uint &i, const QString &name, const QString &visibleName, const QString &path)
{
QJSEngine *engine = qmlEngine(this);
+ QUrl url = QUrl::fromLocalFile(path);
QJSValue o = engine->newObject();
- o.setProperty("name", name);
- o.setProperty("url", QUrl::fromLocalFile(path).toString());
- m_shortcuts.setProperty(i++, o);
+ o.setProperty("name", visibleName);
+ // TODO maybe some day QJSValue could directly store a QUrl
+ o.setProperty("url", url.toString());
+ m_shortcutDetails.setProperty(name, o);
+ m_shortcuts.setProperty(name, url.toString());
+ ++i;
}
-void QQuickFileDialog::addIfReadable(int &i, const QString &name, QStandardPaths::StandardLocation loc)
+void QQuickFileDialog::addIfReadable(uint &i, const QString &name, const QString &visibleName, QStandardPaths::StandardLocation loc)
{
QStringList paths = QStandardPaths::standardLocations(loc);
if (!paths.isEmpty() && QDir(paths.first()).isReadable())
- addShortcut(i, name, paths.first());
+ addShortcut(i, name, visibleName, paths.first());
+}
+
+void QQuickFileDialog::populateShortcuts()
+{
+ QJSEngine *engine = qmlEngine(this);
+ m_shortcutDetails = engine->newObject();
+ m_shortcuts = engine->newObject();
+ uint i = 0;
+
+ addIfReadable(i, QLatin1String("desktop"), QStandardPaths::displayName(QStandardPaths::DesktopLocation), QStandardPaths::DesktopLocation);
+ addIfReadable(i, QLatin1String("documents"), QStandardPaths::displayName(QStandardPaths::DocumentsLocation), QStandardPaths::DocumentsLocation);
+ addIfReadable(i, QLatin1String("music"), QStandardPaths::displayName(QStandardPaths::MusicLocation), QStandardPaths::MusicLocation);
+ addIfReadable(i, QLatin1String("movies"), QStandardPaths::displayName(QStandardPaths::MoviesLocation), QStandardPaths::MoviesLocation);
+ addIfReadable(i, QLatin1String("pictures"), QStandardPaths::displayName(QStandardPaths::PicturesLocation), QStandardPaths::PicturesLocation);
+ addIfReadable(i, QLatin1String("home"), QStandardPaths::displayName(QStandardPaths::HomeLocation), QStandardPaths::HomeLocation);
+
+#ifdef Q_OS_IOS
+ // PicturesLocation is a special URL, which we cannot check with QDir::isReadable()
+ addShortcut(i, QLatin1String("pictures"), tr("Pictures"),
+ QStandardPaths::standardLocations(QStandardPaths::PicturesLocation).last());
+#else
+ // 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(i, fi.absoluteFilePath(), fi.absoluteFilePath(), fi.absoluteFilePath());
+#endif
+
+ m_shortcutDetails.setProperty(QLatin1String("length"), i);
}
QJSValue QQuickFileDialog::shortcuts()
{
- if (m_shortcuts.isUndefined()) {
- QJSEngine *engine = qmlEngine(this);
- m_shortcuts = engine->newArray();
- int i = 0;
-
- addIfReadable(i, "Desktop", QStandardPaths::DesktopLocation);
- addIfReadable(i, "Documents", QStandardPaths::DocumentsLocation);
- addIfReadable(i, "Music", QStandardPaths::MusicLocation);
- addIfReadable(i, "Movies", QStandardPaths::MoviesLocation);
- addIfReadable(i, "Pictures", QStandardPaths::PicturesLocation);
- addIfReadable(i, "Home", QStandardPaths::HomeLocation);
-
- QFileInfoList drives = QDir::drives();
- foreach (QFileInfo fi, drives)
- addShortcut(i, fi.absoluteFilePath(), fi.absoluteFilePath());
- }
+ 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 90eeb2cef..c0ad09a39 100644
--- a/src/dialogs/qquickfiledialog_p.h
+++ b/src/dialogs/qquickfiledialog_p.h
@@ -58,7 +58,8 @@ class QQuickFileDialog : public QQuickAbstractFileDialog
{
Q_OBJECT
Q_PROPERTY(QQuickItem* contentItem READ contentItem WRITE setContentItem DESIGNABLE false)
- Q_PROPERTY(QJSValue shortcuts READ shortcuts CONSTANT)
+ Q_PROPERTY(QJSValue shortcuts READ shortcuts CONSTANT) // map of QStandardDirectory names to QUrls
+ Q_PROPERTY(QJSValue __shortcuts READ __shortcuts CONSTANT) // map of details for QML dialog implementations
Q_CLASSINFO("DefaultProperty", "contentItem") // AbstractFileDialog in QML can have only one child
public:
@@ -67,6 +68,7 @@ public:
virtual QList<QUrl> fileUrls() const;
QJSValue shortcuts();
+ QJSValue __shortcuts();
Q_SIGNALS:
@@ -80,14 +82,16 @@ protected:
Q_INVOKABLE QUrl pathToUrl(const QString &path) { return QUrl::fromLocalFile(path); }
Q_INVOKABLE QUrl pathFolder(const QString &path);
- void addShortcut(int &i, const QString &name, const QString &path);
- void addIfReadable(int &i, const QString &name, QStandardPaths::StandardLocation loc);
+ void addShortcut(uint &i, const QString &name, const QString &visibleName, const QString &path);
+ void addIfReadable(uint &i, const QString &name, const QString &visibleName, QStandardPaths::StandardLocation loc);
+ void populateShortcuts();
private:
QList<QUrl> m_selections;
Q_DISABLE_COPY(QQuickFileDialog)
QJSValue m_shortcuts;
+ QJSValue m_shortcutDetails;
};
QT_END_NAMESPACE