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::loadUrl);
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(&m_handler, &QQmlPreviewHandler::error, this, &QQmlPreviewServiceImpl::forwardError,
33 Qt::DirectConnection);
35 Qt::DirectConnection);
36}
37
41
42void QQmlPreviewServiceImpl::messageReceived(const QByteArray &data)
43{
44 QQmlDebugPacket packet(data);
45 qint8 command;
46
47 packet >> command;
48 switch (command) {
49 case File: {
50 QString path;
51 QByteArray contents;
52 packet >> path >> contents;
53
54 const QUrl url = path.startsWith(QLatin1Char(':'))
55 ? QUrl(QLatin1String("qrc") + path)
56 : QUrl::fromLocalFile(path);
57
58 emit drop(url);
59 emit file(path, contents);
60
61 // Replace the whole scene with the first file successfully loaded over the debug
62 // connection. This is an OK approximation of the root component, and if the client wants
63 // something specific, it will send an explicit Load anyway.
64 if (m_currentUrl.isEmpty() && path.endsWith(".qml")) {
65 m_currentUrl = url;
66 emit load(m_currentUrl);
67 }
68 break;
69 }
70 case Directory: {
71 QString path;
72 QStringList entries;
73 packet >> path >> entries;
74 emit directory(path, entries);
75 break;
76 }
77 case Load: {
78 QUrl url;
79 packet >> url;
80 if (url.isEmpty())
81 url = m_currentUrl;
82 else
83 m_currentUrl = url;
84 emit load(url);
85 break;
86 }
87 case Error: {
88 QString file;
89 packet >> file;
90 emit error(file);
91 break;
92 }
93 case Rerun:
94 emit rerun();
95 break;
96 case ClearCache:
98 break;
99 case Zoom: {
100 float factor;
101 packet >> factor;
102 emit zoom(static_cast<qreal>(factor));
103 break;
104 }
105 case AnimationSpeed: {
106 float factor;
107 packet >> factor;
108 emit animationSpeed(qreal(factor));
109 break;
110 }
111 default:
112 forwardError(QString::fromLatin1("Invalid command: %1").arg(command));
113 break;
114 }
115}
116
118{
119 if (QQmlEngine *qmlEngine = qobject_cast<QQmlEngine *>(engine))
120 m_handler.addEngine(qmlEngine);
121 emit attachedToEngine(engine);
122}
123
125{
126 if (QQmlEngine *qmlEngine = qobject_cast<QQmlEngine *>(engine))
127 m_handler.removeEngine(qmlEngine);
128 emit detachedFromEngine(engine);
129}
130
131void QQmlPreviewServiceImpl::stateChanged(QQmlDebugService::State state)
132{
133 if (state == Enabled) {
134 m_loader.reset(new QQmlPreviewFileLoader(this));
135 connect(this, &QQmlPreviewServiceImpl::load,
136 m_loader.data(), &QQmlPreviewFileLoader::whitelist, Qt::DirectConnection);
137 QV4::ExecutionEngine::setPreviewing(true);
138 m_fileEngine.reset(new QQmlPreviewFileEngineHandler(m_loader.data()));
139 } else {
140 QV4::ExecutionEngine::setPreviewing(false);
141 m_fileEngine.reset();
142 m_loader.reset();
143 }
144}
145
146void QQmlPreviewServiceImpl::forwardRequest(const QString &file)
147{
148 QQmlDebugPacket packet;
149 packet << static_cast<qint8>(Request) << file;
150 emit messageToClient(name(), packet.data());
151}
152
153void QQmlPreviewServiceImpl::forwardError(const QString &error)
154{
155 QQmlDebugPacket packet;
156 packet << static_cast<qint8>(Error) << error;
157 emit messageToClient(name(), packet.data());
158}
159
161{
162 QQmlDebugPacket packet;
163 packet << static_cast<qint8>(Fps)
164 << frames.numSyncs << frames.minSync << frames.maxSync << frames.totalSync
165 << frames.numRenders << frames.minRender << frames.maxRender << frames.totalRender;
166 emit messageToClient(name(), packet.data());
167}
168
170{
171 return m_handler.currentRootItem();
172}
173
174QT_END_NAMESPACE
175
176#include "moc_qqmlpreviewservice.cpp"
void fps(const FpsInfo &info)
void forwardRequest(const QString &file)
void engineAboutToBeRemoved(QJSEngine *engine) override
QQmlPreviewServiceImpl(QObject *parent=nullptr)
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.