Skip to content

Commit 400c1f2

Browse files
committed
Add support for local list monitors used by clones
1 parent fea9558 commit 400c1f2

File tree

2 files changed

+72
-10
lines changed

2 files changed

+72
-10
lines changed

src/blocks/listblocks.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/list.h>
8+
#include <scratchcpp/sprite.h>
89
#include <scratchcpp/stage.h>
910
#include <scratchcpp/monitor.h>
1011

@@ -162,8 +163,14 @@ unsigned int ListBlocks::showGlobalList(VirtualMachine *vm)
162163
unsigned int ListBlocks::showList(VirtualMachine *vm)
163164
{
164165
if (Target *target = vm->target()) {
165-
int index = target->findListById(vm->getInput(0, 1)->toString());
166-
setListVisible(target->listAt(index), true);
166+
if (!target->isStage() && static_cast<Sprite *>(target)->isClone()) {
167+
Sprite *sprite = static_cast<Sprite *>(target)->cloneSprite(); // use clone root list
168+
int index = sprite->findListById(vm->getInput(0, 1)->toString());
169+
setListVisible(sprite->listAt(index), true);
170+
} else {
171+
int index = target->findListById(vm->getInput(0, 1)->toString());
172+
setListVisible(target->listAt(index), true);
173+
}
167174
}
168175

169176
return 1;
@@ -182,8 +189,14 @@ unsigned int ListBlocks::hideGlobalList(VirtualMachine *vm)
182189
unsigned int ListBlocks::hideList(VirtualMachine *vm)
183190
{
184191
if (Target *target = vm->target()) {
185-
int index = target->findListById(vm->getInput(0, 1)->toString());
186-
setListVisible(target->listAt(index), false);
192+
if (!target->isStage() && static_cast<Sprite *>(target)->isClone()) {
193+
Sprite *sprite = static_cast<Sprite *>(target)->cloneSprite(); // use clone root list
194+
int index = sprite->findListById(vm->getInput(0, 1)->toString());
195+
setListVisible(sprite->listAt(index), false);
196+
} else {
197+
int index = target->findListById(vm->getInput(0, 1)->toString());
198+
setListVisible(target->listAt(index), false);
199+
}
187200
}
188201

189202
return 1;

test/blocks/list_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/list.h>
6+
#include <scratchcpp/sprite.h>
67
#include <scratchcpp/stage.h>
78
#include <scratchcpp/monitor.h>
89
#include <enginemock.h>
@@ -498,8 +499,12 @@ TEST_F(ListBlocksTest, ShowListImpl)
498499
Stage stage;
499500
stage.addList(list1);
500501

501-
Target target;
502-
target.addList(list2);
502+
Sprite sprite;
503+
sprite.addList(list2);
504+
505+
Engine fakeEngine;
506+
sprite.setEngine(&fakeEngine);
507+
auto clone = sprite.clone();
503508

504509
// Global
505510
VirtualMachine vm1(&stage, &m_engineMock, nullptr);
@@ -526,7 +531,7 @@ TEST_F(ListBlocksTest, ShowListImpl)
526531
monitor1.setVisible(false);
527532

528533
// Local
529-
VirtualMachine vm2(&target, &m_engineMock, nullptr);
534+
VirtualMachine vm2(&sprite, &m_engineMock, nullptr);
530535
vm2.setBytecode(bytecode3);
531536
vm2.setFunctions(functions);
532537
vm2.setConstValues(constValues);
@@ -543,6 +548,26 @@ TEST_F(ListBlocksTest, ShowListImpl)
543548
ASSERT_EQ(vm2.registerCount(), 0);
544549
ASSERT_FALSE(monitor1.visible());
545550
ASSERT_TRUE(monitor2.visible());
551+
552+
// Local - clone
553+
monitor2.setVisible(false);
554+
VirtualMachine vm3(clone.get(), &m_engineMock, nullptr);
555+
vm3.setBytecode(bytecode3);
556+
vm3.setFunctions(functions);
557+
vm3.setConstValues(constValues);
558+
vm3.run();
559+
560+
ASSERT_EQ(vm3.registerCount(), 0);
561+
ASSERT_FALSE(monitor1.visible());
562+
ASSERT_FALSE(monitor2.visible());
563+
564+
vm3.reset();
565+
vm3.setBytecode(bytecode4);
566+
vm3.run();
567+
568+
ASSERT_EQ(vm3.registerCount(), 0);
569+
ASSERT_FALSE(monitor1.visible());
570+
ASSERT_TRUE(monitor2.visible());
546571
}
547572

548573
TEST_F(ListBlocksTest, HideList)
@@ -601,8 +626,12 @@ TEST_F(ListBlocksTest, HideListImpl)
601626
Stage stage;
602627
stage.addList(list1);
603628

604-
Target target;
605-
target.addList(list2);
629+
Sprite sprite;
630+
sprite.addList(list2);
631+
632+
Engine fakeEngine;
633+
sprite.setEngine(&fakeEngine);
634+
auto clone = sprite.clone();
606635

607636
// Global
608637
VirtualMachine vm1(&stage, &m_engineMock, nullptr);
@@ -629,7 +658,7 @@ TEST_F(ListBlocksTest, HideListImpl)
629658
monitor1.setVisible(true);
630659

631660
// Local
632-
VirtualMachine vm2(&target, &m_engineMock, nullptr);
661+
VirtualMachine vm2(&sprite, &m_engineMock, nullptr);
633662
vm2.setBytecode(bytecode3);
634663
vm2.setFunctions(functions);
635664
vm2.setConstValues(constValues);
@@ -646,4 +675,24 @@ TEST_F(ListBlocksTest, HideListImpl)
646675
ASSERT_EQ(vm2.registerCount(), 0);
647676
ASSERT_TRUE(monitor1.visible());
648677
ASSERT_FALSE(monitor2.visible());
678+
679+
// Local - clone
680+
monitor2.setVisible(true);
681+
VirtualMachine vm3(clone.get(), &m_engineMock, nullptr);
682+
vm3.setBytecode(bytecode3);
683+
vm3.setFunctions(functions);
684+
vm3.setConstValues(constValues);
685+
vm3.run();
686+
687+
ASSERT_EQ(vm3.registerCount(), 0);
688+
ASSERT_TRUE(monitor1.visible());
689+
ASSERT_TRUE(monitor2.visible());
690+
691+
vm3.reset();
692+
vm3.setBytecode(bytecode4);
693+
vm3.run();
694+
695+
ASSERT_EQ(vm3.registerCount(), 0);
696+
ASSERT_TRUE(monitor1.visible());
697+
ASSERT_FALSE(monitor2.visible());
649698
}

0 commit comments

Comments
 (0)