diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/controls/MenuBar.qml | 2 | ||||
-rw-r--r-- | src/controls/Private/MenuContentItem.qml | 6 | ||||
-rw-r--r-- | src/controls/qquickpopupwindow.cpp | 1 | ||||
-rw-r--r-- | src/dialogs/DefaultFileDialog.qml | 44 | ||||
-rw-r--r-- | src/dialogs/qquickabstractfiledialog.cpp | 82 | ||||
-rw-r--r-- | src/dialogs/qquickabstractfiledialog_p.h | 14 | ||||
-rw-r--r-- | src/dialogs/qquickfiledialog.cpp | 86 | ||||
-rw-r--r-- | src/dialogs/qquickfiledialog_p.h | 17 |
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 |