22
33#include < scratchcpp/iengine.h>
44#include < scratchcpp/value.h>
5+ #include < scratchcpp/monitor.h>
56#include < QtConcurrent/QtConcurrent>
67#include < QApplication>
78
89#include " projectloader.h"
910#include " spritemodel.h"
11+ #include " valuemonitormodel.h"
1012#include " renderedtarget.h"
1113
1214using namespace scratchcpprender ;
@@ -126,6 +128,16 @@ const QList<SpriteModel *> &ProjectLoader::cloneList() const
126128 return m_clones;
127129}
128130
131+ QQmlListProperty<MonitorModel> ProjectLoader::monitors ()
132+ {
133+ return QQmlListProperty<MonitorModel>(this , &m_monitors);
134+ }
135+
136+ const QList<MonitorModel *> &ProjectLoader::monitorList () const
137+ {
138+ return m_monitors;
139+ }
140+
129141void ProjectLoader::start ()
130142{
131143 if (m_loadThread.isRunning ())
@@ -193,8 +205,14 @@ void ProjectLoader::load()
193205 m_engine->setCloneLimit (m_cloneLimit);
194206 m_engine->setSpriteFencingEnabled (m_spriteFencing);
195207
196- auto handler = std::bind (&ProjectLoader::redraw, this );
197- m_engine->setRedrawHandler (std::function<void ()>(handler));
208+ auto redrawHandler = std::bind (&ProjectLoader::redraw, this );
209+ m_engine->setRedrawHandler (std::function<void ()>(redrawHandler));
210+
211+ auto addMonitorHandler = std::bind (&ProjectLoader::addMonitor, this , std::placeholders::_1);
212+ m_engine->setAddMonitorHandler (std::function<void (Monitor *)>(addMonitorHandler));
213+
214+ auto removeMonitorHandler = std::bind (&ProjectLoader::removeMonitor, this , std::placeholders::_1, std::placeholders::_2);
215+ m_engine->setRemoveMonitorHandler (std::function<void (Monitor *, IMonitorHandler *)>(removeMonitorHandler));
198216
199217 // Load targets
200218 const auto &targets = m_engine->targets ();
@@ -211,6 +229,12 @@ void ProjectLoader::load()
211229 }
212230 }
213231
232+ // Load monitors
233+ const auto &monitors = m_engine->monitors ();
234+
235+ for (auto monitor : monitors)
236+ addMonitor (monitor.get ());
237+
214238 if (m_stopLoading) {
215239 m_engineMutex.unlock ();
216240 emit fileNameChanged ();
@@ -258,6 +282,8 @@ void ProjectLoader::redraw()
258282 if (renderedTarget)
259283 renderedTarget->beforeRedraw ();
260284 }
285+
286+ m_engine->updateMonitors ();
261287}
262288
263289void ProjectLoader::addClone (SpriteModel *model)
@@ -278,6 +304,48 @@ void ProjectLoader::deleteClone(SpriteModel *model)
278304 emit clonesChanged ();
279305}
280306
307+ void ProjectLoader::addMonitor (Monitor *monitor)
308+ {
309+ auto section = monitor->blockSection ();
310+
311+ if (!section)
312+ return ;
313+
314+ MonitorModel *model = nullptr ;
315+
316+ switch (monitor->mode ()) {
317+ case Monitor::Mode::List:
318+ // TODO: Add support for list monitors
319+ break ;
320+
321+ default :
322+ model = new ValueMonitorModel (section.get ());
323+ break ;
324+ }
325+
326+ if (!model)
327+ return ;
328+
329+ model->moveToThread (qApp->thread ());
330+ model->setParent (this );
331+ monitor->setInterface (model);
332+ m_monitors.push_back (model);
333+ emit monitorAdded (model);
334+ emit monitorsChanged ();
335+ }
336+
337+ void ProjectLoader::removeMonitor (Monitor *monitor, IMonitorHandler *iface)
338+ {
339+ MonitorModel *model = dynamic_cast <MonitorModel *>(iface);
340+
341+ if (!model)
342+ return ;
343+
344+ m_monitors.removeAll (model);
345+ emit monitorRemoved (model);
346+ emit monitorsChanged ();
347+ }
348+
281349double ProjectLoader::fps () const
282350{
283351 return m_fps;
0 commit comments