summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2023-12-20 10:38:30 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2024-01-11 21:06:31 +0100
commit5a9c4ee7d0d2cff1b868b39ca90d02ca8745111a (patch)
tree4ba9d7cb1a93295d436d6913a3de9e01c3f230ac
parentddde0ac7854740670d61ac3a08056ed29bd5a3f6 (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 Pick-to: 6.6 Change-Id: I51856cdedd6a3f2c2ec73d94c0f726c04caaabca Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io> (cherry picked from commit 0c376fd83a8a9c0853d50753ee677fd40235d208)
-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 870eee753..8a6ae3c80 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 8c60df9dc..171c5b6fe 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;