6#include <QtCore/qiodevice.h>
7#include <QtGui/qwindow.h>
8#include <QtGui/qscreen.h>
9#include <QtGui/qguiapplication.h>
10#include <QtCore/QIODevice>
11#include <private/qhighdpiscaling_p.h>
17 QVector<QQmlPreviewPosition::ScreenData> screensData;
19 for (QScreen *screen : QGuiApplication::screens()) {
20 QQmlPreviewPosition::ScreenData sd{screen->name(), screen->geometry()};
21 screensData.append(sd);
28 for (QScreen *screen : QGuiApplication::screens()) {
29 if (screen->name() == nameOfScreen)
37 out << screenData.name;
38 out << screenData.rect;
44 in >> screenData.name;
45 in >> screenData.rect;
51 return other.rect == rect && other.name == name;
57 m_savePositionTimer.setSingleShot(
true);
58 m_savePositionTimer.setInterval(500);
59 QObject::connect(&m_savePositionTimer, &QTimer::timeout, &m_savePositionTimer, [
this]() {
74 auto screen = window->screen();
75 auto nativePosition = QHighDpiScaling::mapPositionToNative(window->framePosition(),
77 m_lastWindowPosition = { screen->name(), nativePosition, window->size() };
79 m_savePositionTimer.start();
88 const QByteArray positionAsByteArray = fromPositionToByteArray(m_lastWindowPosition);
89 if (!m_settingsKey.isNull())
90 m_settings.setValue(m_settingsKey, positionAsByteArray);
92 m_settings.setValue(QLatin1String(
"global_lastpostion"), positionAsByteArray);
98 m_settingsKey = url.toString(QUrl::PreferLocalFile) + QLatin1String(
"_lastpostion");
100 if (m_settings.contains(m_settingsKey)) {
101 m_hasPosition =
true;
102 readLastPositionFromByteArray(m_settings.value(m_settingsKey).toByteArray());
110 if (m_currentInitScreensData.isEmpty())
111 m_currentInitScreensData = initScreensData();
113 if (!m_hasPosition) {
114 if (!m_settings.contains(QLatin1String(
"global_lastpostion")))
116 readLastPositionFromByteArray(m_settings.value(QLatin1String(
"global_lastpostion"))
119 setPosition(m_lastWindowPosition, window);
126 QDataStream stream(&array, QIODevice::WriteOnly);
127 stream.setVersion(QDataStream::Qt_5_12);
129 const quint16 majorVersion = 1;
130 const quint16 minorVersion = 0;
132 stream << majorVersion << minorVersion << m_currentInitScreensData << position.screenName
133 << position.nativePosition << position.size;
139 QDataStream stream(array);
140 stream.setVersion(QDataStream::Qt_5_12);
144 quint16 majorVersion = 0;
145 quint16 minorVersion = 0;
147 stream >> majorVersion >> minorVersion;
149 QVector<ScreenData> initScreensData;
150 stream >> initScreensData;
152 if (m_currentInitScreensData != initScreensData)
155 QString nameOfScreen;
156 stream >> nameOfScreen;
158 QScreen *screen = findScreen(nameOfScreen);
162 QPoint nativePosition;
163 stream >> nativePosition;
164 if (nativePosition.isNull())
170 m_lastWindowPosition = { nameOfScreen, nativePosition, size };
176 if (position.nativePosition.isNull())
178 if (QScreen *screen = findScreen(position.screenName)) {
179 window->setScreen(screen);
180 const auto point = QHighDpiScaling::mapPositionFromNative(position.nativePosition,
183 const QRect geometry(point, position.size);
184 if (screen->virtualGeometry().contains(geometry))
185 window->setFramePosition(point);
187 qWarning(
"preview position is out of screen");
bool operator==(const QQmlPreviewPosition::ScreenData &other) const
void loadWindowPositionSettings(const QUrl &url)
void takePosition(QWindow *window, InitializeState state=PositionInitialized)
void initLastSavedWindowPosition(QWindow *window)
static QT_BEGIN_NAMESPACE QVector< QQmlPreviewPosition::ScreenData > initScreensData()
static QDataStream & operator<<(QDataStream &out, const QQmlPreviewPosition::ScreenData &screenData)
static QScreen * findScreen(const QString &nameOfScreen)
static QDataStream & operator>>(QDataStream &in, QQmlPreviewPosition::ScreenData &screenData)