7#include <private/qpacket_p.h>
9#include <QtCore/qurl.h>
10#include <QtCore/qfile.h>
11#include <QtCore/qfileinfo.h>
12#include <QtCore/qdir.h>
13#include <QtQml/qqmlfile.h>
18 : QQmlDebugClient(*(
new QQmlPreviewClientPrivate(connection)))
20 Q_D(QQmlPreviewClient);
21 connect(&d->replayClient, &QQmlDebugClient::stateChanged,
this,
22 [
this](State replayClientState) {
23 if (replayClientState == Enabled)
24 configureEventReplay();
30 QPacket packet(connection()->currentDataStreamVersion(), message);
38 packet >> seviceError;
39 emit error(seviceError);
45 emit request(fileName);
50 packet >> info.numSyncs >> info.minSync >> info.maxSync >> info.totalSync
51 >> info.numRenders >> info.minRender >> info.maxRender >> info.totalRender;
58 emit confirmation(settings);
61 case HotReloadFailure: {
64 emit hotReloadFailure(reason);
68 emit error(QString::fromLatin1(
"Unknown command received: %1").arg(command));
75 QPacket packet(connection()->currentDataStreamVersion());
76 packet <<
static_cast<qint8>(Directory) << path << entries;
77 sendMessage(packet.data());
82 QPacket packet(connection()->currentDataStreamVersion());
83 packet <<
static_cast<qint8>(File) << path << contents;
84 sendMessage(packet.data());
89 QPacket packet(connection()->currentDataStreamVersion());
90 packet <<
static_cast<qint8>(Error) << path;
91 sendMessage(packet.data());
96 QPacket packet(connection()->currentDataStreamVersion());
97 packet <<
static_cast<qint8>(Configuration) << config.enableInPlaceUpdates;
98 sendMessage(packet.data());
103 QPacket packet(connection()->currentDataStreamVersion());
104 packet <<
static_cast<qint8>(Load) << url;
105 sendMessage(packet.data());
110 QPacket packet(connection()->currentDataStreamVersion());
111 packet <<
static_cast<qint8>(Rerun);
112 sendMessage(packet.data());
117 QPacket packet(connection()->currentDataStreamVersion());
118 packet <<
static_cast<qint8>(Zoom) << factor;
119 sendMessage(packet.data());
124 QPacket packet(connection()->currentDataStreamVersion());
125 packet <<
static_cast<qint8>(AnimationSpeed) << factor;
126 sendMessage(packet.data());
131 Q_D(QQmlPreviewClient);
133 Q_ASSERT(connection());
134 Q_ASSERT(d->replayClient.state() == Enabled);
136 d->recordClient.setFlushInterval(1);
137 d->recordClient.setRecording(
true);
138 d->replayTimer.setInterval(100);
139 connect(&d->replayTimer, &QTimer::timeout,
this, [
this, d]() {
140 if (d->eventReceiver.numLoadedEvents() < d->m_numExpectedEvents)
143 d->replayTimer.stop();
149 Q_D(QQmlPreviewClient);
151 const auto events = d->eventReceiver.events();
152 if (events.isEmpty() || d->replayClient.state() != Enabled) {
153 d->eventReceiver.clear();
157 const auto types = d->eventReceiver.eventTypes();
162 d->m_numExpectedEvents = events.size();
165 qint64 timestamp = 0;
166 for (QQmlProfilerEvent event : events) {
168 event.setTimestamp(++timestamp);
169 d->replayClient.sendEvent(types[event.typeIndex()], std::move(event));
172 d->eventReceiver.clear();
173 d->replayTimer.start();
177 QQmlProfilerEvent &&event)
179 Q_D(QQmlPreviewClient);
180 d->replayClient.sendEvent(type, std::move(event));
185 Q_D(QQmlPreviewClient);
186 return d->eventReceiver.save(fileName);
191 Q_D(QQmlPreviewClient);
192 if (d->replayClient.state() != Enabled)
196 qsizetype numEvents = 0;
197 if (d->replayClient.loadEvents(
198 fileName, [&](
const QQmlProfilerEventType &type, QQmlProfilerEvent &&event) {
200 event.setTimestamp(++numEvents);
201 d->replayClient.sendEvent(type, std::move(event));
204 d->eventReceiver.clear();
205 d->m_numExpectedEvents = numEvents;
206 d->replayTimer.start();
216 Q_D(
const QQmlPreviewClient);
217 return d->eventReceiver.numLoadedEvents() > 0;
222 Q_D(QQmlPreviewClient);
223 d->eventReceiver.clear();
228#include "moc_qqmlpreviewclient_p.cpp"
void messageReceived(const QByteArray &message) override
void triggerZoom(float factor)
void replayEvent(const QQmlProfilerEventType &type, QQmlProfilerEvent &&event)
bool replayEventsFromFile(const QString &fileName)
bool hasRecordedEvents() const
void triggerAnimationSpeed(float factor)
bool saveEvents(const QString &fileName)
void sendFile(const QString &path, const QByteArray &contents)
void sendError(const QString &path)
void clearRecordedEvents()
void sendDirectory(const QString &path, const QStringList &entries)
void sendConfiguration(const Settings &settings)
void triggerLoad(const QUrl &url)
Combined button and popup list for selecting options.
bool enableInPlaceUpdates