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