From 5248922e0e3ce4b0977b989f71c7584ed5539a9a Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 16 Feb 2023 16:57:34 +0200 Subject: [PATCH] QmlDesigner: Focus the content widget of the dock when focusing tab When DockWidgetTab or DockWidget is focused, typically user actually wants to focus the content widget, so we now do that. Focusing content widget is done asynchronously to avoid complications from doing another setFocus in middle of setFocus handling. Fixes: QDS-9104 Change-Id: I569639c2f36f0721aafcdcab3498c875e98993a9 Reviewed-by: Thomas Hartmann Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Bot Reviewed-by: --- .../materialBrowserQmlSource/MaterialBrowser.qml | 1 + src/libs/advanceddockingsystem/dockfocuscontroller.cpp | 8 ++++++++ .../components/materialbrowser/materialbrowserwidget.cpp | 2 ++ .../qmldesigner/components/navigator/navigatorwidget.cpp | 2 ++ 4 files changed, 13 insertions(+) diff --git a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml index c702b445686..c749ee03f51 100644 --- a/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml +++ b/share/qtcreator/qmldesigner/materialBrowserQmlSource/MaterialBrowser.qml @@ -9,6 +9,7 @@ import StudioTheme 1.0 as StudioTheme Item { id: root + focus: true readonly property int cellWidth: 100 readonly property int cellHeight: 120 diff --git a/src/libs/advanceddockingsystem/dockfocuscontroller.cpp b/src/libs/advanceddockingsystem/dockfocuscontroller.cpp index 79b6c6cad29..c0c632cb989 100644 --- a/src/libs/advanceddockingsystem/dockfocuscontroller.cpp +++ b/src/libs/advanceddockingsystem/dockfocuscontroller.cpp @@ -162,6 +162,8 @@ namespace ADS if (!dockWidget) dockWidget = qobject_cast(focusedNow); + bool focusActual = dockWidget && dockWidget->widget(); + if (!dockWidget) dockWidget = internal::findParent(focusedNow); @@ -174,6 +176,12 @@ namespace ADS #endif d->updateDockWidgetFocus(dockWidget); + + if (focusActual) { + // Do this async to avoid issues when changing focus in middle of another focus handling + QMetaObject::invokeMethod(dockWidget->widget(), QOverload<>::of(&QWidget::setFocus), + Qt::QueuedConnection); + } } void DockFocusController::setDockWidgetFocused(DockWidget *focusedNow) diff --git a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp index 682d12fc1be..76944eeb225 100644 --- a/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp +++ b/src/plugins/qmldesigner/components/materialbrowser/materialbrowserwidget.cpp @@ -207,6 +207,8 @@ MaterialBrowserWidget::MaterialBrowserWidget(AsynchronousImageCache &imageCache, QmlDesignerPlugin::trackWidgetFocusTime(this, Constants::EVENT_MATERIALBROWSER_TIME); reloadQmlSource(); + + setFocusProxy(m_quickWidget.data()); } void MaterialBrowserWidget::updateMaterialPreview(const ModelNode &node, const QPixmap &pixmap) diff --git a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp index fb161a26b03..30d58bac76f 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp @@ -66,6 +66,8 @@ NavigatorWidget::NavigatorWidget(NavigatorView *view) setStyleSheet(Theme::replaceCssColors(QString::fromUtf8(sheet))); QmlDesignerPlugin::trackWidgetFocusTime(this, Constants::EVENT_NAVIGATORVIEW_TIME); + + setFocusProxy(m_treeView); } void NavigatorWidget::setTreeModel(QAbstractItemModel *model)