summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2023-12-20 10:38:30 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-01-11 20:39:25 +0000
commit434963523541f1b31ed1f953fceb403a2822cdfa (patch)
tree8856c1c28f2b0b3c251823057c5ca4179c44b295
parentb86adfb978e1e2b38712e27f7e93d4c18916f1f2 (diff)
Qt Designer: Fix mode switching position logic for multiple screens
The logic tries to maintain the relative form positions when switching from top level to docked, but used the primary screen as a reference point. This caused the forms to be out of the docked area when on a secondary screen. To fix this, use the widget's screen to calculate the position. Task-number: QTBUG-120236 Change-Id: I51856cdedd6a3f2c2ec73d94c0f726c04caaabca Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io> (cherry picked from commit 0c376fd83a8a9c0853d50753ee677fd40235d208) (cherry picked from commit 5a9c4ee7d0d2cff1b868b39ca90d02ca8745111a) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/designer/src/designer/qdesigner_workbench.cpp18
-rw-r--r--src/designer/src/designer/qdesigner_workbench.h6
2 files changed, 11 insertions, 13 deletions
diff --git a/src/designer/src/designer/qdesigner_workbench.cpp b/src/designer/src/designer/qdesigner_workbench.cpp
index 03ce2c96c..f66e27856 100644
--- a/src/designer/src/designer/qdesigner_workbench.cpp
+++ b/src/designer/src/designer/qdesigner_workbench.cpp
@@ -73,9 +73,9 @@ static QDockWidget *dockWidgetOf(const QWidget *w)
}
// ------------ QDesignerWorkbench::Position
-QDesignerWorkbench::Position::Position(const QMdiSubWindow *mdiSubWindow, const QPoint &mdiAreaOffset) :
+QDesignerWorkbench::Position::Position(const QMdiSubWindow *mdiSubWindow) :
m_minimized(mdiSubWindow->isShaded()),
- m_position(mdiSubWindow->pos() + mdiAreaOffset)
+ m_position(mdiSubWindow->pos() + mdiSubWindow->mdiArea()->pos())
{
}
@@ -85,12 +85,12 @@ QDesignerWorkbench::Position::Position(const QDockWidget *dockWidget) :
{
}
-QDesignerWorkbench::Position::Position(const QWidget *topLevelWindow, const QPoint &desktopTopLeft)
+QDesignerWorkbench::Position::Position(const QWidget *topLevelWindow)
{
- const QWidget *window =topLevelWindow->window ();
+ const QWidget *window = topLevelWindow->window();
Q_ASSERT(window);
m_minimized = window->isMinimized();
- m_position = window->pos() - desktopTopLeft;
+ m_position = window->pos() - window->screen()->availableGeometry().topLeft();
}
void QDesignerWorkbench::Position::applyTo(QMdiSubWindow *mdiSubWindow,
@@ -247,19 +247,17 @@ void QDesignerWorkbench::saveGeometriesForModeChange()
case NeutralMode:
break;
case TopLevelMode: {
- const QPoint desktopOffset = QGuiApplication::primaryScreen()->availableGeometry().topLeft();
for (QDesignerToolWindow *tw : std::as_const(m_toolWindows))
- m_Positions.insert(tw, Position(tw, desktopOffset));
+ m_Positions.insert(tw, Position(tw));
for (QDesignerFormWindow *fw : std::as_const(m_formWindows))
- m_Positions.insert(fw, Position(fw, desktopOffset));
+ m_Positions.insert(fw, Position(fw));
}
break;
case DockedMode: {
- const QPoint mdiAreaOffset = m_dockedMainWindow->mdiArea()->pos();
for (QDesignerToolWindow *tw : std::as_const(m_toolWindows))
m_Positions.insert(tw, Position(dockWidgetOf(tw)));
for (QDesignerFormWindow *fw : std::as_const(m_formWindows))
- m_Positions.insert(fw, Position(mdiSubWindowOf(fw), mdiAreaOffset));
+ m_Positions.insert(fw, Position(mdiSubWindowOf(fw)));
}
break;
}
diff --git a/src/designer/src/designer/qdesigner_workbench.h b/src/designer/src/designer/qdesigner_workbench.h
index 304ea3254..82f18d0ab 100644
--- a/src/designer/src/designer/qdesigner_workbench.h
+++ b/src/designer/src/designer/qdesigner_workbench.h
@@ -148,9 +148,9 @@ private:
// interface modes.
class Position {
public:
- Position(const QDockWidget *dockWidget);
- Position(const QMdiSubWindow *mdiSubWindow, const QPoint &mdiAreaOffset);
- Position(const QWidget *topLevelWindow, const QPoint &desktopTopLeft);
+ explicit Position(const QDockWidget *dockWidget);
+ explicit Position(const QMdiSubWindow *mdiSubWindow);
+ explicit Position(const QWidget *topLevelWindow);
void applyTo(QMdiSubWindow *mdiSubWindow, const QPoint &mdiAreaOffset) const;
void applyTo(QWidget *topLevelWindow, const QPoint &desktopTopLeft) const;