Skip to content

Commit edbb4ba

Browse files
authored
Merge pull request #274 from scratchcpp/find_stage_by_reserved_name
Use a reserved name for the stage in IEngine::findTarget()
2 parents 43677b9 + 62a9d65 commit edbb4ba

File tree

5 files changed

+22
-9
lines changed

5 files changed

+22
-9
lines changed

include/scratchcpp/iengine.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,11 @@ class LIBSCRATCHCPP_EXPORT IEngine
237237
/*! Returns the target at index. */
238238
virtual Target *targetAt(int index) const = 0;
239239

240-
/*! Returns the index of the target with the given name. */
240+
/*!
241+
* Returns the index of the target with the given name.
242+
* \note Using "Stage" will return the index of the sprite with this name, or nullptr if it doesn't exist.
243+
* Use the "_stage_" reserved name to get the stage, or use the stage() method.
244+
*/
241245
virtual int findTarget(const std::string &targetName) const = 0;
242246

243247
/*! Returns the Stage. */

src/engine/internal/engine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,7 @@ int Engine::findTarget(const std::string &targetName) const
729729
{
730730
int i = 0;
731731
for (auto target : m_targets) {
732-
if (target->name() == targetName)
732+
if ((target->isStage() && targetName == "_stage_") || (!target->isStage() && target->name() == targetName))
733733
return i;
734734
i++;
735735
}

test/compiler/compiler_test.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,7 @@ TEST_F(CompilerTest, ResolveIds)
179179
ASSERT_EQ(engine->broadcasts().size(), 1);
180180

181181
// Stage
182-
ASSERT_NE(engine->findTarget("Stage"), -1);
183-
Stage *stage = dynamic_cast<Stage *>(engine->targetAt(engine->findTarget("Stage")));
182+
Stage *stage = engine->stage();
184183
ASSERT_TRUE(stage);
185184
ASSERT_EQ(stage->blocks().size(), 2);
186185
auto block = stage->greenFlagBlocks().at(0);

test/engine/engine_test.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ TEST(EngineTest, Targets)
440440
t2->setName("Sprite2");
441441
t2->addBlock(block1);
442442
t2->addBlock(block2);
443-
auto t3 = std::make_shared<Target>();
443+
auto t3 = std::make_shared<Stage>();
444444
t3->setName("Stage");
445445
engine.setTargets({ t1, t2, t3 });
446446

@@ -454,7 +454,18 @@ TEST(EngineTest, Targets)
454454
ASSERT_EQ(engine.findTarget("invalid"), -1);
455455
ASSERT_EQ(engine.findTarget("Sprite1"), 0);
456456
ASSERT_EQ(engine.findTarget("Sprite2"), 1);
457+
ASSERT_EQ(engine.findTarget("Stage"), -1);
458+
ASSERT_EQ(engine.findTarget("_stage_"), 2);
459+
460+
auto t4 = std::make_shared<Target>();
461+
t4->setName("Stage");
462+
engine.setTargets({ t1, t2, t4 });
457463
ASSERT_EQ(engine.findTarget("Stage"), 2);
464+
ASSERT_EQ(engine.findTarget("_stage_"), -1);
465+
466+
engine.setTargets({ t1, t2, t3, t4 });
467+
ASSERT_EQ(engine.findTarget("Stage"), 3);
468+
ASSERT_EQ(engine.findTarget("_stage_"), 2);
458469

459470
ASSERT_EQ(t1->engine(), &engine);
460471
ASSERT_EQ(t2->engine(), &engine);
@@ -545,7 +556,7 @@ TEST(EngineTest, Clones)
545556

546557
auto engine = p.engine();
547558

548-
Target *stage = engine->targetAt(engine->findTarget("Stage"));
559+
Stage *stage = engine->stage();
549560
ASSERT_TRUE(stage);
550561

551562
ASSERT_VAR(stage, "clone1");
@@ -592,7 +603,7 @@ TEST(EngineTest, Clones)
592603
593604
auto engine = p.engine();
594605
595-
Target *stage = engine->targetAt(engine->findTarget("Stage"));
606+
Stage *stage = engine->stage();
596607
ASSERT_TRUE(stage);
597608
598609
ASSERT_VAR(stage, "test1");

test/load_project/load_project_test.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,7 @@ TEST(LoadProjectTest, LoadTestProject)
7373
ASSERT_EQ(engine->broadcasts().size(), 1);
7474

7575
// Stage
76-
ASSERT_NE(engine->findTarget("Stage"), -1);
77-
Stage *stage = dynamic_cast<Stage *>(engine->targetAt(engine->findTarget("Stage")));
76+
Stage *stage = engine->stage();
7877
ASSERT_EQ(stage->variables().size(), 2);
7978
ASSERT_EQ(stage->lists().size(), 1);
8079

0 commit comments

Comments
 (0)