Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqmlpreviewposition.cpp
Go to the documentation of this file.
1// Copyright (C) 2018 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
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>
12
14
15static QVector<QQmlPreviewPosition::ScreenData> initScreensData()
16{
17 QVector<QQmlPreviewPosition::ScreenData> screensData;
18
21 screensData.append(sd);
22 }
23 return screensData;
24}
25
26static QScreen *findScreen(const QString &nameOfScreen)
27{
29 if (screen->name() == nameOfScreen)
30 return screen;
31 }
32 return nullptr;
33}
34
36{
37 out << screenData.name;
38 out << screenData.rect;
39 return out;
40}
41
43{
44 in >> screenData.name;
45 in >> screenData.rect;
46 return in;
47}
48
53
55 : m_settings("QtProject", "QtQmlPreview")
56{
57 m_savePositionTimer.setSingleShot(true);
58 m_savePositionTimer.setInterval(500);
59 QObject::connect(&m_savePositionTimer, &QTimer::timeout, &m_savePositionTimer, [this]() {
60 saveWindowPosition();
61 });
62}
63
67
69{
71 // only save the position if we already tried to get the last saved position
72 if (m_initializeState == PositionInitialized) {
73 m_hasPosition = true;
74 auto screen = window->screen();
75 auto nativePosition = QHighDpiScaling::mapPositionToNative(window->framePosition(),
76 screen->handle());
77 m_lastWindowPosition = { screen->name(), nativePosition, window->size() };
78
79 m_savePositionTimer.start();
80 }
82 m_initializeState = InitializePosition;
83}
84
85void QQmlPreviewPosition::saveWindowPosition()
86{
87 if (m_hasPosition) {
88 const QByteArray positionAsByteArray = fromPositionToByteArray(m_lastWindowPosition);
89 if (!m_settingsKey.isNull())
90 m_settings.setValue(m_settingsKey, positionAsByteArray);
91
92 m_settings.setValue(QLatin1String("global_lastpostion"), positionAsByteArray);
93 }
94}
95
97{
98 m_settingsKey = url.toString(QUrl::PreferLocalFile) + QLatin1String("_lastpostion");
99
100 if (m_settings.contains(m_settingsKey)) {
101 m_hasPosition = true;
102 readLastPositionFromByteArray(m_settings.value(m_settingsKey).toByteArray());
103 }
104}
105
107{
109 m_initializeState = PositionInitialized;
110 if (m_currentInitScreensData.isEmpty())
111 m_currentInitScreensData = initScreensData();
112 // if it is the first time we just use the fall back from a last shown qml file
113 if (!m_hasPosition) {
114 if (!m_settings.contains(QLatin1String("global_lastpostion")))
115 return;
116 readLastPositionFromByteArray(m_settings.value(QLatin1String("global_lastpostion"))
117 .toByteArray());
118 }
119 setPosition(m_lastWindowPosition, window);
120}
121
122QByteArray QQmlPreviewPosition::fromPositionToByteArray(
124{
127 stream.setVersion(QDataStream::Qt_5_12);
128
129 const quint16 majorVersion = 1;
130 const quint16 minorVersion = 0;
131
132 stream << majorVersion << minorVersion << m_currentInitScreensData << position.screenName
133 << position.nativePosition << position.size;
134 return array;
135}
136
137void QQmlPreviewPosition::readLastPositionFromByteArray(const QByteArray &array)
138{
140 stream.setVersion(QDataStream::Qt_5_12);
141
142 // no version check for 1.0
143 //const quint16 currentMajorVersion = 1;
144 quint16 majorVersion = 0;
145 quint16 minorVersion = 0;
146
147 stream >> majorVersion >> minorVersion;
148
149 QVector<ScreenData> initScreensData;
151
152 if (m_currentInitScreensData != initScreensData)
153 return;
154
155 QString nameOfScreen;
156 stream >> nameOfScreen;
157
158 QScreen *screen = findScreen(nameOfScreen);
159 if (!screen)
160 return;
161
162 QPoint nativePosition;
163 stream >> nativePosition;
164 if (nativePosition.isNull())
165 return;
166
167 QSize size;
168 stream >> size;
169
170 m_lastWindowPosition = { nameOfScreen, nativePosition, size };
171}
172
173void QQmlPreviewPosition::setPosition(const QQmlPreviewPosition::Position &position,
175{
176 if (position.nativePosition.isNull())
177 return;
178 if (QScreen *screen = findScreen(position.screenName)) {
179 window->setScreen(screen);
180 const auto point = QHighDpiScaling::mapPositionFromNative(position.nativePosition,
181 screen->handle());
182
183 const QRect geometry(point, position.size);
184 if (screen->virtualGeometry().contains(geometry))
185 window->setFramePosition(point);
186 else
187 qWarning("preview position is out of screen");
188 }
189}
190
\inmodule QtCore
Definition qbytearray.h:57
\inmodule QtCore\reentrant
Definition qdatastream.h:46
static QList< QScreen * > screens()
Returns a list of all the screens associated with the windowing system the application is connected t...
static QPoint mapPositionToNative(const QPoint &pos, const QPlatformScreen *platformScreen)
static QPoint mapPositionFromNative(const QPoint &pos, const QPlatformScreen *platformScreen)
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
\inmodule QtCore\reentrant
Definition qpoint.h:25
constexpr bool isNull() const noexcept
Returns true if both the x and y coordinates are set to 0, otherwise returns false.
Definition qpoint.h:125
bool operator==(const QQmlPreviewPosition::ScreenData &other) const
void loadWindowPositionSettings(const QUrl &url)
void takePosition(QWindow *window, InitializeState state=PositionInitialized)
void initLastSavedWindowPosition(QWindow *window)
\inmodule QtCore\reentrant
Definition qrect.h:30
bool contains(const QRect &r, bool proper=false) const noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qrect.cpp:855
The QScreen class is used to query screen properties. \inmodule QtGui.
Definition qscreen.h:32
QRect geometry
the screen's geometry in pixels
Definition qscreen.h:45
QRect virtualGeometry
the pixel geometry of the virtual desktop to which this screen belongs
Definition qscreen.h:47
QString name
a user presentable string representing the screen
Definition qscreen.h:36
QPlatformScreen * handle() const
Get the platform screen handle.
Definition qscreen.cpp:83
bool contains(QAnyStringView key) const
Returns true if there exists a setting called key; returns false otherwise.
void setValue(QAnyStringView key, const QVariant &value)
Sets the value of setting key to value.
QVariant value(QAnyStringView key, const QVariant &defaultValue) const
Returns the value for setting key.
\inmodule QtCore
Definition qsize.h:25
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
bool isNull() const
Returns true if this string is null; otherwise returns false.
Definition qstring.h:994
void setSingleShot(bool singleShot)
Definition qtimer.cpp:552
void start(int msec)
Starts or restarts the timer with a timeout interval of msec milliseconds.
Definition qtimer.cpp:241
void setInterval(int msec)
Definition qtimer.cpp:579
void timeout(QPrivateSignal)
This signal is emitted when the timer times out.
\inmodule QtCore
Definition qurl.h:94
@ PreferLocalFile
Definition qurl.h:114
QString toString(FormattingOptions options=FormattingOptions(PrettyDecoded)) const
Returns a string representation of the URL.
Definition qurl.cpp:2831
QByteArray toByteArray() const
Returns the variant as a QByteArray if the variant has userType() \l QMetaType::QByteArray or \l QMet...
\inmodule QtGui
Definition qwindow.h:63
else opt state
[0]
Combined button and popup list for selecting options.
EGLStreamKHR stream
#define qWarning
Definition qlogging.h:166
n void setPosition(void) \n\
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLenum array
GLuint in
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)
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
QScreen * screen
[1]
Definition main.cpp:29
unsigned short quint16
Definition qtypes.h:48
QTextStream out(stdout)
[7]
QUrl url("example.com")
[constructor-url-reference]
QSharedPointer< T > other(t)
[5]
aWidget window() -> setWindowTitle("New Window Title")
[2]