diff --git a/src/internal/scratch3reader.cpp b/src/internal/scratch3reader.cpp index 55f50d26..1a36531c 100644 --- a/src/internal/scratch3reader.cpp +++ b/src/internal/scratch3reader.cpp @@ -193,10 +193,6 @@ bool Scratch3Reader::load() // TODO: Add comments - // currentCostume - READER_STEP(step, "target -> currentCostume"); - target->setCurrentCostume(jsonTarget["currentCostume"]); - // costumes READER_STEP(step, "target -> costumes"); auto costumes = jsonTarget["costumes"]; @@ -218,6 +214,10 @@ bool Scratch3Reader::load() target->addCostume(costume); } + // currentCostume + READER_STEP(step, "target -> currentCostume"); + target->setCurrentCostume(jsonToValue(jsonTarget["currentCostume"]).toInt() + 1); + // sounds READER_STEP(step, "target -> sounds"); auto sounds = jsonTarget["sounds"]; diff --git a/src/scratch/target.cpp b/src/scratch/target.cpp index ff2ddc14..ad0168e3 100644 --- a/src/scratch/target.cpp +++ b/src/scratch/target.cpp @@ -203,7 +203,8 @@ int Target::currentCostume() const /*! Sets the ID of the current costume. */ void Target::setCurrentCostume(int newCostume) { - impl->currentCostume = newCostume; + if (newCostume > 0 && newCostume <= costumes().size()) + impl->currentCostume = newCostume; } /*! Returns the list of costumes. */ diff --git a/src/scratch/target_p.h b/src/scratch/target_p.h index 4ea13e05..da4126f2 100644 --- a/src/scratch/target_p.h +++ b/src/scratch/target_p.h @@ -26,7 +26,7 @@ struct TargetPrivate std::vector> variables; std::vector> lists; std::vector> blocks; - int currentCostume = 1; + int currentCostume = 0; std::vector> costumes; std::vector> sounds; int layerOrder = 0; diff --git a/test/load_project/load_project_test.cpp b/test/load_project/load_project_test.cpp index de3d04c6..6dcdafdd 100644 --- a/test/load_project/load_project_test.cpp +++ b/test/load_project/load_project_test.cpp @@ -40,7 +40,7 @@ TEST(LoadProjectTest, EmptyProject) ASSERT_EQ(stage->blocks().size(), 0); ASSERT_EQ(stage->costumes().size(), 1); // TODO: Add comments - ASSERT_EQ(stage->currentCostume(), 0); + ASSERT_EQ(stage->currentCostume(), 1); ASSERT_EQ(stage->sounds().size(), 0); ASSERT_EQ(stage->layerOrder(), 0); ASSERT_EQ(stage->volume(), 100); @@ -104,6 +104,7 @@ TEST(LoadProjectTest, LoadTestProject) ASSERT_EQ(sprite1->lists().size(), 1); ASSERT_EQ(sprite1->blocks().size(), 18); ASSERT_EQ(sprite1->costumes().size(), 2); + ASSERT_EQ(sprite1->currentCostume(), 2); ASSERT_EQ(sprite1->sounds().size(), 1); ASSERT_TRUE(sprite1->visible()); ASSERT_EQ(sprite1->x(), 0); diff --git a/test/scratch_classes/sprite_test.cpp b/test/scratch_classes/sprite_test.cpp index e71b1f4d..60b9f468 100644 --- a/test/scratch_classes/sprite_test.cpp +++ b/test/scratch_classes/sprite_test.cpp @@ -44,6 +44,8 @@ TEST(SpriteTest, Clone) sprite.addList(list1); sprite.addList(list2); + sprite.addCostume(std::make_shared("", "", "")); + sprite.addCostume(std::make_shared("", "", "")); sprite.setCurrentCostume(2); sprite.setLayerOrder(5); sprite.setVolume(50); diff --git a/test/scratch_classes/target_test.cpp b/test/scratch_classes/target_test.cpp index 79790356..39730d98 100644 --- a/test/scratch_classes/target_test.cpp +++ b/test/scratch_classes/target_test.cpp @@ -178,9 +178,31 @@ TEST(TargetTest, Blocks) TEST(TargetTest, CurrentCostume) { Target target; + ASSERT_EQ(target.currentCostume(), 0); + + target.setCurrentCostume(1); + ASSERT_EQ(target.currentCostume(), 0); + + target.setCurrentCostume(2); + ASSERT_EQ(target.currentCostume(), 0); + + target.addCostume(std::make_shared("", "", "")); + ASSERT_EQ(target.currentCostume(), 0); + + target.setCurrentCostume(1); + ASSERT_EQ(target.currentCostume(), 1); + + target.setCurrentCostume(2); + ASSERT_EQ(target.currentCostume(), 1); + + target.addCostume(std::make_shared("", "", "")); ASSERT_EQ(target.currentCostume(), 1); - target.setCurrentCostume(5); - ASSERT_EQ(target.currentCostume(), 5); + + target.setCurrentCostume(2); + ASSERT_EQ(target.currentCostume(), 2); + + target.setCurrentCostume(3); + ASSERT_EQ(target.currentCostume(), 2); } TEST(TargetTest, Costumes)