From 45d9fec1fa6ab408656648a59d8d28ed9c5565e4 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. (cherry picked from commit ce3d4b6a59b620d066f0e764634de54131921f8b) Fixes: QDS-9104 Change-Id: I569639c2f36f0721aafcdcab3498c875e98993a9 Reviewed-by: Thomas Hartmann Reviewed-by: Miikka Heikkinen Reviewed-by: Tim Jenssen --- .../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)