summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@theqtcompany.com>2016-02-15 08:08:50 +0100
committerLiang Qi <liang.qi@theqtcompany.com>2016-02-15 08:08:50 +0100
commitd9445e92d2f4395d1f80185fb43da54f87811298 (patch)
tree5e60cba6d8782dddaf82a4281e8ea065e89714ac
parent93d06fb27d7eae9290db33b6684916a225939f0b (diff)
parentfc9c57cf8b66bafbcaa6957bb22293047aa3d9df (diff)
downloadqtquickcontrols-d9445e92d2f4395d1f80185fb43da54f87811298.tar.gz
Merge remote-tracking branch 'origin/5.6.0' into 5.6
Change-Id: I9eda2b5c68fa993a1aa1316e8b7b8fe3433e6a13
-rw-r--r--src/controls/MenuBar.qml2
-rw-r--r--src/controls/Private/MenuContentItem.qml6
-rw-r--r--src/controls/qquickpopupwindow.cpp1
-rw-r--r--src/dialogs/DefaultFileDialog.qml44
-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
8 files changed, 134 insertions, 118 deletions
diff --git a/src/controls/MenuBar.qml b/src/controls/MenuBar.qml
index a16635ff..cb31ed71 100644
--- a/src/controls/MenuBar.qml
+++ b/src/controls/MenuBar.qml
@@ -247,6 +247,8 @@ MenuBarPrivate {
}
}
+ Keys.forwardTo: d.openedMenuIndex !== -1 ? [root.menus[d.openedMenuIndex].__contentItem] : []
+
Row {
id: row
x: d.style ? d.style.padding.left : 0
diff --git a/src/controls/Private/MenuContentItem.qml b/src/controls/Private/MenuContentItem.qml
index e3be2e44..5a827b61 100644
--- a/src/controls/Private/MenuContentItem.qml
+++ b/src/controls/Private/MenuContentItem.qml
@@ -138,9 +138,13 @@ Loader {
Keys.onRightPressed: {
var item = content.menuItemAt(__menu.__currentIndex)
- if ((event.accepted = (item && item.styleData.type === MenuItemType.Menu))) {
+ if (item && item.styleData.type === MenuItemType.Menu
+ && !item.__menuItem.__popupVisible) {
item.__showSubMenu(true)
item.__menuItem.__currentIndex = 0
+ event.accepted = true
+ } else {
+ event.accepted = false
}
}
diff --git a/src/controls/qquickpopupwindow.cpp b/src/controls/qquickpopupwindow.cpp
index cfab5bd5..88d91137 100644
--- a/src/controls/qquickpopupwindow.cpp
+++ b/src/controls/qquickpopupwindow.cpp
@@ -67,7 +67,6 @@ void QQuickPopupWindow::show()
if (QWindow *tp = transientParent()) {
if (m_parentItem) {
QPointF pos = m_parentItem->mapToItem(m_parentItem->window()->contentItem(), QPointF(posx, posy));
- pos += tp->mapFromGlobal(m_parentItem->window()->mapToGlobal(QPoint()));
posx = pos.x();
posy = pos.y();
}
diff --git a/src/dialogs/DefaultFileDialog.qml b/src/dialogs/DefaultFileDialog.qml
index 4c59381e..02815f17 100644
--- a/src/dialogs/DefaultFileDialog.qml
+++ b/src/dialogs/DefaultFileDialog.qml
@@ -48,10 +48,39 @@ import "qml"
AbstractFileDialog {
id: root
- folder: view.model.folder
+ Component {
+ id: modelComponent
+ FolderListModel {
+ showFiles: !root.selectFolder
+ nameFilters: root.selectedNameFilterExtensions
+ sortField: (view.sortIndicatorColumn === 0 ? FolderListModel.Name :
+ (view.sortIndicatorColumn === 1 ? FolderListModel.Type :
+ (view.sortIndicatorColumn === 2 ? FolderListModel.Size : FolderListModel.LastModified)))
+ sortReversed: view.sortIndicatorOrder === Qt.DescendingOrder
+ }
+ }
onVisibleChanged: {
if (visible) {
+ // If the TableView doesn't have a model yet, create it asynchronously to avoid a UI freeze
+ if (!view.model) {
+ var incubator = modelComponent.incubateObject(null, { })
+ function init(model) {
+ view.model = model
+ model.nameFilters = root.selectedNameFilterExtensions
+ root.folder = model.folder
+ }
+
+ if (incubator.status === Component.Ready) {
+ init(incubator.object)
+ } else {
+ incubator.onStatusChanged = function(status) {
+ if (status === Component.Ready)
+ init(incubator.object)
+ }
+ }
+ }
+
view.needsWidthAdjustment = true
view.selection.clear()
view.focus = true
@@ -59,7 +88,6 @@ AbstractFileDialog {
}
Component.onCompleted: {
- view.model.nameFilters = root.selectedNameFilterExtensions
filterField.currentIndex = root.selectedNameFilterIndex
root.favoriteFolders = settings.favoriteFolders
}
@@ -300,14 +328,7 @@ AbstractFileDialog {
resizeColumnsToContents()
needsWidthAdjustment = false
}
- model: FolderListModel {
- showFiles: !root.selectFolder
- nameFilters: root.selectedNameFilterExtensions
- sortField: (view.sortIndicatorColumn === 0 ? FolderListModel.Name :
- (view.sortIndicatorColumn === 1 ? FolderListModel.Type :
- (view.sortIndicatorColumn === 2 ? FolderListModel.Size : FolderListModel.LastModified)))
- sortReversed: view.sortIndicatorOrder === Qt.DescendingOrder
- }
+ model: null
onActivated: if (view.focus) {
if (view.selection.count > 0 && view.model.isFolder(row)) {
@@ -435,7 +456,8 @@ AbstractFileDialog {
anchors.verticalCenter: parent.verticalCenter
onCurrentTextChanged: {
root.selectNameFilter(currentText)
- view.model.nameFilters = root.selectedNameFilterExtensions
+ if (view.model)
+ view.model.nameFilters = root.selectedNameFilterExtensions
}
}
Button {
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