7#include <QtCore/qiodevice.h>
8#include <QtGui/qwindow.h>
9#include <QtGui/qscreen.h>
10#include <QtGui/qguiapplication.h>
11#include <QtCore/QIODevice>
12#include <private/qhighdpiscaling_p.h>
18 QVector<QQmlPreviewPosition::ScreenData> screensData;
20 for (QScreen *screen : QGuiApplication::screens()) {
21 QQmlPreviewPosition::ScreenData sd{screen->name(), screen->geometry()};
22 screensData.append(sd);
29 for (QScreen *screen : QGuiApplication::screens()) {
30 if (screen->name() == nameOfScreen)
38 out << screenData.name;
39 out << screenData.rect;
45 in >> screenData.name;
46 in >> screenData.rect;
52 return other.rect == rect && other.name == name;
58 m_savePositionTimer.setSingleShot(
true);
59 m_savePositionTimer.setInterval(500);
60 QObject::connect(&m_savePositionTimer, &QTimer::timeout, &m_savePositionTimer, [
this]() {
75 auto screen = window->screen();
76 auto nativePosition = QHighDpiScaling::mapPositionToNative(window->framePosition(),
78 m_lastWindowPosition = { screen->name(), nativePosition, window->size() };
80 m_savePositionTimer.start();
89 const QByteArray positionAsByteArray = fromPositionToByteArray(m_lastWindowPosition);
90 if (!m_settingsKey.isNull())
91 m_settings.setValue(m_settingsKey, positionAsByteArray);
93 m_settings.setValue(QLatin1String(
"global_lastpostion"), positionAsByteArray);
99 m_settingsKey = url.toString(QUrl::PreferLocalFile) + QLatin1String(
"_lastpostion");
101 if (m_settings.contains(m_settingsKey)) {
102 m_hasPosition =
true;
103 readLastPositionFromByteArray(m_settings.value(m_settingsKey).toByteArray());
111 if (m_currentInitScreensData.isEmpty())
112 m_currentInitScreensData = initScreensData();
114 if (!m_hasPosition) {
115 if (!m_settings.contains(QLatin1String(
"global_lastpostion")))
117 readLastPositionFromByteArray(m_settings.value(QLatin1String(
"global_lastpostion"))
120 setPosition(m_lastWindowPosition, window);
127 QDataStream stream(&array, QIODevice::WriteOnly);
128 stream.setVersion(QDataStream::Qt_5_12);
130 const quint16 majorVersion = 1;
131 const quint16 minorVersion = 0;
133 stream << majorVersion << minorVersion << m_currentInitScreensData << position.screenName
134 << position.nativePosition << position.size;
140 QDataStream stream(array);
141 stream.setVersion(QDataStream::Qt_5_12);
145 quint16 majorVersion = 0;
146 quint16 minorVersion = 0;
148 stream >> majorVersion >> minorVersion;
150 QVector<ScreenData> initScreensData;
151 stream >> initScreensData;
153 if (m_currentInitScreensData != initScreensData)
156 QString nameOfScreen;
157 stream >> nameOfScreen;
159 QScreen *screen = findScreen(nameOfScreen);
163 QPoint nativePosition;
164 stream >> nativePosition;
165 if (nativePosition.isNull())
171 m_lastWindowPosition = { nameOfScreen, nativePosition, size };
177 if (position.nativePosition.isNull())
179 if (QScreen *screen = findScreen(position.screenName)) {
180 window->setScreen(screen);
181 const auto point = QHighDpiScaling::mapPositionFromNative(position.nativePosition,
184 const QRect geometry(point, position.size);
185 if (screen->virtualGeometry().contains(geometry))
186 window->setFramePosition(point);
188 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)
Combined button and popup list for selecting options.
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)