Skip to content

Commit 6104c4a

Browse files
committed
Implement looks_gotofrontback block
1 parent 18b4093 commit 6104c4a

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed

src/blocks/looksblocks.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ void LooksBlocks::registerBlocks(IEngine *engine)
5454
engine->addCompileFunction(this, "looks_switchcostumeto", &compileSwitchCostumeTo);
5555
engine->addCompileFunction(this, "looks_nextcostume", &compileNextCostume);
5656
engine->addCompileFunction(this, "looks_switchbackdropto", &compileSwitchBackdropTo);
57+
engine->addCompileFunction(this, "looks_gotofrontback", &compileGoToFrontBack);
5758
}
5859

5960
void LooksBlocks::onInit(IEngine *engine)
@@ -232,6 +233,26 @@ CompilerValue *LooksBlocks::compileSwitchBackdropTo(Compiler *compiler)
232233
return nullptr;
233234
}
234235

236+
CompilerValue *LooksBlocks::compileGoToFrontBack(Compiler *compiler)
237+
{
238+
if (compiler->target()->isStage())
239+
return nullptr;
240+
241+
Field *field = compiler->field("FRONT_BACK");
242+
243+
if (!field)
244+
return nullptr;
245+
246+
const std::string &option = field->value().toString();
247+
248+
if (option == "front")
249+
compiler->addFunctionCallWithCtx("looks_move_to_front");
250+
else if (option == "back")
251+
compiler->addFunctionCallWithCtx("looks_move_to_back");
252+
253+
return nullptr;
254+
}
255+
235256
extern "C" void looks_start_stack_timer(ExecutionContext *ctx, double duration)
236257
{
237258
ctx->stackTimer()->start(duration);
@@ -425,3 +446,15 @@ extern "C" void looks_switchbackdropto(ExecutionContext *ctx, const ValueData *b
425446
looks_set_costume_by_index(stage, value_toLong(backdrop) - 1);
426447
}
427448
}
449+
450+
extern "C" void looks_move_to_front(ExecutionContext *ctx)
451+
{
452+
Target *target = ctx->thread()->target();
453+
ctx->engine()->moveDrawableToFront(target);
454+
}
455+
456+
extern "C" void looks_move_to_back(ExecutionContext *ctx)
457+
{
458+
Target *target = ctx->thread()->target();
459+
ctx->engine()->moveDrawableToBack(target);
460+
}

src/blocks/looksblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class LooksBlocks : public IExtension
4242
static CompilerValue *compileSwitchCostumeTo(Compiler *compiler);
4343
static CompilerValue *compileNextCostume(Compiler *compiler);
4444
static CompilerValue *compileSwitchBackdropTo(Compiler *compiler);
45+
static CompilerValue *compileGoToFrontBack(Compiler *compiler);
4546
};
4647

4748
} // namespace libscratchcpp

test/blocks/looks_blocks_test.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,3 +1609,86 @@ TEST_F(LooksBlocksTest, SwitchBackdropTo_Stage)
16091609
thread.run();
16101610
ASSERT_EQ(stage->costumeIndex(), 0);
16111611
}
1612+
1613+
TEST_F(LooksBlocksTest, GoToFrontBack_MoveSpriteToFront)
1614+
{
1615+
auto stage = std::make_shared<Stage>();
1616+
auto sprite = std::make_shared<Sprite>();
1617+
auto sprite1 = std::make_shared<Sprite>();
1618+
auto sprite2 = std::make_shared<Sprite>();
1619+
auto sprite3 = std::make_shared<Sprite>();
1620+
m_engine->setTargets({ stage, sprite, sprite1, sprite2, sprite3 });
1621+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
1622+
1623+
builder.addBlock("looks_gotofrontback");
1624+
builder.addDropdownField("FRONT_BACK", "front");
1625+
builder.build();
1626+
1627+
m_engine->moveDrawableToBack(sprite.get());
1628+
1629+
builder.run();
1630+
std::initializer_list<int> layers = { sprite->layerOrder(), sprite1->layerOrder(), sprite2->layerOrder(), sprite3->layerOrder() };
1631+
ASSERT_EQ(sprite->layerOrder(), std::max(layers));
1632+
1633+
builder.run();
1634+
ASSERT_EQ(sprite->layerOrder(), std::max(layers));
1635+
}
1636+
1637+
TEST_F(LooksBlocksTest, GoToFrontBack_MoveSpriteToBack)
1638+
{
1639+
auto stage = std::make_shared<Stage>();
1640+
auto sprite = std::make_shared<Sprite>();
1641+
auto sprite1 = std::make_shared<Sprite>();
1642+
auto sprite2 = std::make_shared<Sprite>();
1643+
auto sprite3 = std::make_shared<Sprite>();
1644+
m_engine->setTargets({ stage, sprite, sprite1, sprite2, sprite3 });
1645+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
1646+
1647+
builder.addBlock("looks_gotofrontback");
1648+
builder.addDropdownField("FRONT_BACK", "back");
1649+
builder.build();
1650+
1651+
m_engine->moveDrawableToFront(sprite.get());
1652+
1653+
builder.run();
1654+
ASSERT_EQ(sprite->layerOrder(), 1);
1655+
1656+
builder.run();
1657+
ASSERT_EQ(sprite->layerOrder(), 1);
1658+
}
1659+
1660+
TEST_F(LooksBlocksTest, GoToFrontBack_MoveStageToFront)
1661+
{
1662+
auto stage = std::make_shared<Stage>();
1663+
auto sprite = std::make_shared<Sprite>();
1664+
auto sprite1 = std::make_shared<Sprite>();
1665+
auto sprite2 = std::make_shared<Sprite>();
1666+
auto sprite3 = std::make_shared<Sprite>();
1667+
m_engine->setTargets({ stage, sprite, sprite1, sprite2, sprite3 });
1668+
ScriptBuilder builder(m_extension.get(), m_engine, stage);
1669+
1670+
builder.addBlock("looks_gotofrontback");
1671+
builder.addDropdownField("FRONT_BACK", "front");
1672+
builder.build();
1673+
1674+
builder.run();
1675+
ASSERT_EQ(stage->layerOrder(), 0);
1676+
}
1677+
1678+
TEST_F(LooksBlocksTest, GoToFrontBack_MoveStageToBack)
1679+
{
1680+
auto stage = std::make_shared<Stage>();
1681+
auto sprite = std::make_shared<Sprite>();
1682+
auto sprite1 = std::make_shared<Sprite>();
1683+
auto sprite2 = std::make_shared<Sprite>();
1684+
auto sprite3 = std::make_shared<Sprite>();
1685+
m_engine->setTargets({ stage, sprite, sprite1, sprite2, sprite3 });
1686+
ScriptBuilder builder(m_extension.get(), m_engine, stage);
1687+
1688+
builder.addBlock("looks_gotofrontback");
1689+
builder.addDropdownField("FRONT_BACK", "back");
1690+
builder.build();
1691+
1692+
builder.run();
1693+
ASSERT_EQ(sprite->layerOrder(), 0);
1694+
}

0 commit comments

Comments
 (0)