diff --git a/src/gui/accountsettings.cpp b/src/gui/accountsettings.cpp index 0d5889a6cc9..99b88067b7e 100644 --- a/src/gui/accountsettings.cpp +++ b/src/gui/accountsettings.cpp @@ -71,9 +71,8 @@ AccountSettings::AccountSettings(const AccountStatePtr &accountState, QWidget *p _sortModel = weightedModel; - ui->quickWidget->rootContext()->setContextProperty(QStringLiteral("ctx"), this); ui->quickWidget->engine()->addImageProvider(QStringLiteral("space"), new Spaces::SpaceImageProvider(_accountState->account())); - QmlUtils::initQuickWidget(ui->quickWidget, QUrl(QStringLiteral("qrc:/qt/qml/org/ownCloud/gui/qml/FolderDelegate.qml"))); + QmlUtils::initQuickWidget(ui->quickWidget, QUrl(QStringLiteral("qrc:/qt/qml/org/ownCloud/gui/qml/FolderDelegate.qml")), this); connect(FolderMan::instance(), &FolderMan::folderListChanged, _model, &FolderStatusModel::resetFolders); ui->connectLabel->clear(); diff --git a/src/gui/accountsettings.ui b/src/gui/accountsettings.ui index 825370d407b..2fe4e4ec2c3 100644 --- a/src/gui/accountsettings.ui +++ b/src/gui/accountsettings.ui @@ -144,7 +144,7 @@ - + @@ -156,6 +156,12 @@
QProgressIndicator.h
1 + + OCC::QmlUtils::OCQuickWidget + QWidget +
gui/qmlutils.h
+ 1 +
diff --git a/src/gui/qml/AccountBar.qml b/src/gui/qml/AccountBar.qml index 6caa6a4230a..467f9eae7f2 100644 --- a/src/gui/qml/AccountBar.qml +++ b/src/gui/qml/AccountBar.qml @@ -20,8 +20,25 @@ import org.ownCloud.libsync 1.0 Pane { id: bar + readonly property SettingsDialog settingsDialog: ocContext Accessible.name: qsTr("Navigation bar") + Connections { + target: settingsDialog + + function onFocusFirst() { + if (accountButtons.count === 0) { + addAccountButton.forceActiveFocus(Qt.TabFocusReason); + } else { + accountButtons.itemAt(0).forceActiveFocus(Qt.TabFocusReason); + } + } + + function onFocusLast() { + quitButton.forceActiveFocus(Qt.TabFocusReason); + } + } + RowLayout { anchors.fill: parent diff --git a/src/gui/qml/FolderDelegate.qml b/src/gui/qml/FolderDelegate.qml index 1eebc5cf6ea..2031f584227 100644 --- a/src/gui/qml/FolderDelegate.qml +++ b/src/gui/qml/FolderDelegate.qml @@ -23,11 +23,27 @@ Pane { id: folderSyncPanel // TODO: not cool readonly property real normalSize: 170 - readonly property AccountSettings accountSettings: ctx + readonly property AccountSettings accountSettings: ocContext Accessible.role: Accessible.List Accessible.name: qsTr("Folder Sync") + Connections { + target: accountSettings + + function onFocusFirst() { + listView.currentIndex = 0; + } + + function onFocusLast() { + if (addSyncButton.enabled) { + addSyncButton.forceActiveFocus(Qt.TabFocusReason); + } else { + listView.currentIndex = listView.count - 1; + } + } + } + ColumnLayout { anchors.fill: parent ScrollView { diff --git a/src/gui/qmlutils.cpp b/src/gui/qmlutils.cpp index 66ca88e3d5b..b22f0b719c4 100644 --- a/src/gui/qmlutils.cpp +++ b/src/gui/qmlutils.cpp @@ -17,10 +17,12 @@ #include "resources/resources.h" #include +#include #include -void OCC::QmlUtils::initQuickWidget(QQuickWidget *widget, const QUrl &src) +void OCC::QmlUtils::initQuickWidget(OCQuickWidget *widget, const QUrl &src, QObject *ocContext) { + widget->rootContext()->setContextProperty(QStringLiteral("ocContext"), ocContext); widget->engine()->addImageProvider(QStringLiteral("ownCloud"), new OCC::Resources::CoreImageProvider()); widget->setResizeMode(QQuickWidget::SizeRootObjectToView); widget->setSource(src); @@ -30,4 +32,23 @@ void OCC::QmlUtils::initQuickWidget(QQuickWidget *widget, const QUrl &src) box->exec(); qFatal("A qml error occured %s", qPrintable(QDebug::toString(widget->errors()))); } + + // string based connects as they are provided by OC_DECLARE_WIDGET_FOCUS and not inherited + QObject::connect(widget, SIGNAL(focusFirst()), ocContext, SIGNAL(focusFirst())); + QObject::connect(widget, SIGNAL(focusLast()), ocContext, SIGNAL(focusLast())); +} + +void OCC::QmlUtils::OCQuickWidget::focusInEvent(QFocusEvent *event) +{ + switch (event->reason()) { + case Qt::TabFocusReason: + Q_EMIT focusFirst(); + break; + case Qt::BacktabFocusReason: + Q_EMIT focusLast(); + break; + default: + break; + } + QQuickWidget::focusInEvent(event); } diff --git a/src/gui/qmlutils.h b/src/gui/qmlutils.h index f8965d51e1d..eab4a9f465c 100644 --- a/src/gui/qmlutils.h +++ b/src/gui/qmlutils.h @@ -13,9 +13,8 @@ */ #pragma once +#include - -class QQuickWidget; class QUrl; #define OC_DECLARE_WIDGET_FOCUS \ @@ -29,9 +28,26 @@ public: focusPreviousChild(); \ } \ \ +Q_SIGNALS: \ + void focusFirst(); \ + void focusLast(); \ + \ private: namespace OCC::QmlUtils { +class OCQuickWidget : public QQuickWidget +{ + Q_OBJECT +public: + using QQuickWidget::QQuickWidget; + +Q_SIGNALS: + void focusFirst(); + void focusLast(); + +protected: + void focusInEvent(QFocusEvent *event) override; +}; -void initQuickWidget(QQuickWidget *widget, const QUrl &src); +void initQuickWidget(OCQuickWidget *widget, const QUrl &src, QObject *ocContext); } diff --git a/src/gui/settingsdialog.cpp b/src/gui/settingsdialog.cpp index 14d914ac777..9f2e13c6736 100644 --- a/src/gui/settingsdialog.cpp +++ b/src/gui/settingsdialog.cpp @@ -76,10 +76,9 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent) // People perceive this as a Window, so also make Ctrl+W work addAction(tr("Hide"), Qt::CTRL | Qt::Key_W, this, &SettingsDialog::hide); - _ui->quickWidget->rootContext()->setContextProperty(QStringLiteral("settingsDialog"), this); // TODO: fix sizing _ui->quickWidget->setFixedHeight(minimumHeight() * 0.15); - QmlUtils::initQuickWidget(_ui->quickWidget, QUrl(QStringLiteral("qrc:/qt/qml/org/ownCloud/gui/qml/AccountBar.qml"))); + QmlUtils::initQuickWidget(_ui->quickWidget, QUrl(QStringLiteral("qrc:/qt/qml/org/ownCloud/gui/qml/AccountBar.qml")), this); connect( _ui->quickWidget->engine(), &QQmlEngine::quit, QApplication::instance(), [this] { diff --git a/src/gui/settingsdialog.ui b/src/gui/settingsdialog.ui index 371215c5b86..c337a27f98f 100644 --- a/src/gui/settingsdialog.ui +++ b/src/gui/settingsdialog.ui @@ -44,14 +44,7 @@ 0 - - - - 0 - 0 - - - + @@ -65,9 +58,10 @@ - QQuickWidget + OCC::QmlUtils::OCQuickWidget QWidget -
QtQuickWidgets/QQuickWidget
+
gui/qmlutils.h
+ 1
diff --git a/src/gui/spaces/qml/SpacesView.qml b/src/gui/spaces/qml/SpacesView.qml index 56fdd291716..88a7871d0ce 100644 --- a/src/gui/spaces/qml/SpacesView.qml +++ b/src/gui/spaces/qml/SpacesView.qml @@ -18,12 +18,13 @@ import QtQuick.Layouts import org.ownCloud.gui 1.0 import org.ownCloud.libsync 1.0 +import org.ownCloud.gui.spaces 1.0 Pane { // TODO: not cool readonly property real normalSize: 170 - //property SpacesBrowser spacesBrowser + readonly property SpacesBrowser spacesBrowser: ocContext ScrollView { id: scrollView diff --git a/src/gui/spaces/spacesbrowser.cpp b/src/gui/spaces/spacesbrowser.cpp index 1a0709bd59b..8e50e82238a 100644 --- a/src/gui/spaces/spacesbrowser.cpp +++ b/src/gui/spaces/spacesbrowser.cpp @@ -42,8 +42,7 @@ SpacesBrowser::SpacesBrowser(QWidget *parent) _sortModel->setSortRole(static_cast(SpacesModel::Roles::Priority)); _sortModel->sort(0, Qt::DescendingOrder); - ui->quickWidget->rootContext()->setContextProperty(QStringLiteral("spacesBrowser"), this); - QmlUtils::initQuickWidget(ui->quickWidget, QUrl(QStringLiteral("qrc:/qt/qml/org/ownCloud/gui/spaces/qml/SpacesView.qml"))); + QmlUtils::initQuickWidget(ui->quickWidget, QUrl(QStringLiteral("qrc:/qt/qml/org/ownCloud/gui/spaces/qml/SpacesView.qml")), this); } SpacesBrowser::~SpacesBrowser() diff --git a/src/gui/spaces/spacesbrowser.ui b/src/gui/spaces/spacesbrowser.ui index db67852224b..45077b6ca3b 100644 --- a/src/gui/spaces/spacesbrowser.ui +++ b/src/gui/spaces/spacesbrowser.ui @@ -27,19 +27,16 @@ 0 - - - QQuickWidget::SizeRootObjectToView - - +
- QQuickWidget + OCC::QmlUtils::OCQuickWidget QWidget -
QtQuickWidgets/QQuickWidget
+
gui/qmlutils.h
+ 1