9#include <QtCore/qpointer.h>
10#include <QtQml/qqmlengine.h>
11#include <QtQml/qqmlcomponent.h>
12#include <QtQuick/qquickwindow.h>
13#include <QtQuick/qquickitem.h>
14#include <QtGui/qguiapplication.h>
16#include <private/qquickpixmap_p.h>
17#include <private/qqmldebugconnector_p.h>
18#include <private/qversionedpacket_p.h>
25 return v ==
nullptr || qstrcmp(v,
"1") == 0 || qstrcmp(v,
"true") == 0;
30 static const bool enabled =
36using QQmlDebugPacket = QVersionedPacket<QQmlDebugConnector>;
42 m_handler->connectToService(
this);
52 const auto engineList = m_handler->engines();
53 m_handler = std::make_unique<QQmlInPlacePreviewHandler>();
54 m_handler->connectToService(
this);
55 for (QQmlEngine *engine : engineList)
56 m_handler->addEngine(engine);
59 QQmlDebugPacket response;
60 const bool enableInPlaceUpdates =
true;
61 response <<
static_cast<qint8>(Confirmation) << enableInPlaceUpdates;
62 emit messageToClient(name(), response.data());
67 QQmlDebugPacket packet(data);
75 packet >> path >> contents;
77 const QUrl url = path.startsWith(QLatin1Char(
':'))
78 ? QUrl(QLatin1String(
"qrc") + path)
79 : QUrl::fromLocalFile(path);
82 emit file(path, contents);
86 if (m_currentUrl.isEmpty() && path.endsWith(
".qml"))
98 packet >> path >> entries;
99 emit directory(path, entries);
127 emit zoom(
static_cast<qreal>(factor));
130 case AnimationSpeed: {
133 emit animationSpeed(qreal(factor));
136 case Configuration: {
138 bool enableInPlaceUpdates;
139 packet >> enableInPlaceUpdates;
140 if (enableInPlaceUpdates
141 && !qobject_cast<QQmlInPlacePreviewHandler *>(m_handler.get())) {
144 QMetaObject::invokeMethod(
this, &QQmlPreviewServiceImpl::switchToInPlaceHandler);
145 }
else if (!enableInPlaceUpdates
146 && qobject_cast<QQmlInPlacePreviewHandler *>(m_handler.get())) {
147 forwardError(QLatin1String(
"Cannot disable in-place updates once enabled"));
155 forwardError(QString::fromLatin1(
"Invalid command: %1").arg(command));
162 if (QQmlEngine *qmlEngine = qobject_cast<QQmlEngine *>(engine))
163 m_handler->addEngine(qmlEngine);
164 emit attachedToEngine(engine);
169 if (QQmlEngine *qmlEngine = qobject_cast<QQmlEngine *>(engine))
170 m_handler->removeEngine(qmlEngine);
171 emit detachedFromEngine(engine);
176 if (state == Enabled) {
177 m_loader.reset(
new QQmlPreviewFileLoader(
this));
178 connect(
this, &QQmlPreviewServiceImpl::load,
179 m_loader.data(), &QQmlPreviewFileLoader::whitelist, Qt::DirectConnection);
180 QV4::ExecutionEngine::setPreviewing(
true);
181 m_fileEngine.reset(
new QQmlPreviewFileEngineHandler(m_loader.data()));
183 QV4::ExecutionEngine::setPreviewing(
false);
184 m_fileEngine.reset();
191 QQmlDebugPacket packet;
192 packet <<
static_cast<qint8>(Request) << file;
193 emit messageToClient(name(), packet.data());
198 QQmlDebugPacket packet;
199 packet <<
static_cast<qint8>(Error) << error;
200 emit messageToClient(name(), packet.data());
205 QQmlDebugPacket packet;
206 packet <<
static_cast<qint8>(Fps)
207 << frames.numSyncs << frames.minSync << frames.maxSync << frames.totalSync
208 << frames.numRenders << frames.minRender << frames.maxRender << frames.totalRender;
209 emit messageToClient(name(), packet.data());
214 QQmlDebugPacket packet;
215 packet <<
static_cast<qint8>(HotReloadFailure) << reason;
216 emit messageToClient(name(), packet.data());
221 return m_handler->currentRootItem();
226#include "moc_qqmlpreviewservice.cpp"
void forwardRequest(const QString &file)
static const QString s_key
void engineAboutToBeRemoved(QJSEngine *engine) override
QQuickItem * currentRootItem()
QQmlPreviewServiceImpl(QObject *parent=nullptr)
void forwardHotReloadFailure(const QString &reason)
virtual ~QQmlPreviewServiceImpl()
void engineAboutToBeAdded(QJSEngine *engine) override
void forwardFps(const QQmlPreviewHandler::FpsInfo &frames)
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.
QT_BEGIN_NAMESPACE bool convertQmlPreviewHotReload(const char *v)
static bool qmlPreviewHotReloadEnabled()