Skip to content

Commit d624dc0

Browse files
committed
Implement sensing_setdragmode block
1 parent 121d00d commit d624dc0

File tree

3 files changed

+95
-0
lines changed

3 files changed

+95
-0
lines changed

src/blocks/sensingblocks.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <scratchcpp/executioncontext.h>
99
#include <scratchcpp/value.h>
1010
#include <scratchcpp/input.h>
11+
#include <scratchcpp/field.h>
1112
#include <scratchcpp/sprite.h>
1213
#include <scratchcpp/textbubble.h>
1314
#include <scratchcpp/stringptr.h>
@@ -46,6 +47,7 @@ void SensingBlocks::registerBlocks(IEngine *engine)
4647
engine->addCompileFunction(this, "sensing_mousedown", &compileMouseDown);
4748
engine->addCompileFunction(this, "sensing_mousex", &compileMouseX);
4849
engine->addCompileFunction(this, "sensing_mousey", &compileMouseY);
50+
engine->addCompileFunction(this, "sensing_setdragmode", &compileSetDragMode);
4951
}
5052

5153
void SensingBlocks::onInit(IEngine *engine)
@@ -185,6 +187,28 @@ CompilerValue *SensingBlocks::compileMouseY(Compiler *compiler)
185187
return compiler->addFunctionCallWithCtx("sensing_mousey", Compiler::StaticType::Number);
186188
}
187189

190+
CompilerValue *SensingBlocks::compileSetDragMode(Compiler *compiler)
191+
{
192+
if (compiler->target()->isStage())
193+
return nullptr;
194+
195+
Field *field = compiler->field("DRAG_MODE");
196+
assert(field);
197+
198+
std::string mode = field->value().toString();
199+
CompilerValue *draggable = nullptr;
200+
201+
if (mode == "draggable")
202+
draggable = compiler->addConstValue(true);
203+
else if (mode == "not draggable")
204+
draggable = compiler->addConstValue(false);
205+
else
206+
return nullptr;
207+
208+
compiler->addTargetFunctionCall("sensing_setdragmode", Compiler::StaticType::Void, { Compiler::StaticType::Bool }, { draggable });
209+
return nullptr;
210+
}
211+
188212
void SensingBlocks::onAnswer(const std::string &answer)
189213
{
190214
// https://github.com/scratchfoundation/scratch-vm/blob/6055823f203a696165084b873e661713806583ec/src/blocks/scratch3_sensing.js#L99-L115
@@ -361,3 +385,8 @@ extern "C" double sensing_mousey(ExecutionContext *ctx)
361385
{
362386
return ctx->engine()->mouseY();
363387
}
388+
389+
extern "C" void sensing_setdragmode(Sprite *sprite, bool draggable)
390+
{
391+
sprite->setDraggable(draggable);
392+
}

src/blocks/sensingblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class SensingBlocks : public IExtension
5252
static CompilerValue *compileMouseDown(Compiler *compiler);
5353
static CompilerValue *compileMouseX(Compiler *compiler);
5454
static CompilerValue *compileMouseY(Compiler *compiler);
55+
static CompilerValue *compileSetDragMode(Compiler *compiler);
5556

5657
static void onAnswer(const std::string &answer);
5758
static void enqueueAsk(const std::string &question, Thread *thread);

test/blocks/sensing_blocks_test.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,3 +1297,68 @@ TEST_F(SensingBlocksTest, MouseY)
12971297
ASSERT_EQ(value_toDouble(&value), -78.21);
12981298
value_free(&value);
12991299
}
1300+
1301+
TEST_F(SensingBlocksTest, SetDragMode_Draggable)
1302+
{
1303+
auto sprite = std::make_shared<Sprite>();
1304+
sprite->setDraggable(false);
1305+
1306+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
1307+
builder.addBlock("sensing_setdragmode");
1308+
builder.addDropdownField("DRAG_MODE", "draggable");
1309+
builder.build();
1310+
1311+
builder.run();
1312+
ASSERT_TRUE(sprite->draggable());
1313+
1314+
builder.run();
1315+
ASSERT_TRUE(sprite->draggable());
1316+
}
1317+
1318+
TEST_F(SensingBlocksTest, SetDragMode_NotDraggable)
1319+
{
1320+
auto sprite = std::make_shared<Sprite>();
1321+
sprite->setDraggable(true);
1322+
1323+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
1324+
builder.addBlock("sensing_setdragmode");
1325+
builder.addDropdownField("DRAG_MODE", "not draggable");
1326+
builder.build();
1327+
1328+
builder.run();
1329+
ASSERT_FALSE(sprite->draggable());
1330+
1331+
builder.run();
1332+
ASSERT_FALSE(sprite->draggable());
1333+
}
1334+
1335+
TEST_F(SensingBlocksTest, SetDragMode_Invalid)
1336+
{
1337+
auto sprite = std::make_shared<Sprite>();
1338+
sprite->setDraggable(true);
1339+
1340+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
1341+
builder.addBlock("sensing_setdragmode");
1342+
builder.addDropdownField("DRAG_MODE", "lorem ipsum");
1343+
builder.build();
1344+
1345+
builder.run();
1346+
ASSERT_TRUE(sprite->draggable());
1347+
1348+
sprite->setDraggable(false);
1349+
1350+
builder.run();
1351+
ASSERT_FALSE(sprite->draggable());
1352+
}
1353+
1354+
TEST_F(SensingBlocksTest, SetDragMode_Stage)
1355+
{
1356+
auto stage = std::make_shared<Stage>();
1357+
1358+
ScriptBuilder builder(m_extension.get(), m_engine, stage);
1359+
builder.addBlock("sensing_setdragmode");
1360+
builder.addDropdownField("DRAG_MODE", "draggable");
1361+
builder.build();
1362+
1363+
builder.run();
1364+
}

0 commit comments

Comments
 (0)