aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.cpp')
-rw-r--r--src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.cpp146
1 files changed, 126 insertions, 20 deletions
diff --git a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.cpp b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.cpp
index 3edcbac0a9..d4acd24da5 100644
--- a/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.cpp
+++ b/src/plugins/qmltooling/qmldbg_preview/qqmlpreviewposition.cpp
@@ -42,14 +42,47 @@
#include <QtGui/qwindow.h>
#include <QtGui/qscreen.h>
#include <QtGui/qguiapplication.h>
+#include <private/qhighdpiscaling_p.h>
QT_BEGIN_NAMESPACE
-static const QSize availableScreenSize(const QPoint &point)
+static QVector<QQmlPreviewPosition::ScreenData> initScreensData()
{
- if (const QScreen *screen = QGuiApplication::screenAt(point))
- return screen->availableGeometry().size();
- return QSize();
+ QVector<QQmlPreviewPosition::ScreenData> screensData;
+
+ for (QScreen *screen : QGuiApplication::screens()) {
+ QQmlPreviewPosition::ScreenData sd{screen->name(), screen->size()};
+ screensData.append(sd);
+ }
+ return screensData;
+}
+
+static QScreen *findScreen(const QString &nameOfScreen)
+{
+ for (QScreen *screen : QGuiApplication::screens()) {
+ if (screen->name() == nameOfScreen)
+ return screen;
+ }
+ return nullptr;
+}
+
+static QDataStream &operator<<(QDataStream &out, const QQmlPreviewPosition::ScreenData &screenData)
+{
+ out << screenData.name;
+ out << screenData.size;
+ return out;
+}
+
+static QDataStream &operator>>(QDataStream &in, QQmlPreviewPosition::ScreenData &screenData)
+{
+ in >> screenData.name;
+ in >> screenData.size;
+ return in;
+}
+
+bool QQmlPreviewPosition::ScreenData::operator==(const QQmlPreviewPosition::ScreenData &other) const
+{
+ return other.size == size && other.name == name;
}
QQmlPreviewPosition::QQmlPreviewPosition()
@@ -62,20 +95,36 @@ QQmlPreviewPosition::QQmlPreviewPosition()
});
}
-void QQmlPreviewPosition::setPosition(const QPoint &point)
+QQmlPreviewPosition::~QQmlPreviewPosition()
+{
+ saveWindowPosition();
+}
+
+void QQmlPreviewPosition::takePosition(QWindow *window, InitializeState state)
{
- m_hasPosition = true;
- m_lastWindowPosition = point;
- m_savePositionTimer.start();
+ Q_ASSERT(window);
+ // only save the position if we already tried to get the last saved position
+ if (m_initializeState == PositionInitialized) {
+ m_hasPosition = true;
+ auto screen = window->screen();
+ auto nativePosition = QHighDpiScaling::mapPositionToNative(window->framePosition(),
+ screen->handle());
+ m_lastWindowPosition = {screen->name(), nativePosition};
+
+ m_savePositionTimer.start();
+ }
+ if (state == InitializePosition)
+ m_initializeState = InitializePosition;
}
void QQmlPreviewPosition::saveWindowPosition()
{
if (m_hasPosition) {
+ const QByteArray positionAsByteArray = fromPositionToByteArray(m_lastWindowPosition);
if (!m_settingsKey.isNull())
- m_settings.setValue(m_settingsKey, m_lastWindowPosition);
+ m_settings.setValue(m_settingsKey, positionAsByteArray);
- m_settings.setValue(QLatin1String("global_lastpostion"), m_lastWindowPosition);
+ m_settings.setValue(QLatin1String("global_lastpostion"), positionAsByteArray);
}
}
@@ -85,29 +134,86 @@ void QQmlPreviewPosition::loadWindowPositionSettings(const QUrl &url)
if (m_settings.contains(m_settingsKey)) {
m_hasPosition = true;
- m_lastWindowPosition = m_settings.value(m_settingsKey).toPoint();
+ readLastPositionFromByteArray(m_settings.value(m_settingsKey).toByteArray());
}
}
void QQmlPreviewPosition::initLastSavedWindowPosition(QWindow *window)
{
- if (m_positionedWindows.contains(window))
- return;
+ Q_ASSERT(window);
+ m_initializeState = PositionInitialized;
+ if (m_currentInitScreensData.isEmpty())
+ m_currentInitScreensData = initScreensData();
+ // if it is the first time we just use the fall back from a last shown qml file
if (!m_hasPosition) {
- // in case there was nothing saved, we do not want to set anything
if (!m_settings.contains(QLatin1String("global_lastpostion")))
return;
- m_lastWindowPosition = m_settings.value(QLatin1String("global_lastpostion")).toPoint();
+ readLastPositionFromByteArray(m_settings.value(QLatin1String("global_lastpostion"))
+ .toByteArray());
}
- if (QGuiApplication::screenAt(m_lastWindowPosition))
- window->setFramePosition(m_lastWindowPosition);
+ setPosition(m_lastWindowPosition, window);
+}
+
+QByteArray QQmlPreviewPosition::fromPositionToByteArray(
+ const QQmlPreviewPosition::Position &position)
+{
+ QByteArray array;
+ QDataStream stream(&array, QIODevice::WriteOnly);
+ stream.setVersion(QDataStream::Qt_5_12);
+
+ const quint16 majorVersion = 1;
+ const quint16 minorVersion = 0;
+
+ stream << majorVersion
+ << minorVersion
+ << m_currentInitScreensData
+ << position.screenName
+ << position.nativePosition;
+ return array;
+}
+
+void QQmlPreviewPosition::readLastPositionFromByteArray(const QByteArray &array)
+{
+ QDataStream stream(array);
+ stream.setVersion(QDataStream::Qt_5_12);
+
+ // no version check for 1.0
+ //const quint16 currentMajorVersion = 1;
+ quint16 majorVersion = 0;
+ quint16 minorVersion = 0;
- m_positionedWindows.append(window);
+ stream >> majorVersion >> minorVersion;
+
+ QVector<ScreenData> initScreensData;
+ stream >> initScreensData;
+
+ if (m_currentInitScreensData != initScreensData)
+ return;
+
+ QString nameOfScreen;
+ stream >> nameOfScreen;
+
+ QScreen *screen = findScreen(nameOfScreen);
+ if (!screen)
+ return;
+
+ QPoint nativePosition;
+ stream >> nativePosition;
+ if (nativePosition.isNull())
+ return;
+ m_lastWindowPosition = {nameOfScreen, nativePosition};
}
-const QSize QQmlPreviewPosition::currentScreenSize(QWindow *window)
+void QQmlPreviewPosition::setPosition(const QQmlPreviewPosition::Position &position,
+ QWindow *window)
{
- return availableScreenSize(window->position());
+ if (position.nativePosition.isNull())
+ return;
+ if (QScreen *screen = findScreen(position.screenName)) {
+ window->setScreen(screen);
+ window->setFramePosition(QHighDpiScaling::mapPositionFromNative(position.nativePosition,
+ screen->handle()));
+ }
}
QT_END_NAMESPACE