Skip to content

Commit c4538e0

Browse files
committed
Add Sprite children getters
1 parent 294c238 commit c4538e0

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

include/scratchcpp/sprite.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class LIBSCRATCHCPP_EXPORT Sprite : public Target
3232

3333
Sprite *cloneRoot() const;
3434
Sprite *cloneParent() const;
35+
const std::vector<std::shared_ptr<Sprite>> &children() const;
36+
std::vector<std::shared_ptr<Sprite>> allChildren() const;
3537

3638
bool visible() const;
3739
void setVisible(bool newVisible);

src/scratch/sprite.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,26 @@ Sprite *Sprite::cloneParent() const
109109
return impl->cloneParent;
110110
}
111111

112+
/*! Returns list of child clones. */
113+
const std::vector<std::shared_ptr<Sprite>> &Sprite::children() const
114+
{
115+
return impl->childClones;
116+
}
117+
118+
/*! Returns list of child clones and their children (recursive). */
119+
std::vector<std::shared_ptr<Sprite>> Sprite::allChildren() const
120+
{
121+
std::vector<std::shared_ptr<Sprite>> ret;
122+
123+
for (auto clone : impl->childClones) {
124+
ret.push_back(clone);
125+
auto children = clone->allChildren();
126+
ret.insert(ret.end(), children.begin(), children.end());
127+
}
128+
129+
return ret;
130+
}
131+
112132
/*! Returns true if the sprite is visible. */
113133
bool Sprite::visible() const
114134
{

test/scratch_classes/sprite_test.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,50 @@ TEST(SpriteTest, Clone)
129129
ASSERT_EQ(clone2->cloneParent(), clone1);
130130

131131
checkCloneData(clone2);
132+
133+
Sprite *clone3;
134+
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone3));
135+
ASSERT_EQ(clone1->clone().get(), clone3);
136+
137+
Sprite *clone4;
138+
EXPECT_CALL(engine, initClone(_)).WillOnce(SaveArg<0>(&clone4));
139+
ASSERT_EQ(sprite.clone().get(), clone4);
140+
141+
// children
142+
const auto &children1 = sprite.children();
143+
ASSERT_EQ(children1.size(), 2);
144+
ASSERT_EQ(children1[0].get(), clone1);
145+
ASSERT_EQ(children1[1].get(), clone4);
146+
147+
const auto &children2 = clone1->children();
148+
ASSERT_EQ(children2.size(), 2);
149+
ASSERT_EQ(children2[0].get(), clone2);
150+
ASSERT_EQ(children2[1].get(), clone3);
151+
152+
ASSERT_TRUE(clone2->children().empty());
153+
154+
ASSERT_TRUE(clone3->children().empty());
155+
156+
ASSERT_TRUE(clone4->children().empty());
157+
158+
// allChildren
159+
auto allChildren = sprite.allChildren();
160+
ASSERT_EQ(allChildren.size(), 4);
161+
ASSERT_EQ(allChildren[0].get(), clone1);
162+
ASSERT_EQ(allChildren[1].get(), clone2);
163+
ASSERT_EQ(allChildren[2].get(), clone3);
164+
ASSERT_EQ(allChildren[3].get(), clone4);
165+
166+
allChildren = clone1->allChildren();
167+
ASSERT_EQ(allChildren.size(), 2);
168+
ASSERT_EQ(allChildren[0].get(), clone2);
169+
ASSERT_EQ(allChildren[1].get(), clone3);
170+
171+
ASSERT_TRUE(clone2->allChildren().empty());
172+
173+
ASSERT_TRUE(clone3->allChildren().empty());
174+
175+
ASSERT_TRUE(clone4->allChildren().empty());
132176
}
133177

134178
TEST(SpriteTest, X)

0 commit comments

Comments
 (0)