Skip to content

Commit 8867749

Browse files
committed
Fix focusing the first/last item in a qtquickwidget
1 parent af2cdbb commit 8867749

11 files changed

+94
-30
lines changed

src/gui/accountsettings.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,8 @@ AccountSettings::AccountSettings(const AccountStatePtr &accountState, QWidget *p
7171

7272
_sortModel = weightedModel;
7373

74-
ui->quickWidget->rootContext()->setContextProperty(QStringLiteral("ctx"), this);
7574
ui->quickWidget->engine()->addImageProvider(QStringLiteral("space"), new Spaces::SpaceImageProvider(_accountState->account()));
76-
QmlUtils::initQuickWidget(ui->quickWidget, QUrl(QStringLiteral("qrc:/qt/qml/org/ownCloud/gui/qml/FolderDelegate.qml")));
75+
QmlUtils::initQuickWidget(ui->quickWidget, QUrl(QStringLiteral("qrc:/qt/qml/org/ownCloud/gui/qml/FolderDelegate.qml")), this);
7776

7877
connect(FolderMan::instance(), &FolderMan::folderListChanged, _model, &FolderStatusModel::resetFolders);
7978
ui->connectLabel->clear();

src/gui/accountsettings.ui

+7-1
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@
144144
</item>
145145
</layout>
146146
</widget>
147-
<widget class="QQuickWidget" name="quickWidget"/>
147+
<widget class="OCC::QmlUtils::OCQuickWidget" name="quickWidget"/>
148148
</widget>
149149
</item>
150150
</layout>
@@ -156,6 +156,12 @@
156156
<header>QProgressIndicator.h</header>
157157
<container>1</container>
158158
</customwidget>
159+
<customwidget>
160+
<class>OCC::QmlUtils::OCQuickWidget</class>
161+
<extends>QWidget</extends>
162+
<header>gui/qmlutils.h</header>
163+
<container>1</container>
164+
</customwidget>
159165
</customwidgets>
160166
<resources>
161167
<include location="../resources/client.qrc"/>

src/gui/qml/AccountBar.qml

+17
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,25 @@ import org.ownCloud.libsync 1.0
2020

2121
Pane {
2222
id: bar
23+
readonly property SettingsDialog settingsDialog: ocContext
2324
Accessible.name: qsTr("Navigation bar")
2425

26+
Connections {
27+
target: settingsDialog
28+
29+
function onFocusFirst() {
30+
if (accountButtons.count === 0) {
31+
addAccountButton.forceActiveFocus(Qt.TabFocusReason);
32+
} else {
33+
accountButtons.itemAt(0).forceActiveFocus(Qt.TabFocusReason);
34+
}
35+
}
36+
37+
function onFocusLast() {
38+
quitButton.forceActiveFocus(Qt.TabFocusReason);
39+
}
40+
}
41+
2542
RowLayout {
2643
anchors.fill: parent
2744

src/gui/qml/FolderDelegate.qml

+17-1
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,27 @@ Pane {
2323
id: folderSyncPanel
2424
// TODO: not cool
2525
readonly property real normalSize: 170
26-
readonly property AccountSettings accountSettings: ctx
26+
readonly property AccountSettings accountSettings: ocContext
2727

2828
Accessible.role: Accessible.List
2929
Accessible.name: qsTr("Folder Sync")
3030

31+
Connections {
32+
target: accountSettings
33+
34+
function onFocusFirst() {
35+
listView.currentIndex = 0;
36+
}
37+
38+
function onFocusLast() {
39+
if (addSyncButton.enabled) {
40+
addSyncButton.forceActiveFocus(Qt.TabFocusReason);
41+
} else {
42+
listView.currentIndex = listView.count - 1;
43+
}
44+
}
45+
}
46+
3147
ColumnLayout {
3248
anchors.fill: parent
3349
ScrollView {

src/gui/qmlutils.cpp

+22-1
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
#include "resources/resources.h"
1818

1919
#include <QMessageBox>
20+
#include <QQmlContext>
2021
#include <QQuickWidget>
2122

22-
void OCC::QmlUtils::initQuickWidget(QQuickWidget *widget, const QUrl &src)
23+
void OCC::QmlUtils::initQuickWidget(OCQuickWidget *widget, const QUrl &src, QObject *ocContext)
2324
{
25+
widget->rootContext()->setContextProperty(QStringLiteral("ocContext"), ocContext);
2426
widget->engine()->addImageProvider(QStringLiteral("ownCloud"), new OCC::Resources::CoreImageProvider());
2527
widget->setResizeMode(QQuickWidget::SizeRootObjectToView);
2628
widget->setSource(src);
@@ -30,4 +32,23 @@ void OCC::QmlUtils::initQuickWidget(QQuickWidget *widget, const QUrl &src)
3032
box->exec();
3133
qFatal("A qml error occured %s", qPrintable(QDebug::toString(widget->errors())));
3234
}
35+
36+
// string based connects as they are provided by OC_DECLARE_WIDGET_FOCUS and not inherited
37+
QObject::connect(widget, SIGNAL(focusFirst()), ocContext, SIGNAL(focusFirst()));
38+
QObject::connect(widget, SIGNAL(focusLast()), ocContext, SIGNAL(focusLast()));
39+
}
40+
41+
void OCC::QmlUtils::OCQuickWidget::focusInEvent(QFocusEvent *event)
42+
{
43+
switch (event->reason()) {
44+
case Qt::TabFocusReason:
45+
Q_EMIT focusFirst();
46+
break;
47+
case Qt::BacktabFocusReason:
48+
Q_EMIT focusLast();
49+
break;
50+
default:
51+
break;
52+
}
53+
QQuickWidget::focusInEvent(event);
3354
}

src/gui/qmlutils.h

+19-3
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@
1313
*/
1414

1515
#pragma once
16+
#include <QtQuickWidgets/QQuickWidget>
1617

17-
18-
class QQuickWidget;
1918
class QUrl;
2019

2120
#define OC_DECLARE_WIDGET_FOCUS \
@@ -29,9 +28,26 @@ public:
2928
focusPreviousChild(); \
3029
} \
3130
\
31+
Q_SIGNALS: \
32+
void focusFirst(); \
33+
void focusLast(); \
34+
\
3235
private:
3336

3437
namespace OCC::QmlUtils {
38+
class OCQuickWidget : public QQuickWidget
39+
{
40+
Q_OBJECT
41+
public:
42+
using QQuickWidget::QQuickWidget;
43+
44+
Q_SIGNALS:
45+
void focusFirst();
46+
void focusLast();
47+
48+
protected:
49+
void focusInEvent(QFocusEvent *event) override;
50+
};
3551

36-
void initQuickWidget(QQuickWidget *widget, const QUrl &src);
52+
void initQuickWidget(OCQuickWidget *widget, const QUrl &src, QObject *ocContext);
3753
}

src/gui/settingsdialog.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,9 @@ SettingsDialog::SettingsDialog(ownCloudGui *gui, QWidget *parent)
7676
// People perceive this as a Window, so also make Ctrl+W work
7777
addAction(tr("Hide"), Qt::CTRL | Qt::Key_W, this, &SettingsDialog::hide);
7878

79-
_ui->quickWidget->rootContext()->setContextProperty(QStringLiteral("settingsDialog"), this);
8079
// TODO: fix sizing
8180
_ui->quickWidget->setFixedHeight(minimumHeight() * 0.15);
82-
QmlUtils::initQuickWidget(_ui->quickWidget, QUrl(QStringLiteral("qrc:/qt/qml/org/ownCloud/gui/qml/AccountBar.qml")));
81+
QmlUtils::initQuickWidget(_ui->quickWidget, QUrl(QStringLiteral("qrc:/qt/qml/org/ownCloud/gui/qml/AccountBar.qml")), this);
8382
connect(
8483
_ui->quickWidget->engine(), &QQmlEngine::quit, QApplication::instance(),
8584
[this] {

src/gui/settingsdialog.ui

+4-10
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,7 @@
4444
<number>0</number>
4545
</property>
4646
<item>
47-
<widget class="QQuickWidget" name="quickWidget">
48-
<property name="minimumSize">
49-
<size>
50-
<width>0</width>
51-
<height>0</height>
52-
</size>
53-
</property>
54-
</widget>
47+
<widget class="OCC::QmlUtils::OCQuickWidget" name="quickWidget" native="true"/>
5548
</item>
5649
<item>
5750
<widget class="QStackedWidget" name="stack"/>
@@ -65,9 +58,10 @@
6558
</widget>
6659
<customwidgets>
6760
<customwidget>
68-
<class>QQuickWidget</class>
61+
<class>OCC::QmlUtils::OCQuickWidget</class>
6962
<extends>QWidget</extends>
70-
<header location="global">QtQuickWidgets/QQuickWidget</header>
63+
<header>gui/qmlutils.h</header>
64+
<container>1</container>
7165
</customwidget>
7266
</customwidgets>
7367
<resources/>

src/gui/spaces/qml/SpacesView.qml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Pane {
2323
// TODO: not cool
2424
readonly property real normalSize: 170
2525

26-
//property SpacesBrowser spacesBrowser
26+
readonly property SpacesBrowser spacesBrowser: ocContext
2727

2828
ScrollView {
2929
id: scrollView

src/gui/spaces/spacesbrowser.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ SpacesBrowser::SpacesBrowser(QWidget *parent)
4242
_sortModel->setSortRole(static_cast<int>(SpacesModel::Roles::Priority));
4343
_sortModel->sort(0, Qt::DescendingOrder);
4444

45-
ui->quickWidget->rootContext()->setContextProperty(QStringLiteral("spacesBrowser"), this);
46-
QmlUtils::initQuickWidget(ui->quickWidget, QUrl(QStringLiteral("qrc:/qt/qml/org/ownCloud/gui/spaces/qml/SpacesView.qml")));
45+
QmlUtils::initQuickWidget(ui->quickWidget, QUrl(QStringLiteral("qrc:/qt/qml/org/ownCloud/gui/spaces/qml/SpacesView.qml")), this);
4746
}
4847

4948
SpacesBrowser::~SpacesBrowser()

src/gui/spaces/spacesbrowser.ui

+4-7
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,16 @@
2727
<number>0</number>
2828
</property>
2929
<item>
30-
<widget class="QQuickWidget" name="quickWidget">
31-
<property name="resizeMode">
32-
<enum>QQuickWidget::SizeRootObjectToView</enum>
33-
</property>
34-
</widget>
30+
<widget class="OCC::QmlUtils::OCQuickWidget" name="quickWidget" native="true"/>
3531
</item>
3632
</layout>
3733
</widget>
3834
<customwidgets>
3935
<customwidget>
40-
<class>QQuickWidget</class>
36+
<class>OCC::QmlUtils::OCQuickWidget</class>
4137
<extends>QWidget</extends>
42-
<header location="global">QtQuickWidgets/QQuickWidget</header>
38+
<header>gui/qmlutils.h</header>
39+
<container>1</container>
4340
</customwidget>
4441
</customwidgets>
4542
<resources/>

0 commit comments

Comments
 (0)