Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmlpreviewservice.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// Qt-Security score:significant
4
6
7#include <QtCore/qpointer.h>
8#include <QtQml/qqmlengine.h>
9#include <QtQml/qqmlcomponent.h>
10#include <QtQuick/qquickwindow.h>
11#include <QtQuick/qquickitem.h>
12#include <QtGui/qguiapplication.h>
13
14#include <private/qquickpixmap_p.h>
15#include <private/qqmldebugconnector_p.h>
16#include <private/qversionedpacket_p.h>
17
19
20const QString QQmlPreviewServiceImpl::s_key = QStringLiteral("QmlPreview");
21using QQmlDebugPacket = QVersionedPacket<QQmlDebugConnector>;
22
25{
26 connect(this, &QQmlPreviewServiceImpl::load, &m_handler, &QQmlPreviewHandler::load);
27 connect(this, &QQmlPreviewServiceImpl::drop, &m_handler, &QQmlPreviewHandler::dropCU);
28 connect(this, &QQmlPreviewServiceImpl::rerun, &m_handler, &QQmlPreviewHandler::rerun);
29 connect(this, &QQmlPreviewServiceImpl::zoom, &m_handler, &QQmlPreviewHandler::zoom);
30 connect(this, &QQmlPreviewServiceImpl::animationSpeed,
31 &m_handler, &QQmlPreviewHandler::setAnimationSpeed);
32 connect(this, &QQmlPreviewServiceImpl::settingsChanged,
33 &m_handler, &QQmlPreviewHandler::configure);
34 connect(&m_handler, &QQmlPreviewHandler::error, this, &QQmlPreviewServiceImpl::forwardError,
35 Qt::DirectConnection);
37 Qt::DirectConnection);
38 connect(&m_handler, &QQmlPreviewHandler::confirmation,
39 this, &QQmlPreviewServiceImpl::forwardConfirmation, Qt::DirectConnection);
40 connect(&m_handler, &QQmlPreviewHandler::hotReloadFailure, this,
41 &QQmlPreviewServiceImpl::forwardHotReloadFailure, Qt::DirectConnection);
42}
43
47
48void QQmlPreviewServiceImpl::messageReceived(const QByteArray &data)
49{
50 QQmlDebugPacket packet(data);
51 qint8 command;
52
53 packet >> command;
54 switch (command) {
55 case File: {
56 QString path;
57 QByteArray contents;
58 packet >> path >> contents;
59
60 const QUrl url = path.startsWith(QLatin1Char(':'))
61 ? QUrl(QLatin1String("qrc") + path)
62 : QUrl::fromLocalFile(path);
63
64 emit drop(url);
65 emit file(path, contents);
66
67 // Replace the whole scene with the first file successfully loaded over the debug
68 // connection. This is an OK approximation of the root component, and if the client wants
69 // something specific, it will send an explicit Load anyway.
70 if (m_currentUrl.isEmpty() && path.endsWith(".qml")) {
71 m_currentUrl = url;
72 emit load(m_currentUrl);
73 }
74 break;
75 }
76 case Directory: {
77 QString path;
78 QStringList entries;
79 packet >> path >> entries;
80 emit directory(path, entries);
81 break;
82 }
83 case Load: {
84 QUrl url;
85 packet >> url;
86 if (url.isEmpty())
87 url = m_currentUrl;
88 else
89 m_currentUrl = url;
90 emit load(url);
91 break;
92 }
93 case Error: {
94 QString file;
95 packet >> file;
96 emit error(file);
97 break;
98 }
99 case Rerun:
100 emit rerun();
101 break;
102 case ClearCache:
104 break;
105 case Zoom: {
106 float factor;
107 packet >> factor;
108 emit zoom(static_cast<qreal>(factor));
109 break;
110 }
111 case AnimationSpeed: {
112 float factor;
113 packet >> factor;
114 emit animationSpeed(qreal(factor));
115 break;
116 }
117 case Configuration: {
118 bool enableInPlaceUpdates;
119 packet >> enableInPlaceUpdates;
120 QQmlPreviewHandler::Settings options;
121 options.enableInPlaceUpdates = enableInPlaceUpdates;
122 emit settingsChanged(options);
123 break;
124 }
125 default:
126 forwardError(QString::fromLatin1("Invalid command: %1").arg(command));
127 break;
128 }
129}
130
132{
133 if (QQmlEngine *qmlEngine = qobject_cast<QQmlEngine *>(engine))
134 m_handler.addEngine(qmlEngine);
135 emit attachedToEngine(engine);
136}
137
139{
140 if (QQmlEngine *qmlEngine = qobject_cast<QQmlEngine *>(engine))
141 m_handler.removeEngine(qmlEngine);
142 emit detachedFromEngine(engine);
143}
144
145void QQmlPreviewServiceImpl::stateChanged(QQmlDebugService::State state)
146{
147 if (state == Enabled) {
148 m_loader.reset(new QQmlPreviewFileLoader(this));
149 connect(this, &QQmlPreviewServiceImpl::load,
150 m_loader.data(), &QQmlPreviewFileLoader::whitelist, Qt::DirectConnection);
151 QV4::ExecutionEngine::setPreviewing(true);
152 m_fileEngine.reset(new QQmlPreviewFileEngineHandler(m_loader.data()));
153 } else {
154 QV4::ExecutionEngine::setPreviewing(false);
155 m_fileEngine.reset();
156 m_loader.reset();
157 }
158}
159
160void QQmlPreviewServiceImpl::forwardRequest(const QString &file)
161{
162 QQmlDebugPacket packet;
163 packet << static_cast<qint8>(Request) << file;
164 emit messageToClient(name(), packet.data());
165}
166
167void QQmlPreviewServiceImpl::forwardError(const QString &error)
168{
169 QQmlDebugPacket packet;
170 packet << static_cast<qint8>(Error) << error;
171 emit messageToClient(name(), packet.data());
172}
173
175{
176 QQmlDebugPacket packet;
177 packet << static_cast<qint8>(Fps)
178 << frames.numSyncs << frames.minSync << frames.maxSync << frames.totalSync
179 << frames.numRenders << frames.minRender << frames.maxRender << frames.totalRender;
180 emit messageToClient(name(), packet.data());
181}
182
184 const QQmlPreviewHandler::Settings &settings)
185{
186 QQmlDebugPacket packet;
187 packet << static_cast<qint8>(Confirmation) << settings.enableInPlaceUpdates;
188 emit messageToClient(name(), packet.data());
189}
190
192{
193 QQmlDebugPacket packet;
194 packet << static_cast<qint8>(HotReloadFailure) << reason;
195 emit messageToClient(name(), packet.data());
196}
197
199{
200 return m_handler.currentRootItem();
201}
202
203QT_END_NAMESPACE
204
205#include "moc_qqmlpreviewservice.cpp"
void fps(const FpsInfo &info)
void forwardRequest(const QString &file)
void forwardConfirmation(const QQmlPreviewHandler::Settings &settings)
void engineAboutToBeRemoved(QJSEngine *engine) override
QQmlPreviewServiceImpl(QObject *parent=nullptr)
void forwardHotReloadFailure(const QString &reason)
void engineAboutToBeAdded(QJSEngine *engine) override
void forwardFps(const QQmlPreviewHandler::FpsInfo &frames)
static const QString s_key
void stateChanged(State state) override
void forwardError(const QString &error)
void messageReceived(const QByteArray &message) override
void clearCache()
Clears cached information about loaded files, including any type data, scripts and qmldir information...
Combined button and popup list for selecting options.