diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-12-19 18:36:15 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2024-01-11 10:00:30 +0100 |
commit | b27c8730175db14abb539dc949010ba90768a6de (patch) | |
tree | e2e098bcff317752a1de6eb877904c31e5e27dbb | |
parent | c303ee98a8728de26067f8cfe6897c4fcccb5427 (diff) |
Qt Designer: Start where mouse cursor is in Top Level mode
Task-number: QTBUG-120236
Pick-to: 6.7 6.6
Change-Id: I0471794c0250484cfd15772d1c6bbeab201ef4e2
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
-rw-r--r-- | src/designer/src/designer/qdesigner_workbench.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/designer/src/designer/qdesigner_workbench.cpp b/src/designer/src/designer/qdesigner_workbench.cpp index df867060a..870eee753 100644 --- a/src/designer/src/designer/qdesigner_workbench.cpp +++ b/src/designer/src/designer/qdesigner_workbench.cpp @@ -34,6 +34,7 @@ #include <QtWidgets/qlayout.h> #include <QtGui/qactiongroup.h> +#include <QtGui/qcursor.h> #include <QtGui/qevent.h> #include <QtGui/qscreen.h> #include <QtGui/qwindow.h> @@ -444,6 +445,15 @@ void QDesignerWorkbench::adjustMDIFormPositions() } } +static QScreen *screenUnderMouse() +{ + const auto &screens = QGuiApplication::screens(); + const auto pos = QCursor::pos(); + auto pred = [pos](const QScreen *s) { return s->geometry().contains(pos); }; + auto it = std::find_if(screens.cbegin(), screens.cend(), pred); + return it != screens.cend() ? *it : QGuiApplication::primaryScreen(); +} + void QDesignerWorkbench::switchToTopLevelMode() { if (m_mode == TopLevelMode) @@ -455,7 +465,10 @@ void QDesignerWorkbench::switchToTopLevelMode() switchToNeutralMode(); m_mode = TopLevelMode; // Set new mode before calling screen() - const auto *currentScreen = screen(); + const QDesignerSettings settings(m_core); + const QByteArray mainWindowState = settings.mainWindowState(m_mode); + // Open on screen where the mouse is when no settings exist + const auto *currentScreen = mainWindowState.isEmpty() ? screenUnderMouse() : screen(); const QRect availableGeometry = currentScreen->availableGeometry(); const QPoint desktopOffset = availableGeometry.topLeft(); @@ -478,7 +491,6 @@ void QDesignerWorkbench::switchToTopLevelMode() widgetBoxWrapper->setWindowTitle(MainWindowBase::mainWindowTitle()); #endif // !Q_OS_MACOS - const QDesignerSettings settings(m_core); m_topLevelData.toolbars = MainWindowBase::createToolBars(m_actionManager, false); m_topLevelData.toolbarManager = new ToolBarManager(widgetBoxWrapper, widgetBoxWrapper, m_toolbarMenu, m_actionManager, @@ -490,7 +502,7 @@ void QDesignerWorkbench::switchToTopLevelMode() widgetBoxWrapper->insertToolBarBreak(m_topLevelData.toolbars.at(i)); } m_topLevelData.toolbarManager->restoreState(settings.toolBarsState(m_mode), MainWindowBase::settingsVersion()); - widgetBoxWrapper->restoreState(settings.mainWindowState(m_mode), MainWindowBase::settingsVersion()); + widgetBoxWrapper->restoreState(mainWindowState, MainWindowBase::settingsVersion()); bool found_visible_window = false; for (QDesignerToolWindow *tw : std::as_const(m_toolWindows)) { |