Skip to content

Commit d5a6cb3

Browse files
committed
Prepare ProjectLoader for running projects in main thread
1 parent 2a58a46 commit d5a6cb3

File tree

3 files changed

+21
-122
lines changed

3 files changed

+21
-122
lines changed

src/projectloader.cpp

Lines changed: 9 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@
1212
using namespace scratchcpprender;
1313
using namespace libscratchcpp;
1414

15-
void runEventLoop(IEngine *engine)
16-
{
17-
engine->runEventLoop();
18-
}
19-
2015
ProjectLoader::ProjectLoader(QObject *parent) :
2116
QObject(parent)
2217
{
@@ -33,12 +28,6 @@ ProjectLoader::ProjectLoader(QObject *parent) :
3328
});
3429

3530
initTimer();
36-
37-
// Update refresh rate when primary screen changes
38-
connect(qApp, &QApplication::primaryScreenChanged, this, [this]() {
39-
killTimer(m_timerId);
40-
initTimer();
41-
});
4231
}
4332

4433
ProjectLoader::~ProjectLoader()
@@ -48,11 +37,6 @@ ProjectLoader::~ProjectLoader()
4837
if (m_loadThread.isRunning())
4938
m_loadThread.waitForFinished();
5039

51-
if (m_engine && m_eventLoopEnabled) {
52-
m_engine->stopEventLoop();
53-
m_eventLoop.waitForFinished();
54-
}
55-
5640
for (SpriteModel *sprite : m_sprites)
5741
sprite->deleteLater();
5842
}
@@ -72,11 +56,6 @@ void ProjectLoader::setFileName(const QString &newFileName)
7256

7357
m_fileName = newFileName;
7458

75-
if (m_engine) {
76-
m_engine->stopEventLoop();
77-
m_eventLoop.waitForFinished();
78-
}
79-
8059
m_project.setScratchVersion(ScratchVersion::Scratch3);
8160
m_project.setFileName(m_fileName.toStdString());
8261
m_loadStatus = false;
@@ -164,17 +143,8 @@ void ProjectLoader::timerEvent(QTimerEvent *event)
164143
if (m_loadThread.isRunning())
165144
return;
166145

167-
auto stageRenderedTarget = m_stage.renderedTarget();
168-
169-
if (stageRenderedTarget)
170-
stageRenderedTarget->updateProperties();
171-
172-
for (auto sprite : m_sprites) {
173-
auto renderedTarget = sprite->renderedTarget();
174-
175-
if (renderedTarget)
176-
renderedTarget->updateProperties();
177-
}
146+
if (m_engine)
147+
m_engine->step();
178148

179149
event->accept();
180150
}
@@ -213,7 +183,7 @@ void ProjectLoader::load()
213183
m_engine->setCloneLimit(m_cloneLimit);
214184
m_engine->setSpriteFencingEnabled(m_spriteFencing);
215185

216-
auto handler = std::bind(&ProjectLoader::emitTick, this);
186+
auto handler = std::bind(&ProjectLoader::redraw, this);
217187
m_engine->setRedrawHandler(std::function<void()>(handler));
218188

219189
// Load targets
@@ -240,12 +210,6 @@ void ProjectLoader::load()
240210
return;
241211
}
242212

243-
// Run event loop
244-
m_engine->setSpriteFencingEnabled(false);
245-
246-
if (m_eventLoopEnabled)
247-
m_eventLoop = QtConcurrent::run(&runEventLoop, m_engine);
248-
249213
m_engineMutex.unlock();
250214

251215
emit loadStatusChanged();
@@ -257,28 +221,15 @@ void ProjectLoader::load()
257221

258222
void ProjectLoader::initTimer()
259223
{
260-
QScreen *screen = qApp->primaryScreen();
261-
262-
if (screen)
263-
m_timerId = startTimer(1000 / screen->refreshRate());
224+
m_timerId = startTimer(1000 / m_fps);
264225
}
265226

266-
void ProjectLoader::emitTick()
227+
void ProjectLoader::redraw()
267228
{
268229
if (m_loadThread.isRunning())
269230
m_loadThread.waitForFinished();
270231

271-
auto stageRenderedTarget = m_stage.renderedTarget();
272-
273-
if (stageRenderedTarget)
274-
stageRenderedTarget->loadProperties();
275-
276-
for (auto sprite : m_sprites) {
277-
auto renderedTarget = sprite->renderedTarget();
278-
279-
if (renderedTarget)
280-
renderedTarget->loadProperties();
281-
}
232+
// TODO: Call beforeRedraw() of targets
282233
}
283234

284235
double ProjectLoader::fps() const
@@ -299,6 +250,9 @@ void ProjectLoader::setFps(double newFps)
299250
} else
300251
m_fps = newFps;
301252

253+
killTimer(m_timerId);
254+
initTimer();
255+
302256
m_engineMutex.unlock();
303257
emit fpsChanged();
304258
}
@@ -405,32 +359,6 @@ void ProjectLoader::setSpriteFencing(bool newSpriteFencing)
405359
emit spriteFencingChanged();
406360
}
407361

408-
bool ProjectLoader::eventLoopEnabled() const
409-
{
410-
return m_eventLoopEnabled;
411-
}
412-
413-
void ProjectLoader::setEventLoopEnabled(bool newEventLoopEnabled)
414-
{
415-
if (m_eventLoopEnabled == newEventLoopEnabled)
416-
return;
417-
418-
m_eventLoopEnabled = newEventLoopEnabled;
419-
m_engineMutex.lock();
420-
421-
if (m_engine) {
422-
if (m_eventLoopEnabled)
423-
m_eventLoop = QtConcurrent::run(&runEventLoop, m_engine);
424-
else {
425-
m_engine->stopEventLoop();
426-
m_eventLoop.waitForFinished();
427-
}
428-
}
429-
430-
m_engineMutex.unlock();
431-
emit eventLoopEnabledChanged();
432-
}
433-
434362
unsigned int ProjectLoader::downloadedAssets() const
435363
{
436364
return m_downloadedAssets;

src/projectloader.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ class ProjectLoader : public QObject
2929
Q_PROPERTY(unsigned int stageHeight READ stageHeight WRITE setStageHeight NOTIFY stageHeightChanged)
3030
Q_PROPERTY(int cloneLimit READ cloneLimit WRITE setCloneLimit NOTIFY cloneLimitChanged)
3131
Q_PROPERTY(bool spriteFencing READ spriteFencing WRITE setSpriteFencing NOTIFY spriteFencingChanged)
32-
Q_PROPERTY(bool eventLoopEnabled READ eventLoopEnabled WRITE setEventLoopEnabled NOTIFY eventLoopEnabledChanged)
3332
Q_PROPERTY(unsigned int downloadedAssets READ downloadedAssets NOTIFY downloadedAssetsChanged)
3433
Q_PROPERTY(unsigned int assetCount READ assetCount NOTIFY assetCountChanged)
3534

@@ -71,9 +70,6 @@ class ProjectLoader : public QObject
7170
bool spriteFencing() const;
7271
void setSpriteFencing(bool newSpriteFencing);
7372

74-
bool eventLoopEnabled() const;
75-
void setEventLoopEnabled(bool newEventLoopEnabled);
76-
7773
unsigned int downloadedAssets() const;
7874

7975
unsigned int assetCount() const;
@@ -91,7 +87,6 @@ class ProjectLoader : public QObject
9187
void stageHeightChanged();
9288
void cloneLimitChanged();
9389
void spriteFencingChanged();
94-
void eventLoopEnabledChanged();
9590
void downloadedAssetsChanged();
9691
void assetCountChanged();
9792

@@ -102,7 +97,7 @@ class ProjectLoader : public QObject
10297
static void callLoad(ProjectLoader *loader);
10398
void load();
10499
void initTimer();
105-
void emitTick();
100+
void redraw();
106101

107102
int m_timerId = -1;
108103
QString m_fileName;
@@ -113,14 +108,12 @@ class ProjectLoader : public QObject
113108
bool m_loadStatus = false;
114109
StageModel m_stage;
115110
QList<SpriteModel *> m_sprites;
116-
QFuture<void> m_eventLoop;
117111
double m_fps = 30;
118112
bool m_turboMode = false;
119113
unsigned int m_stageWidth = 480;
120114
unsigned int m_stageHeight = 360;
121115
int m_cloneLimit = 300;
122116
bool m_spriteFencing = true;
123-
bool m_eventLoopEnabled = true;
124117
std::atomic<unsigned int> m_downloadedAssets = 0;
125118
std::atomic<unsigned int> m_assetCount = 0;
126119
std::atomic<bool> m_stopLoading = false;

test/projectloader/projectloader_test.cpp

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ class ProjectLoaderTest : public testing::Test
1717
{
1818
static const std::chrono::milliseconds timeout(5000);
1919
auto startTime = std::chrono::steady_clock::now();
20-
loader->setEventLoopEnabled(false);
2120
QSignalSpy fileNameSpy(loader, &ProjectLoader::fileNameChanged);
2221
QSignalSpy loadStatusSpy(loader, &ProjectLoader::loadStatusChanged);
2322
QSignalSpy loadingFinishedSpy(loader, &ProjectLoader::loadingFinished);
@@ -89,10 +88,20 @@ TEST_F(ProjectLoaderTest, StartStop)
8988
loader.stop();
9089
}
9190

91+
TEST_F(ProjectLoaderTest, TimerEvent)
92+
{
93+
ProjectLoader loader;
94+
EngineMock engine;
95+
loader.setEngine(&engine);
96+
QTimerEvent event(0);
97+
98+
EXPECT_CALL(engine, step());
99+
QCoreApplication::sendEvent(&loader, &event);
100+
}
101+
92102
TEST_F(ProjectLoaderTest, Fps)
93103
{
94104
ProjectLoader loader;
95-
loader.setEventLoopEnabled(false);
96105
EngineMock engine;
97106
loader.setEngine(&engine);
98107
ASSERT_EQ(loader.fps(), 30);
@@ -114,7 +123,6 @@ TEST_F(ProjectLoaderTest, Fps)
114123
TEST_F(ProjectLoaderTest, TurboMode)
115124
{
116125
ProjectLoader loader;
117-
loader.setEventLoopEnabled(false);
118126
EngineMock engine;
119127
loader.setEngine(&engine);
120128
ASSERT_FALSE(loader.turboMode());
@@ -135,7 +143,6 @@ TEST_F(ProjectLoaderTest, TurboMode)
135143
TEST_F(ProjectLoaderTest, StageWidth)
136144
{
137145
ProjectLoader loader;
138-
loader.setEventLoopEnabled(false);
139146
EngineMock engine;
140147
loader.setEngine(&engine);
141148
ASSERT_EQ(loader.stageWidth(), 480);
@@ -150,7 +157,6 @@ TEST_F(ProjectLoaderTest, StageWidth)
150157
TEST_F(ProjectLoaderTest, StageHeight)
151158
{
152159
ProjectLoader loader;
153-
loader.setEventLoopEnabled(false);
154160
EngineMock engine;
155161
loader.setEngine(&engine);
156162
ASSERT_EQ(loader.stageHeight(), 360);
@@ -165,7 +171,6 @@ TEST_F(ProjectLoaderTest, StageHeight)
165171
TEST_F(ProjectLoaderTest, CloneLimit)
166172
{
167173
ProjectLoader loader;
168-
loader.setEventLoopEnabled(false);
169174
EngineMock engine;
170175
loader.setEngine(&engine);
171176
ASSERT_EQ(loader.cloneLimit(), 300);
@@ -187,7 +192,6 @@ TEST_F(ProjectLoaderTest, CloneLimit)
187192
TEST_F(ProjectLoaderTest, SpriteFencing)
188193
{
189194
ProjectLoader loader;
190-
loader.setEventLoopEnabled(false);
191195
EngineMock engine;
192196
loader.setEngine(&engine);
193197
ASSERT_TRUE(loader.spriteFencing());
@@ -204,29 +208,3 @@ TEST_F(ProjectLoaderTest, SpriteFencing)
204208
ASSERT_EQ(spy.count(), 1);
205209
ASSERT_TRUE(loader.spriteFencing());
206210
}
207-
208-
TEST_F(ProjectLoaderTest, EventLoopEnabled)
209-
{
210-
ProjectLoader loader;
211-
EngineMock engine;
212-
loader.setEngine(&engine);
213-
ASSERT_TRUE(loader.eventLoopEnabled());
214-
215-
EXPECT_CALL(engine, stopEventLoop());
216-
QSignalSpy spy(&loader, SIGNAL(eventLoopEnabledChanged()));
217-
loader.setEventLoopEnabled(false);
218-
ASSERT_EQ(spy.count(), 1);
219-
ASSERT_FALSE(loader.eventLoopEnabled());
220-
221-
EXPECT_CALL(engine, runEventLoop());
222-
spy.clear();
223-
loader.setEventLoopEnabled(true);
224-
ASSERT_EQ(spy.count(), 1);
225-
ASSERT_TRUE(loader.eventLoopEnabled());
226-
227-
EXPECT_CALL(engine, stopEventLoop());
228-
spy.clear();
229-
loader.setEventLoopEnabled(false);
230-
ASSERT_EQ(spy.count(), 1);
231-
ASSERT_FALSE(loader.eventLoopEnabled());
232-
}

0 commit comments

Comments
 (0)