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 @@
1
+
+ OCC::QmlUtils::OCQuickWidget
+ QWidget
+
+ 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
+
+ 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
+
+ 1