Skip to content

Commit fea9558

Browse files
committed
Add support for local var monitors used by clones
Resolves: #423
1 parent 537ff52 commit fea9558

File tree

2 files changed

+72
-10
lines changed

2 files changed

+72
-10
lines changed

src/blocks/variableblocks.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <scratchcpp/field.h>
66
#include <scratchcpp/block.h>
77
#include <scratchcpp/variable.h>
8+
#include <scratchcpp/sprite.h>
89
#include <scratchcpp/stage.h>
910
#include <scratchcpp/monitor.h>
1011

@@ -108,8 +109,14 @@ unsigned int VariableBlocks::showGlobalVariable(VirtualMachine *vm)
108109
unsigned int VariableBlocks::showVariable(VirtualMachine *vm)
109110
{
110111
if (Target *target = vm->target()) {
111-
int index = target->findVariableById(vm->getInput(0, 1)->toString());
112-
setVarVisible(target->variableAt(index), true);
112+
if (!target->isStage() && static_cast<Sprite *>(target)->isClone()) {
113+
Sprite *sprite = static_cast<Sprite *>(target)->cloneSprite(); // use clone root variable
114+
int index = sprite->findVariableById(vm->getInput(0, 1)->toString());
115+
setVarVisible(sprite->variableAt(index), true);
116+
} else {
117+
int index = target->findVariableById(vm->getInput(0, 1)->toString());
118+
setVarVisible(target->variableAt(index), true);
119+
}
113120
}
114121

115122
return 1;
@@ -128,8 +135,14 @@ unsigned int VariableBlocks::hideGlobalVariable(VirtualMachine *vm)
128135
unsigned int VariableBlocks::hideVariable(VirtualMachine *vm)
129136
{
130137
if (Target *target = vm->target()) {
131-
int index = target->findVariableById(vm->getInput(0, 1)->toString());
132-
setVarVisible(target->variableAt(index), false);
138+
if (!target->isStage() && static_cast<Sprite *>(target)->isClone()) {
139+
Sprite *sprite = static_cast<Sprite *>(target)->cloneSprite(); // use clone root variable
140+
int index = sprite->findVariableById(vm->getInput(0, 1)->toString());
141+
setVarVisible(sprite->variableAt(index), false);
142+
} else {
143+
int index = target->findVariableById(vm->getInput(0, 1)->toString());
144+
setVarVisible(target->variableAt(index), false);
145+
}
133146
}
134147

135148
return 1;

test/blocks/variable_blocks_test.cpp

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <scratchcpp/input.h>
44
#include <scratchcpp/field.h>
55
#include <scratchcpp/variable.h>
6+
#include <scratchcpp/sprite.h>
67
#include <scratchcpp/stage.h>
78
#include <scratchcpp/monitor.h>
89
#include <enginemock.h>
@@ -271,8 +272,12 @@ TEST_F(VariableBlocksTest, ShowVariableImpl)
271272
Stage stage;
272273
stage.addVariable(var1);
273274

274-
Target target;
275-
target.addVariable(var2);
275+
Sprite sprite;
276+
sprite.addVariable(var2);
277+
278+
Engine fakeEngine;
279+
sprite.setEngine(&fakeEngine);
280+
auto clone = sprite.clone();
276281

277282
// Global
278283
VirtualMachine vm1(&stage, &m_engineMock, nullptr);
@@ -299,7 +304,7 @@ TEST_F(VariableBlocksTest, ShowVariableImpl)
299304
monitor1.setVisible(false);
300305

301306
// Local
302-
VirtualMachine vm2(&target, &m_engineMock, nullptr);
307+
VirtualMachine vm2(&sprite, &m_engineMock, nullptr);
303308
vm2.setBytecode(bytecode3);
304309
vm2.setFunctions(functions);
305310
vm2.setConstValues(constValues);
@@ -316,6 +321,26 @@ TEST_F(VariableBlocksTest, ShowVariableImpl)
316321
ASSERT_EQ(vm2.registerCount(), 0);
317322
ASSERT_FALSE(monitor1.visible());
318323
ASSERT_TRUE(monitor2.visible());
324+
325+
// Local - clone
326+
monitor2.setVisible(false);
327+
VirtualMachine vm3(clone.get(), &m_engineMock, nullptr);
328+
vm3.setBytecode(bytecode3);
329+
vm3.setFunctions(functions);
330+
vm3.setConstValues(constValues);
331+
vm3.run();
332+
333+
ASSERT_EQ(vm3.registerCount(), 0);
334+
ASSERT_FALSE(monitor1.visible());
335+
ASSERT_FALSE(monitor2.visible());
336+
337+
vm3.reset();
338+
vm3.setBytecode(bytecode4);
339+
vm3.run();
340+
341+
ASSERT_EQ(vm3.registerCount(), 0);
342+
ASSERT_FALSE(monitor1.visible());
343+
ASSERT_TRUE(monitor2.visible());
319344
}
320345

321346
TEST_F(VariableBlocksTest, HideVariable)
@@ -374,8 +399,12 @@ TEST_F(VariableBlocksTest, HideVariableImpl)
374399
Stage stage;
375400
stage.addVariable(var1);
376401

377-
Target target;
378-
target.addVariable(var2);
402+
Sprite sprite;
403+
sprite.addVariable(var2);
404+
405+
Engine fakeEngine;
406+
sprite.setEngine(&fakeEngine);
407+
auto clone = sprite.clone();
379408

380409
// Global
381410
VirtualMachine vm1(&stage, &m_engineMock, nullptr);
@@ -402,7 +431,7 @@ TEST_F(VariableBlocksTest, HideVariableImpl)
402431
monitor1.setVisible(true);
403432

404433
// Local
405-
VirtualMachine vm2(&target, &m_engineMock, nullptr);
434+
VirtualMachine vm2(&sprite, &m_engineMock, nullptr);
406435
vm2.setBytecode(bytecode3);
407436
vm2.setFunctions(functions);
408437
vm2.setConstValues(constValues);
@@ -419,4 +448,24 @@ TEST_F(VariableBlocksTest, HideVariableImpl)
419448
ASSERT_EQ(vm2.registerCount(), 0);
420449
ASSERT_TRUE(monitor1.visible());
421450
ASSERT_FALSE(monitor2.visible());
451+
452+
// Local - clone
453+
monitor2.setVisible(true);
454+
VirtualMachine vm3(clone.get(), &m_engineMock, nullptr);
455+
vm3.setBytecode(bytecode3);
456+
vm3.setFunctions(functions);
457+
vm3.setConstValues(constValues);
458+
vm3.run();
459+
460+
ASSERT_EQ(vm3.registerCount(), 0);
461+
ASSERT_TRUE(monitor1.visible());
462+
ASSERT_TRUE(monitor2.visible());
463+
464+
vm3.reset();
465+
vm3.setBytecode(bytecode4);
466+
vm3.run();
467+
468+
ASSERT_EQ(vm3.registerCount(), 0);
469+
ASSERT_TRUE(monitor1.visible());
470+
ASSERT_FALSE(monitor2.visible());
422471
}

0 commit comments

Comments
 (0)