From 0590da532e3349715b0f35eca930ce3ff5588115 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 21 Mar 2019 10:29:13 +0100 Subject: QDockWidget: Store tab position when undocking Add a field remembering the tab position of the dock widget area to QDockWidgetPrivate and use that when grouping floating docks. Fixes: QTBUG-74242 Change-Id: I2a453080cb39dd4a5491976f1aeca70ae681682a Reviewed-by: Richard Moe Gustavsen --- src/widgets/widgets/qdockwidget.cpp | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) (limited to 'src/widgets/widgets/qdockwidget.cpp') diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp index ba8bd90da6..4041c730b8 100644 --- a/src/widgets/widgets/qdockwidget.cpp +++ b/src/widgets/widgets/qdockwidget.cpp @@ -67,18 +67,21 @@ extern QString qt_setWindowTitle_helperHelper(const QString&, const QWidget*); / // qmainwindow.cpp extern QMainWindowLayout *qt_mainwindow_layout(const QMainWindow *window); -static inline QMainWindowLayout *qt_mainwindow_layout_from_dock(const QDockWidget *dock) +static const QMainWindow *mainwindow_from_dock(const QDockWidget *dock) { - const QWidget *p = dock->parentWidget(); - while (p) { - const QMainWindow *window = qobject_cast(p); - if (window) - return qt_mainwindow_layout(window); - p = p->parentWidget(); + for (const QWidget *p = dock->parentWidget(); p; p = p->parentWidget()) { + if (const QMainWindow *window = qobject_cast(p)) + return window; } return nullptr; } +static inline QMainWindowLayout *qt_mainwindow_layout_from_dock(const QDockWidget *dock) +{ + auto mainWindow = mainwindow_from_dock(dock); + return mainWindow ? qt_mainwindow_layout(mainWindow) : nullptr; +} + static inline bool hasFeature(const QDockWidgetPrivate *priv, QDockWidget::DockWidgetFeature feature) { return (priv->features & feature) == feature; } @@ -839,8 +842,9 @@ void QDockWidgetPrivate::endDrag(bool abort) q->releaseMouse(); if (state->dragging) { - QMainWindowLayout *mwLayout = qt_mainwindow_layout_from_dock(q); - Q_ASSERT(mwLayout != 0); + const QMainWindow *mainWindow = mainwindow_from_dock(q); + Q_ASSERT(mainWindow != nullptr); + QMainWindowLayout *mwLayout = qt_mainwindow_layout(mainWindow); if (abort || !mwLayout->plug(state->widgetItem)) { if (hasFeature(this, QDockWidget::DockWidgetFloatable)) { @@ -861,8 +865,12 @@ void QDockWidgetPrivate::endDrag(bool abort) } else { setResizerActive(false); } - if (q->isFloating()) // Might not be floating when dragging a QDockWidgetGroupWindow + if (q->isFloating()) { // Might not be floating when dragging a QDockWidgetGroupWindow undockedGeometry = q->geometry(); +#if QT_CONFIG(tabwidget) + tabPosition = mwLayout->tabPosition(mainWindow->dockWidgetArea(q)); +#endif + } q->activateWindow(); } else { // The tab was not plugged back in the QMainWindow but the QDockWidget cannot -- cgit v1.2.3