Skip to content

Commit e40a0e8

Browse files
committed
Load monitors
1 parent 6e48ef8 commit e40a0e8

File tree

4 files changed

+100
-2
lines changed

4 files changed

+100
-2
lines changed

src/projectloader.cpp

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
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

1214
using 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+
129141
void 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

263289
void 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+
281349
double ProjectLoader::fps() const
282350
{
283351
return m_fps;

src/projectloader.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@
1010
#include "stagemodel.h"
1111

1212
Q_MOC_INCLUDE("spritemodel.h");
13+
Q_MOC_INCLUDE("monitormodel.h");
1314

1415
namespace scratchcpprender
1516
{
1617

1718
class SpriteModel;
19+
class MonitorModel;
1820

1921
class ProjectLoader : public QObject
2022
{
@@ -26,6 +28,7 @@ class ProjectLoader : public QObject
2628
Q_PROPERTY(StageModel *stage READ stage NOTIFY stageChanged)
2729
Q_PROPERTY(QQmlListProperty<SpriteModel> sprites READ sprites NOTIFY spritesChanged)
2830
Q_PROPERTY(QQmlListProperty<SpriteModel> clones READ clones NOTIFY clonesChanged)
31+
Q_PROPERTY(QQmlListProperty<MonitorModel> monitors READ monitors NOTIFY monitorsChanged)
2932
Q_PROPERTY(double fps READ fps WRITE setFps NOTIFY fpsChanged)
3033
Q_PROPERTY(bool turboMode READ turboMode WRITE setTurboMode NOTIFY turboModeChanged)
3134
Q_PROPERTY(unsigned int stageWidth READ stageWidth WRITE setStageWidth NOTIFY stageWidthChanged)
@@ -55,6 +58,9 @@ class ProjectLoader : public QObject
5558
QQmlListProperty<SpriteModel> clones();
5659
const QList<SpriteModel *> &cloneList() const;
5760

61+
QQmlListProperty<MonitorModel> monitors();
62+
const QList<MonitorModel *> &monitorList() const;
63+
5864
Q_INVOKABLE void start();
5965
Q_INVOKABLE void stop();
6066

@@ -88,6 +94,7 @@ class ProjectLoader : public QObject
8894
void stageChanged();
8995
void spritesChanged();
9096
void clonesChanged();
97+
void monitorsChanged();
9198
void fpsChanged();
9299
void turboModeChanged();
93100
void stageWidthChanged();
@@ -98,6 +105,8 @@ class ProjectLoader : public QObject
98105
void assetCountChanged();
99106
void cloneCreated(SpriteModel *model);
100107
void cloneDeleted(SpriteModel *model);
108+
void monitorAdded(MonitorModel *model);
109+
void monitorRemoved(MonitorModel *model);
101110

102111
protected:
103112
void timerEvent(QTimerEvent *event) override;
@@ -109,6 +118,8 @@ class ProjectLoader : public QObject
109118
void redraw();
110119
void addClone(SpriteModel *model);
111120
void deleteClone(SpriteModel *model);
121+
void addMonitor(libscratchcpp::Monitor *monitor);
122+
void removeMonitor(libscratchcpp::Monitor *monitor, libscratchcpp::IMonitorHandler *iface);
112123

113124
int m_timerId = -1;
114125
QString m_fileName;
@@ -120,6 +131,7 @@ class ProjectLoader : public QObject
120131
StageModel m_stage;
121132
QList<SpriteModel *> m_sprites;
122133
QList<SpriteModel *> m_clones;
134+
QList<MonitorModel *> m_monitors;
123135
double m_fps = 30;
124136
bool m_turboMode = false;
125137
unsigned int m_stageWidth = 480;

test/load_test.sb3

-166 Bytes
Binary file not shown.

test/projectloader/projectloader_test.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <QtTest/QSignalSpy>
22
#include <projectloader.h>
33
#include <spritemodel.h>
4+
#include <valuemonitormodel.h>
45
#include <enginemock.h>
56
#include <renderedtargetmock.h>
67

@@ -24,6 +25,8 @@ class ProjectLoaderTest : public testing::Test
2425
QSignalSpy engineSpy(loader, &ProjectLoader::engineChanged);
2526
QSignalSpy stageSpy(loader, &ProjectLoader::stageChanged);
2627
QSignalSpy spritesSpy(loader, &ProjectLoader::spritesChanged);
28+
QSignalSpy monitorsSpy(loader, &ProjectLoader::monitorsChanged);
29+
QSignalSpy monitorAddedSpy(loader, &ProjectLoader::monitorAdded);
2730

2831
loader->setFileName(fileName);
2932

@@ -33,6 +36,8 @@ class ProjectLoaderTest : public testing::Test
3336
ASSERT_TRUE(engineSpy.empty());
3437
ASSERT_TRUE(stageSpy.empty());
3538
ASSERT_TRUE(spritesSpy.empty());
39+
ASSERT_TRUE(monitorsSpy.empty());
40+
ASSERT_TRUE(monitorAddedSpy.empty());
3641
ASSERT_EQ(loader->fileName(), fileName);
3742
ASSERT_FALSE(loader->loadStatus());
3843

@@ -46,6 +51,8 @@ class ProjectLoaderTest : public testing::Test
4651
ASSERT_EQ(engineSpy.count(), 1);
4752
ASSERT_EQ(stageSpy.count(), 1);
4853
ASSERT_EQ(spritesSpy.count(), 1);
54+
ASSERT_EQ(monitorsSpy.count(), loader->monitorList().size());
55+
ASSERT_EQ(monitorAddedSpy.count(), loader->monitorList().size());
4956
}
5057
};
5158

@@ -72,6 +79,17 @@ TEST_F(ProjectLoaderTest, Load)
7279
ASSERT_EQ(sprites.size(), 2);
7380
ASSERT_EQ(sprites[0]->sprite(), engine->targetAt(1));
7481
ASSERT_EQ(sprites[1]->sprite(), engine->targetAt(2));
82+
83+
const auto &monitors = loader.monitorList();
84+
ASSERT_EQ(monitors.size(), 7);
85+
86+
ValueMonitorModel *monitorModel = dynamic_cast<ValueMonitorModel *>(monitors[0]);
87+
ASSERT_EQ(monitorModel->monitor(), engine->monitors().at(3).get());
88+
ASSERT_EQ(monitorModel->color(), QColor::fromString("#FF8C1A"));
89+
90+
monitorModel = dynamic_cast<ValueMonitorModel *>(monitors[1]);
91+
ASSERT_EQ(monitorModel->monitor(), engine->monitors().at(4).get());
92+
ASSERT_EQ(monitorModel->color(), QColor::fromString("#FF8C1A"));
7593
}
7694

7795
TEST_F(ProjectLoaderTest, Clones)

0 commit comments

Comments
 (0)