Skip to content

Commit 9002d3e

Browse files
committed
fix #104: Properly clean up before loading another project
1 parent 068af9a commit 9002d3e

File tree

3 files changed

+54
-17
lines changed

3 files changed

+54
-17
lines changed

src/projectloader.cpp

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,40 @@ void ProjectLoader::setFileName(const QString &newFileName)
6464

6565
m_fileName = newFileName;
6666

67+
// Stop the project
68+
if (m_engine)
69+
m_engine->stop();
70+
71+
// Delete old sprites
72+
for (SpriteModel *sprite : m_sprites)
73+
sprite->deleteLater();
74+
75+
m_sprites.clear();
76+
emit spritesChanged();
77+
78+
// Delete old clones
79+
for (SpriteModel *clone : m_clones)
80+
deleteCloneObject(clone);
81+
82+
m_clones.clear();
83+
emit clonesChanged();
84+
85+
// Delete old monitors
86+
for (MonitorModel *monitor : m_monitors) {
87+
emit monitorRemoved(monitor);
88+
monitor->deleteLater();
89+
}
90+
91+
m_monitors.clear();
92+
emit monitorsChanged();
93+
94+
// Clear the engine
95+
if (m_engine)
96+
m_engine->clear();
97+
98+
m_engine = nullptr;
99+
emit engineChanged();
100+
67101
m_project.setScratchVersion(ScratchVersion::Scratch3);
68102
m_project.setFileName(m_fileName.toStdString());
69103
m_loadStatus = false;
@@ -198,12 +232,6 @@ void ProjectLoader::load()
198232
m_engineMutex.lock();
199233
m_engine = m_project.engine().get();
200234

201-
// Delete old sprites
202-
for (SpriteModel *sprite : m_sprites)
203-
sprite->deleteLater();
204-
205-
m_sprites.clear();
206-
207235
if (!m_engine || m_stopLoading) {
208236
m_engineMutex.unlock();
209237
emit fileNameChanged();
@@ -313,13 +341,18 @@ void ProjectLoader::addClone(SpriteModel *model)
313341
emit clonesChanged();
314342
}
315343

316-
void ProjectLoader::deleteClone(SpriteModel *model)
344+
void ProjectLoader::deleteCloneObject(SpriteModel *model)
317345
{
318-
m_clones.removeAll(model);
319346
emit cloneDeleted(model);
320347
Q_ASSERT(model->renderedTarget());
321348
model->renderedTarget()->deinitClone();
322349
model->deleteLater();
350+
}
351+
352+
void ProjectLoader::deleteClone(SpriteModel *model)
353+
{
354+
m_clones.removeAll(model);
355+
deleteCloneObject(model);
323356
emit clonesChanged();
324357
}
325358

src/projectloader.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ class ProjectLoader : public QObject
120120
void initTimer();
121121
void redraw();
122122
void addClone(SpriteModel *model);
123+
void deleteCloneObject(SpriteModel *model);
123124
void deleteClone(SpriteModel *model);
124125
void addMonitor(libscratchcpp::Monitor *monitor);
125126
void removeMonitor(libscratchcpp::Monitor *monitor, libscratchcpp::IMonitorHandler *iface);

test/projectloader/projectloader_test.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class ProjectLoaderTest : public testing::Test
2929
QSignalSpy engineSpy(loader, &ProjectLoader::engineChanged);
3030
QSignalSpy stageSpy(loader, &ProjectLoader::stageChanged);
3131
QSignalSpy spritesSpy(loader, &ProjectLoader::spritesChanged);
32+
QSignalSpy clonesSpy(loader, &ProjectLoader::clonesChanged);
3233
QSignalSpy monitorsSpy(loader, &ProjectLoader::monitorsChanged);
3334
QSignalSpy monitorAddedSpy(loader, &ProjectLoader::monitorAdded);
3435

@@ -37,10 +38,11 @@ class ProjectLoaderTest : public testing::Test
3738
ASSERT_EQ(fileNameSpy.count(), 1);
3839
ASSERT_EQ(loadStatusSpy.count(), 1);
3940
ASSERT_TRUE(loadingFinishedSpy.empty());
40-
ASSERT_TRUE(engineSpy.empty());
41+
ASSERT_EQ(engineSpy.count(), 1);
4142
ASSERT_TRUE(stageSpy.empty());
42-
ASSERT_TRUE(spritesSpy.empty());
43-
ASSERT_TRUE(monitorsSpy.empty());
43+
ASSERT_EQ(spritesSpy.count(), 1);
44+
ASSERT_EQ(clonesSpy.count(), 1);
45+
ASSERT_EQ(monitorsSpy.count(), 1);
4446
ASSERT_TRUE(monitorAddedSpy.empty());
4547
ASSERT_EQ(loader->fileName(), fileName);
4648
ASSERT_FALSE(loader->loadStatus());
@@ -52,10 +54,11 @@ class ProjectLoaderTest : public testing::Test
5254
ASSERT_EQ(fileNameSpy.count(), 1);
5355
ASSERT_EQ(loadStatusSpy.count(), 2);
5456
ASSERT_EQ(loadingFinishedSpy.count(), 1);
55-
ASSERT_EQ(engineSpy.count(), 1);
57+
ASSERT_EQ(engineSpy.count(), 2);
5658
ASSERT_EQ(stageSpy.count(), 1);
57-
ASSERT_EQ(spritesSpy.count(), 1);
58-
ASSERT_EQ(monitorsSpy.count(), loader->monitorList().size());
59+
ASSERT_EQ(spritesSpy.count(), 2);
60+
ASSERT_EQ(clonesSpy.count(), 1);
61+
ASSERT_EQ(monitorsSpy.count(), loader->monitorList().size() + 1);
5962
ASSERT_EQ(monitorAddedSpy.count(), loader->monitorList().size());
6063
}
6164
};
@@ -113,13 +116,13 @@ TEST_F(ProjectLoaderTest, Clones)
113116
load(&loader, "clones.sb3");
114117
ASSERT_TRUE(cloneCreatedSpy.empty());
115118
ASSERT_TRUE(cloneDeletedSpy.empty());
116-
ASSERT_TRUE(clonesChangedSpy.empty());
119+
ASSERT_EQ(clonesChangedSpy.count(), 1);
117120

118121
auto engine = loader.engine();
119122
engine->run();
120123
ASSERT_EQ(cloneCreatedSpy.count(), 3);
121124
ASSERT_EQ(cloneDeletedSpy.count(), 0);
122-
ASSERT_EQ(clonesChangedSpy.count(), 3);
125+
ASSERT_EQ(clonesChangedSpy.count(), 4);
123126

124127
const auto &sprites = loader.spriteList();
125128
const auto &clones = loader.cloneList();
@@ -138,7 +141,7 @@ TEST_F(ProjectLoaderTest, Clones)
138141
clones[1]->sprite()->deleteClone();
139142
ASSERT_EQ(cloneCreatedSpy.count(), 3);
140143
ASSERT_EQ(cloneDeletedSpy.count(), 1);
141-
ASSERT_EQ(clonesChangedSpy.count(), 4);
144+
ASSERT_EQ(clonesChangedSpy.count(), 5);
142145
ASSERT_EQ(clones.size(), 2);
143146
}
144147

0 commit comments

Comments
 (0)