From 3effcff4f46c9dd761a7fa700f8f7b05221bbee3 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sat, 5 Oct 2024 10:04:46 +0200 Subject: [PATCH 1/5] Set version to 0.7.2 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a50f4f5..5b511f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.14) -project(scratchcpp-render VERSION 0.7.1 LANGUAGES CXX) +project(scratchcpp-render VERSION 0.7.2 LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOUIC ON) From 9e156c3efc0ac05fe2f2d0526cd6ed387d77a805 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sat, 5 Oct 2024 10:06:12 +0200 Subject: [PATCH 2/5] Update libscratchcpp to v0.11.2 --- libscratchcpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libscratchcpp b/libscratchcpp index 6544182..4f55c6f 160000 --- a/libscratchcpp +++ b/libscratchcpp @@ -1 +1 @@ -Subproject commit 654418270f90d5f80af77c6819e620b52eb161e3 +Subproject commit 4f55c6f348e649214ccad769f27bbaba1e8081b1 From 6339aa38c90ea584dcd279a2902276907c080477 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sat, 5 Oct 2024 10:21:20 +0200 Subject: [PATCH 3/5] fix #150: Revert "ProjectLoader: Clear sprites before loading project" This reverts commit 594b90d3b92f4e8f9bad44027bbf28f5fda2bb4a. Resolves #150 --- src/projectloader.cpp | 8 -------- test/projectloader/projectloader_test.cpp | 10 +++++----- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/projectloader.cpp b/src/projectloader.cpp index d8c6fea..85a53ee 100644 --- a/src/projectloader.cpp +++ b/src/projectloader.cpp @@ -251,11 +251,6 @@ void ProjectLoader::callLoad(ProjectLoader *loader) void ProjectLoader::load() { m_unpositionedMonitors.clear(); - m_sprites.clear(); - m_clones.clear(); - emit spritesChanged(); - emit clonesChanged(); - m_loadStatus = m_project.load(); m_engineMutex.lock(); m_engine = m_project.engine().get(); @@ -267,7 +262,6 @@ void ProjectLoader::load() emit loadingFinished(); emit engineChanged(); emit spritesChanged(); - emit clonesChanged(); return; } @@ -314,7 +308,6 @@ void ProjectLoader::load() emit loadingFinished(); emit engineChanged(); emit spritesChanged(); - emit clonesChanged(); return; } @@ -334,7 +327,6 @@ void ProjectLoader::load() emit engineChanged(); emit stageChanged(); emit spritesChanged(); - emit clonesChanged(); } void ProjectLoader::initTimer() diff --git a/test/projectloader/projectloader_test.cpp b/test/projectloader/projectloader_test.cpp index 5684efa..db430a3 100644 --- a/test/projectloader/projectloader_test.cpp +++ b/test/projectloader/projectloader_test.cpp @@ -57,8 +57,8 @@ class ProjectLoaderTest : public testing::Test ASSERT_EQ(loadingFinishedSpy.count(), 1); ASSERT_EQ(engineSpy.count(), 2); ASSERT_EQ(stageSpy.count(), 1); - ASSERT_EQ(spritesSpy.count(), 3); - ASSERT_EQ(clonesSpy.count(), 3); + ASSERT_EQ(spritesSpy.count(), 2); + ASSERT_EQ(clonesSpy.count(), 1); ASSERT_EQ(monitorsSpy.count(), loader->monitorList().size() + 1); ASSERT_EQ(monitorAddedSpy.count(), loader->monitorList().size()); ASSERT_EQ(unsupportedBlocksSpy.count(), 1); @@ -137,13 +137,13 @@ TEST_F(ProjectLoaderTest, Clones) load(&loader, "clones.sb3"); ASSERT_TRUE(cloneCreatedSpy.empty()); ASSERT_TRUE(cloneDeletedSpy.empty()); - ASSERT_EQ(clonesChangedSpy.count(), 3); + ASSERT_EQ(clonesChangedSpy.count(), 1); auto engine = loader.engine(); engine->run(); ASSERT_EQ(cloneCreatedSpy.count(), 3); ASSERT_EQ(cloneDeletedSpy.count(), 0); - ASSERT_EQ(clonesChangedSpy.count(), 6); + ASSERT_EQ(clonesChangedSpy.count(), 4); const auto &sprites = loader.spriteList(); const auto &clones = loader.cloneList(); @@ -162,7 +162,7 @@ TEST_F(ProjectLoaderTest, Clones) clones[1]->sprite()->deleteClone(); ASSERT_EQ(cloneCreatedSpy.count(), 3); ASSERT_EQ(cloneDeletedSpy.count(), 1); - ASSERT_EQ(clonesChangedSpy.count(), 7); + ASSERT_EQ(clonesChangedSpy.count(), 5); ASSERT_EQ(clones.size(), 2); } From 9a2fecabf279c502424774954c6285e57de67866 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sat, 5 Oct 2024 10:47:40 +0200 Subject: [PATCH 4/5] Accept null sprite and stage in models --- src/spritemodel.cpp | 43 +++++++++++++++++++++---------------------- src/stagemodel.cpp | 43 +++++++++++++++++++++---------------------- 2 files changed, 42 insertions(+), 44 deletions(-) diff --git a/src/spritemodel.cpp b/src/spritemodel.cpp index 9aca0db..ecee36a 100644 --- a/src/spritemodel.cpp +++ b/src/spritemodel.cpp @@ -20,35 +20,34 @@ SpriteModel::SpriteModel(QObject *parent) : void SpriteModel::init(libscratchcpp::Sprite *sprite) { - if (!sprite) - return; - m_sprite = sprite; - m_sprite->bubble()->typeChanged().connect([this](libscratchcpp::TextBubble::Type type) { - if (type == libscratchcpp::TextBubble::Type::Say) { - if (m_bubbleType == TextBubbleShape::Type::Say) - return; + if (m_sprite) { + m_sprite->bubble()->typeChanged().connect([this](libscratchcpp::TextBubble::Type type) { + if (type == libscratchcpp::TextBubble::Type::Say) { + if (m_bubbleType == TextBubbleShape::Type::Say) + return; - m_bubbleType = TextBubbleShape::Type::Say; - } else { - if (m_bubbleType == TextBubbleShape::Type::Think) - return; + m_bubbleType = TextBubbleShape::Type::Say; + } else { + if (m_bubbleType == TextBubbleShape::Type::Think) + return; - m_bubbleType = TextBubbleShape::Type::Think; - } + m_bubbleType = TextBubbleShape::Type::Think; + } - emit bubbleTypeChanged(); - }); + emit bubbleTypeChanged(); + }); - m_sprite->bubble()->textChanged().connect([this](const std::string &text) { - QString newText = QString::fromStdString(text); + m_sprite->bubble()->textChanged().connect([this](const std::string &text) { + QString newText = QString::fromStdString(text); - if (m_bubbleText != newText) { - m_bubbleText = newText; - emit bubbleTextChanged(); - } - }); + if (m_bubbleText != newText) { + m_bubbleText = newText; + emit bubbleTextChanged(); + } + }); + } } void SpriteModel::deinitClone() diff --git a/src/stagemodel.cpp b/src/stagemodel.cpp index 31f8f58..987c807 100644 --- a/src/stagemodel.cpp +++ b/src/stagemodel.cpp @@ -16,35 +16,34 @@ StageModel::StageModel(QObject *parent) : void StageModel::init(libscratchcpp::Stage *stage) { - if (!stage) - return; - m_stage = stage; - m_stage->bubble()->typeChanged().connect([this](libscratchcpp::TextBubble::Type type) { - if (type == libscratchcpp::TextBubble::Type::Say) { - if (m_bubbleType == TextBubbleShape::Type::Say) - return; + if (m_stage) { + m_stage->bubble()->typeChanged().connect([this](libscratchcpp::TextBubble::Type type) { + if (type == libscratchcpp::TextBubble::Type::Say) { + if (m_bubbleType == TextBubbleShape::Type::Say) + return; - m_bubbleType = TextBubbleShape::Type::Say; - } else { - if (m_bubbleType == TextBubbleShape::Type::Think) - return; + m_bubbleType = TextBubbleShape::Type::Say; + } else { + if (m_bubbleType == TextBubbleShape::Type::Think) + return; - m_bubbleType = TextBubbleShape::Type::Think; - } + m_bubbleType = TextBubbleShape::Type::Think; + } - emit bubbleTypeChanged(); - }); + emit bubbleTypeChanged(); + }); - m_stage->bubble()->textChanged().connect([this](const std::string &text) { - QString newText = QString::fromStdString(text); + m_stage->bubble()->textChanged().connect([this](const std::string &text) { + QString newText = QString::fromStdString(text); - if (m_bubbleText != newText) { - m_bubbleText = newText; - emit bubbleTextChanged(); - } - }); + if (m_bubbleText != newText) { + m_bubbleText = newText; + emit bubbleTextChanged(); + } + }); + } } void StageModel::onCostumeChanged(libscratchcpp::Costume *costume) From 4e5a75ebcaaa39861ea4d5149a05cf98ea3ea3f4 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sat, 5 Oct 2024 10:48:06 +0200 Subject: [PATCH 5/5] ProjectLoader: Clear loaded project before closing app --- src/projectloader.cpp | 85 +++++++++++++++++++++++-------------------- src/projectloader.h | 1 + 2 files changed, 47 insertions(+), 39 deletions(-) diff --git a/src/projectloader.cpp b/src/projectloader.cpp index 85a53ee..b6038df 100644 --- a/src/projectloader.cpp +++ b/src/projectloader.cpp @@ -32,6 +32,8 @@ ProjectLoader::ProjectLoader(QObject *parent) : } }); + connect(qApp, &QCoreApplication::aboutToQuit, this, &ProjectLoader::clear); + initTimer(); // Register pen blocks @@ -64,45 +66,7 @@ void ProjectLoader::setFileName(const QString &newFileName) m_fileName = newFileName; - // Stop the project - if (m_engine) - m_engine->stop(); - - // Reset stage model - m_stage.init(nullptr); - - if (m_stage.renderedTarget()) - m_stage.renderedTarget()->update(); - - // Delete old sprites - for (SpriteModel *sprite : m_sprites) - sprite->deleteLater(); - - m_sprites.clear(); - emit spritesChanged(); - - // Delete old clones - for (SpriteModel *clone : m_clones) - deleteCloneObject(clone); - - m_clones.clear(); - emit clonesChanged(); - - // Delete old monitors - for (MonitorModel *monitor : m_monitors) { - emit monitorRemoved(monitor); - monitor->deleteLater(); - } - - m_monitors.clear(); - emit monitorsChanged(); - - // Clear the engine - if (m_engine) - m_engine->clear(); - - m_engine = nullptr; - emit engineChanged(); + clear(); m_project.setFileName(m_fileName.toStdString()); m_loadStatus = false; @@ -248,6 +212,49 @@ void ProjectLoader::callLoad(ProjectLoader *loader) loader->load(); } +void ProjectLoader::clear() +{ + // Stop the project + if (m_engine) + m_engine->stop(); + + // Reset stage model + m_stage.init(nullptr); + + if (m_stage.renderedTarget()) + m_stage.renderedTarget()->update(); + + // Delete old sprites + for (SpriteModel *sprite : m_sprites) + sprite->deleteLater(); + + m_sprites.clear(); + emit spritesChanged(); + + // Delete old clones + for (SpriteModel *clone : m_clones) + deleteCloneObject(clone); + + m_clones.clear(); + emit clonesChanged(); + + // Delete old monitors + for (MonitorModel *monitor : m_monitors) { + emit monitorRemoved(monitor); + monitor->deleteLater(); + } + + m_monitors.clear(); + emit monitorsChanged(); + + // Clear the engine + if (m_engine) + m_engine->clear(); + + m_engine = nullptr; + emit engineChanged(); +} + void ProjectLoader::load() { m_unpositionedMonitors.clear(); diff --git a/src/projectloader.h b/src/projectloader.h index 21f95e6..a86c407 100644 --- a/src/projectloader.h +++ b/src/projectloader.h @@ -130,6 +130,7 @@ class ProjectLoader : public QObject private: static void callLoad(ProjectLoader *loader); + void clear(); void load(); void initTimer(); void redraw();