Skip to content

Commit ae960e6

Browse files
authored
Merge pull request #268 from scratchcpp/sensing_setdragmode_block
Implement set drag mode block
2 parents 5191183 + c37349f commit ae960e6

File tree

3 files changed

+105
-2
lines changed

3 files changed

+105
-2
lines changed

src/blocks/sensingblocks.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ void SensingBlocks::registerBlocks(IEngine *engine)
2828
engine->addCompileFunction(this, "sensing_mousedown", &compileMouseDown);
2929
engine->addCompileFunction(this, "sensing_mousex", &compileMouseX);
3030
engine->addCompileFunction(this, "sensing_mousey", &compileMouseY);
31+
engine->addCompileFunction(this, "sensing_setdragmode", &compileSetDragMode);
3132
engine->addCompileFunction(this, "sensing_timer", &compileTimer);
3233
engine->addCompileFunction(this, "sensing_resettimer", &compileResetTimer);
3334
engine->addCompileFunction(this, "sensing_current", &compileCurrent);
@@ -39,6 +40,7 @@ void SensingBlocks::registerBlocks(IEngine *engine)
3940

4041
// Fields
4142
engine->addField(this, "CURRENTMENU", CURRENTMENU);
43+
engine->addField(this, "DRAG_MODE", DRAG_MODE);
4244

4345
// Field values
4446
engine->addFieldValue(this, "YEAR", YEAR);
@@ -48,6 +50,8 @@ void SensingBlocks::registerBlocks(IEngine *engine)
4850
engine->addFieldValue(this, "HOUR", HOUR);
4951
engine->addFieldValue(this, "MINUTE", MINUTE);
5052
engine->addFieldValue(this, "SECOND", SECOND);
53+
engine->addFieldValue(this, "draggable", Draggable);
54+
engine->addFieldValue(this, "not draggable", NotDraggable);
5155
}
5256

5357
void SensingBlocks::compileDistanceTo(Compiler *compiler)
@@ -92,6 +96,24 @@ void SensingBlocks::compileMouseY(Compiler *compiler)
9296
compiler->addFunctionCall(&mouseY);
9397
}
9498

99+
void SensingBlocks::compileSetDragMode(Compiler *compiler)
100+
{
101+
int option = compiler->field(DRAG_MODE)->specialValueId();
102+
103+
switch (option) {
104+
case Draggable:
105+
compiler->addFunctionCall(&setDraggableMode);
106+
break;
107+
108+
case NotDraggable:
109+
compiler->addFunctionCall(&setNotDraggableMode);
110+
break;
111+
112+
default:
113+
break;
114+
}
115+
}
116+
95117
void SensingBlocks::compileTimer(Compiler *compiler)
96118
{
97119
compiler->addFunctionCall(&timer);
@@ -169,6 +191,22 @@ unsigned int SensingBlocks::mouseY(VirtualMachine *vm)
169191
return 0;
170192
}
171193

194+
unsigned int SensingBlocks::setDraggableMode(VirtualMachine *vm)
195+
{
196+
if (Sprite *sprite = dynamic_cast<Sprite *>(vm->target()))
197+
sprite->setDraggable(true);
198+
199+
return 0;
200+
}
201+
202+
unsigned int SensingBlocks::setNotDraggableMode(VirtualMachine *vm)
203+
{
204+
if (Sprite *sprite = dynamic_cast<Sprite *>(vm->target()))
205+
sprite->setDraggable(false);
206+
207+
return 0;
208+
}
209+
172210
unsigned int SensingBlocks::distanceTo(VirtualMachine *vm)
173211
{
174212
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());

src/blocks/sensingblocks.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ class SensingBlocks : public IBlockSection
2020

2121
enum Fields
2222
{
23-
CURRENTMENU
23+
CURRENTMENU,
24+
DRAG_MODE
2425
};
2526

2627
enum FieldValues
@@ -31,7 +32,9 @@ class SensingBlocks : public IBlockSection
3132
DAYOFWEEK,
3233
HOUR,
3334
MINUTE,
34-
SECOND
35+
SECOND,
36+
Draggable,
37+
NotDraggable
3538
};
3639

3740
std::string name() const override;
@@ -43,6 +46,7 @@ class SensingBlocks : public IBlockSection
4346
static void compileMouseDown(Compiler *compiler);
4447
static void compileMouseX(Compiler *compiler);
4548
static void compileMouseY(Compiler *compiler);
49+
static void compileSetDragMode(Compiler *compiler);
4650
static void compileTimer(Compiler *compiler);
4751
static void compileResetTimer(Compiler *compiler);
4852
static void compileCurrent(Compiler *compiler);
@@ -53,6 +57,9 @@ class SensingBlocks : public IBlockSection
5357
static unsigned int mouseX(VirtualMachine *vm);
5458
static unsigned int mouseY(VirtualMachine *vm);
5559

60+
static unsigned int setDraggableMode(VirtualMachine *vm);
61+
static unsigned int setNotDraggableMode(VirtualMachine *vm);
62+
5663
static unsigned int distanceTo(VirtualMachine *vm);
5764
static unsigned int distanceToByIndex(VirtualMachine *vm);
5865
static unsigned int distanceToMousePointer(VirtualMachine *vm);

test/blocks/sensing_blocks_test.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ TEST_F(SensingBlocksTest, RegisterBlocks)
102102
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_mousedown", &SensingBlocks::compileMouseDown));
103103
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_mousex", &SensingBlocks::compileMouseX));
104104
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_mousey", &SensingBlocks::compileMouseY));
105+
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_setdragmode", &SensingBlocks::compileSetDragMode));
105106
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_timer", &SensingBlocks::compileTimer));
106107
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_resettimer", &SensingBlocks::compileResetTimer));
107108
EXPECT_CALL(m_engineMock, addCompileFunction(m_section.get(), "sensing_current", &SensingBlocks::compileCurrent));
@@ -113,6 +114,7 @@ TEST_F(SensingBlocksTest, RegisterBlocks)
113114

114115
// Fields
115116
EXPECT_CALL(m_engineMock, addField(m_section.get(), "CURRENTMENU", SensingBlocks::CURRENTMENU));
117+
EXPECT_CALL(m_engineMock, addField(m_section.get(), "DRAG_MODE", SensingBlocks::DRAG_MODE));
116118

117119
// Field values
118120
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "YEAR", SensingBlocks::YEAR));
@@ -122,6 +124,8 @@ TEST_F(SensingBlocksTest, RegisterBlocks)
122124
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "HOUR", SensingBlocks::HOUR));
123125
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "MINUTE", SensingBlocks::MINUTE));
124126
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "SECOND", SensingBlocks::SECOND));
127+
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "draggable", SensingBlocks::Draggable));
128+
EXPECT_CALL(m_engineMock, addFieldValue(m_section.get(), "not draggable", SensingBlocks::NotDraggable));
125129

126130
m_section->registerBlocks(&m_engineMock);
127131
}
@@ -465,6 +469,60 @@ TEST_F(SensingBlocksTest, MouseYImpl)
465469
ASSERT_EQ(vm.getInput(0, 1)->toDouble(), -95.564);
466470
}
467471

472+
TEST_F(SensingBlocksTest, SetDragMode)
473+
{
474+
Compiler compiler(&m_engineMock);
475+
476+
// set drag mode [draggable]
477+
auto block1 = std::make_shared<Block>("a", "sensing_setdragmode");
478+
addDropdownField(block1, "DRAG_MODE", SensingBlocks::DRAG_MODE, "draggable", SensingBlocks::Draggable);
479+
480+
// set drag mode [not draggable]
481+
auto block2 = std::make_shared<Block>("b", "sensing_setdragmode");
482+
addDropdownField(block2, "DRAG_MODE", SensingBlocks::DRAG_MODE, "not draggable", SensingBlocks::NotDraggable);
483+
484+
compiler.init();
485+
486+
EXPECT_CALL(m_engineMock, functionIndex(&SensingBlocks::setDraggableMode)).WillOnce(Return(0));
487+
compiler.setBlock(block1);
488+
SensingBlocks::compileSetDragMode(&compiler);
489+
490+
EXPECT_CALL(m_engineMock, functionIndex(&SensingBlocks::setNotDraggableMode)).WillOnce(Return(1));
491+
compiler.setBlock(block2);
492+
SensingBlocks::compileSetDragMode(&compiler);
493+
494+
compiler.end();
495+
496+
ASSERT_EQ(compiler.bytecode(), std::vector<unsigned int>({ vm::OP_START, vm::OP_EXEC, 0, vm::OP_EXEC, 1, vm::OP_HALT }));
497+
ASSERT_TRUE(compiler.constValues().empty());
498+
}
499+
500+
TEST_F(SensingBlocksTest, SetDragModeImpl)
501+
{
502+
static unsigned int bytecode1[] = { vm::OP_START, vm::OP_EXEC, 0, vm::OP_HALT };
503+
static unsigned int bytecode2[] = { vm::OP_START, vm::OP_EXEC, 1, vm::OP_HALT };
504+
static BlockFunc functions[] = { &SensingBlocks::setDraggableMode, &SensingBlocks::setNotDraggableMode };
505+
506+
Sprite sprite;
507+
sprite.setDraggable(false);
508+
509+
VirtualMachine vm(&sprite, &m_engineMock, nullptr);
510+
vm.setFunctions(functions);
511+
512+
vm.setBytecode(bytecode1);
513+
vm.run();
514+
515+
ASSERT_EQ(vm.registerCount(), 0);
516+
ASSERT_TRUE(sprite.draggable());
517+
518+
vm.reset();
519+
vm.setBytecode(bytecode2);
520+
vm.run();
521+
522+
ASSERT_EQ(vm.registerCount(), 0);
523+
ASSERT_FALSE(sprite.draggable());
524+
}
525+
468526
TEST_F(SensingBlocksTest, Timer)
469527
{
470528
Compiler compiler(&m_engineMock);

0 commit comments

Comments
 (0)