Skip to content

Commit 6461c47

Browse files
committed
Refactor layer methods for drawables
1 parent c402c8e commit 6461c47

File tree

15 files changed

+106
-86
lines changed

15 files changed

+106
-86
lines changed

include/scratchcpp/iengine.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class IExtension;
1818
class Broadcast;
1919
class Block;
2020
class Field;
21+
class Drawable;
2122
class Target;
2223
class Sprite;
2324
class Stage;
@@ -332,19 +333,19 @@ class LIBSCRATCHCPP_EXPORT IEngine
332333
virtual int findTarget(const std::string &targetName) const = 0;
333334

334335
/*! Moves the given sprite to the front layer. */
335-
virtual void moveSpriteToFront(Sprite *sprite) = 0;
336+
virtual void moveDrawableToFront(Drawable *drawable) = 0;
336337

337338
/*! Moves the given sprite to the back layer. */
338-
virtual void moveSpriteToBack(Sprite *sprite) = 0;
339+
virtual void moveDrawableToBack(Drawable *drawable) = 0;
339340

340341
/*! Moves the given sprite forward a number of layers. */
341-
virtual void moveSpriteForwardLayers(Sprite *sprite, int layers) = 0;
342+
virtual void moveDrawableForwardLayers(Drawable *drawable, int layers) = 0;
342343

343344
/*! Moves the given sprite backward a number of layers. */
344-
virtual void moveSpriteBackwardLayers(Sprite *sprite, int layers) = 0;
345+
virtual void moveDrawableBackwardLayers(Drawable *drawable, int layers) = 0;
345346

346347
/*! Moves the given sprite behind some other sprite. */
347-
virtual void moveSpriteBehindOther(Sprite *sprite, Sprite *other) = 0;
348+
virtual void moveDrawableBehindOther(Drawable *drawable, Drawable *other) = 0;
348349

349350
/*! Returns the Stage. */
350351
virtual Stage *stage() const = 0;

src/blocks/looksblocks.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,7 @@ unsigned int LooksBlocks::goToFront(VirtualMachine *vm)
10151015
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
10161016

10171017
if (sprite)
1018-
vm->engine()->moveSpriteToFront(sprite);
1018+
vm->engine()->moveDrawableToFront(sprite);
10191019

10201020
return 0;
10211021
}
@@ -1025,7 +1025,7 @@ unsigned int LooksBlocks::goToBack(VirtualMachine *vm)
10251025
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
10261026

10271027
if (sprite)
1028-
vm->engine()->moveSpriteToBack(sprite);
1028+
vm->engine()->moveDrawableToBack(sprite);
10291029

10301030
return 0;
10311031
}
@@ -1035,7 +1035,7 @@ unsigned int LooksBlocks::goForwardLayers(VirtualMachine *vm)
10351035
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
10361036

10371037
if (sprite)
1038-
vm->engine()->moveSpriteForwardLayers(sprite, vm->getInput(0, 1)->toInt());
1038+
vm->engine()->moveDrawableForwardLayers(sprite, vm->getInput(0, 1)->toInt());
10391039

10401040
return 1;
10411041
}
@@ -1045,7 +1045,7 @@ unsigned int LooksBlocks::goBackwardLayers(VirtualMachine *vm)
10451045
Sprite *sprite = dynamic_cast<Sprite *>(vm->target());
10461046

10471047
if (sprite)
1048-
vm->engine()->moveSpriteBackwardLayers(sprite, vm->getInput(0, 1)->toInt());
1048+
vm->engine()->moveDrawableBackwardLayers(sprite, vm->getInput(0, 1)->toInt());
10491049

10501050
return 1;
10511051
}

src/engine/internal/engine.cpp

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <scratchcpp/script.h>
66
#include <scratchcpp/sprite.h>
77
#include <scratchcpp/stage.h>
8+
#include <scratchcpp/textbubble.h>
89
#include <scratchcpp/broadcast.h>
910
#include <scratchcpp/compiler.h>
1011
#include <scratchcpp/input.h>
@@ -1211,51 +1212,63 @@ int Engine::findTarget(const std::string &targetName) const
12111212
return it - m_targets.begin();
12121213
}
12131214

1214-
void Engine::moveSpriteToFront(Sprite *sprite)
1215+
void Engine::moveDrawableToFront(Drawable *drawable)
12151216
{
1216-
if (!sprite || m_sortedDrawables.size() <= 2)
1217+
if (!drawable || m_sortedDrawables.size() <= 2)
12171218
return;
12181219

1219-
auto it = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), sprite);
1220+
if (drawable->isTarget() && static_cast<Target *>(drawable)->isStage()) {
1221+
std::cout << "warning: cannot move stage to front" << std::endl;
1222+
assert(false);
1223+
return;
1224+
}
1225+
1226+
auto it = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), drawable);
12201227

12211228
if (it != m_sortedDrawables.end()) {
12221229
std::rotate(it, it + 1, m_sortedDrawables.end());
12231230
updateDrawableLayerOrder();
12241231
}
12251232
}
12261233

1227-
void Engine::moveSpriteToBack(Sprite *sprite)
1234+
void Engine::moveDrawableToBack(Drawable *drawable)
12281235
{
1229-
if (!sprite || m_sortedDrawables.size() <= 2)
1236+
if (!drawable || m_sortedDrawables.size() <= 2)
12301237
return;
12311238

1232-
auto it = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), sprite);
1239+
auto it = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), drawable);
12331240

12341241
if (it != m_sortedDrawables.end()) {
12351242
std::rotate(m_sortedDrawables.begin() + 1, it, it + 1); // stage is always the first
12361243
updateDrawableLayerOrder();
12371244
}
12381245
}
12391246

1240-
void Engine::moveSpriteForwardLayers(Sprite *sprite, int layers)
1247+
void Engine::moveDrawableForwardLayers(Drawable *drawable, int layers)
12411248
{
1242-
if (!sprite || layers == 0)
1249+
if (!drawable || layers == 0)
1250+
return;
1251+
1252+
if (layers > 0 && drawable->isTarget() && static_cast<Target *>(drawable)->isStage()) {
1253+
std::cout << "warning: cannot move stage forward" << std::endl;
1254+
assert(false);
12431255
return;
1256+
}
12441257

1245-
auto it = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), sprite);
1258+
auto it = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), drawable);
12461259

12471260
if (it == m_sortedDrawables.end())
12481261
return;
12491262

12501263
auto target = it + layers;
12511264

12521265
if (target <= m_sortedDrawables.begin()) {
1253-
moveSpriteToBack(sprite);
1266+
moveDrawableToBack(drawable);
12541267
return;
12551268
}
12561269

12571270
if (target >= m_sortedDrawables.end()) {
1258-
moveSpriteToFront(sprite);
1271+
moveDrawableToFront(drawable);
12591272
return;
12601273
}
12611274

@@ -1267,17 +1280,23 @@ void Engine::moveSpriteForwardLayers(Sprite *sprite, int layers)
12671280
updateDrawableLayerOrder();
12681281
}
12691282

1270-
void Engine::moveSpriteBackwardLayers(Sprite *sprite, int layers)
1283+
void Engine::moveDrawableBackwardLayers(Drawable *drawable, int layers)
12711284
{
1272-
moveSpriteForwardLayers(sprite, -layers);
1285+
moveDrawableForwardLayers(drawable, -layers);
12731286
}
12741287

1275-
void Engine::moveSpriteBehindOther(Sprite *sprite, Sprite *other)
1288+
void Engine::moveDrawableBehindOther(Drawable *drawable, Drawable *other)
12761289
{
1277-
if (sprite == other)
1290+
if (drawable == other)
1291+
return;
1292+
1293+
if (drawable->isTarget() && static_cast<Target *>(drawable)->isStage()) {
1294+
std::cout << "warning: cannot move stage behind drawable" << std::endl;
1295+
assert(false);
12781296
return;
1297+
}
12791298

1280-
auto itSprite = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), sprite);
1299+
auto itSprite = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), drawable);
12811300
auto itOther = std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), other);
12821301

12831302
if ((itSprite == m_sortedDrawables.end()) || (itOther == m_sortedDrawables.end()))
@@ -1289,12 +1308,12 @@ void Engine::moveSpriteBehindOther(Sprite *sprite, Sprite *other)
12891308
target++;
12901309

12911310
if (target <= m_sortedDrawables.begin()) {
1292-
moveSpriteToBack(sprite);
1311+
moveDrawableToBack(drawable);
12931312
return;
12941313
}
12951314

12961315
if (target >= m_sortedDrawables.end()) {
1297-
moveSpriteToFront(sprite);
1316+
moveDrawableToFront(drawable);
12981317
return;
12991318
}
13001319

src/engine/internal/engine.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,11 +135,11 @@ class Engine : public IEngine
135135
void getVisibleTargets(std::vector<Target *> &dst) const override;
136136
int findTarget(const std::string &targetName) const override;
137137

138-
void moveSpriteToFront(Sprite *sprite) override;
139-
void moveSpriteToBack(Sprite *sprite) override;
140-
void moveSpriteForwardLayers(Sprite *sprite, int layers) override;
141-
void moveSpriteBackwardLayers(Sprite *sprite, int layers) override;
142-
void moveSpriteBehindOther(Sprite *sprite, Sprite *other) override;
138+
void moveDrawableToFront(Drawable *drawable) override;
139+
void moveDrawableToBack(Drawable *drawable) override;
140+
void moveDrawableForwardLayers(Drawable *drawable, int layers) override;
141+
void moveDrawableBackwardLayers(Drawable *drawable, int layers) override;
142+
void moveDrawableBehindOther(Drawable *drawable, Drawable *other) override;
143143

144144
Stage *stage() const override;
145145

src/scratch/sprite.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ std::shared_ptr<Sprite> Sprite::clone()
103103
impl->iface->onCloned(clone.get());
104104

105105
// Place the clone behind the original sprite
106-
eng->moveSpriteBehindOther(clone.get(), this);
106+
eng->moveDrawableBehindOther(clone.get(), this);
107107

108108
return clone;
109109
}
@@ -239,7 +239,7 @@ void Sprite::startDragging()
239239
IEngine *eng = engine();
240240

241241
if (eng)
242-
eng->moveSpriteToFront(this);
242+
eng->moveDrawableToFront(this);
243243
}
244244

245245
/*! Stops dragging. */

test/assets/sound_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ TEST_F(SoundTest, Clone)
226226
EXPECT_CALL(engine, cloneLimit()).WillOnce(Return(-1));
227227
EXPECT_CALL(engine, initClone);
228228
EXPECT_CALL(engine, requestRedraw);
229-
EXPECT_CALL(engine, moveSpriteBehindOther);
229+
EXPECT_CALL(engine, moveDrawableBehindOther);
230230
auto spriteClone = sprite.clone();
231231

232232
EXPECT_CALL(*anotherPlayer, setVolume).Times(2);

test/blocks/control_blocks_test.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -905,7 +905,7 @@ TEST_F(ControlBlocksTest, CreateCloneOfImpl)
905905
EXPECT_CALL(m_engineMock, cloneLimit()).Times(8).WillRepeatedly(Return(300));
906906
EXPECT_CALL(m_engineMock, cloneCount()).Times(4).WillRepeatedly(Return(0));
907907
EXPECT_CALL(m_engineMock, initClone).WillOnce(SaveArg<0>(&clone1));
908-
EXPECT_CALL(m_engineMock, moveSpriteBehindOther(_, &sprite));
908+
EXPECT_CALL(m_engineMock, moveDrawableBehindOther(_, &sprite));
909909
EXPECT_CALL(m_engineMock, requestRedraw());
910910

911911
vm.setBytecode(bytecode1);
@@ -915,7 +915,7 @@ TEST_F(ControlBlocksTest, CreateCloneOfImpl)
915915
ASSERT_EQ(sprite.clones().size(), 1);
916916

917917
EXPECT_CALL(m_engineMock, initClone).Times(1);
918-
EXPECT_CALL(m_engineMock, moveSpriteBehindOther(_, &sprite));
918+
EXPECT_CALL(m_engineMock, moveDrawableBehindOther(_, &sprite));
919919
EXPECT_CALL(m_engineMock, requestRedraw());
920920

921921
vm.setBytecode(bytecode2);
@@ -928,7 +928,7 @@ TEST_F(ControlBlocksTest, CreateCloneOfImpl)
928928
EXPECT_CALL(m_engineMock, findTarget).WillOnce(Return(4));
929929
EXPECT_CALL(m_engineMock, targetAt(4)).WillOnce(Return(&sprite));
930930
EXPECT_CALL(m_engineMock, initClone).WillOnce(SaveArg<0>(&clone3));
931-
EXPECT_CALL(m_engineMock, moveSpriteBehindOther(_, &sprite));
931+
EXPECT_CALL(m_engineMock, moveDrawableBehindOther(_, &sprite));
932932
EXPECT_CALL(m_engineMock, requestRedraw());
933933

934934
vm.setBytecode(bytecode3);
@@ -938,7 +938,7 @@ TEST_F(ControlBlocksTest, CreateCloneOfImpl)
938938
ASSERT_EQ(sprite.clones().size(), 3);
939939

940940
EXPECT_CALL(m_engineMock, initClone).Times(1);
941-
EXPECT_CALL(m_engineMock, moveSpriteBehindOther(_, &sprite));
941+
EXPECT_CALL(m_engineMock, moveDrawableBehindOther(_, &sprite));
942942
EXPECT_CALL(m_engineMock, requestRedraw());
943943

944944
vm.setBytecode(bytecode4);
@@ -996,7 +996,7 @@ TEST_F(ControlBlocksTest, DeleteThisCloneImpl)
996996
EXPECT_CALL(m_engineMock, cloneLimit()).Times(2).WillRepeatedly(Return(300));
997997
EXPECT_CALL(m_engineMock, cloneCount()).WillOnce(Return(0));
998998
EXPECT_CALL(m_engineMock, initClone(_)).WillOnce(SaveArg<0>(&clone));
999-
EXPECT_CALL(m_engineMock, moveSpriteBehindOther(_, &sprite));
999+
EXPECT_CALL(m_engineMock, moveDrawableBehindOther(_, &sprite));
10001000
EXPECT_CALL(m_engineMock, requestRedraw());
10011001
sprite.clone();
10021002
ASSERT_TRUE(clone);

test/blocks/looks_blocks_test.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2557,13 +2557,13 @@ TEST_F(LooksBlocksTest, GoToFrontBackImpl)
25572557
VirtualMachine vm(&sprite, &m_engineMock, nullptr);
25582558
vm.setFunctions(functions);
25592559

2560-
EXPECT_CALL(m_engineMock, moveSpriteToFront(&sprite));
2560+
EXPECT_CALL(m_engineMock, moveDrawableToFront(&sprite));
25612561
vm.setBytecode(bytecode1);
25622562
vm.run();
25632563

25642564
ASSERT_EQ(vm.registerCount(), 0);
25652565

2566-
EXPECT_CALL(m_engineMock, moveSpriteToBack(&sprite));
2566+
EXPECT_CALL(m_engineMock, moveDrawableToBack(&sprite));
25672567
vm.reset();
25682568
vm.setBytecode(bytecode2);
25692569
vm.run();
@@ -2614,13 +2614,13 @@ TEST_F(LooksBlocksTest, GoForwardBackwardLayersImpl)
26142614
vm.setFunctions(functions);
26152615
vm.setConstValues(constValues);
26162616

2617-
EXPECT_CALL(m_engineMock, moveSpriteForwardLayers(&sprite, 5));
2617+
EXPECT_CALL(m_engineMock, moveDrawableForwardLayers(&sprite, 5));
26182618
vm.setBytecode(bytecode1);
26192619
vm.run();
26202620

26212621
ASSERT_EQ(vm.registerCount(), 0);
26222622

2623-
EXPECT_CALL(m_engineMock, moveSpriteBackwardLayers(&sprite, 3));
2623+
EXPECT_CALL(m_engineMock, moveDrawableBackwardLayers(&sprite, 3));
26242624
vm.reset();
26252625
vm.setBytecode(bytecode2);
26262626
vm.run();

0 commit comments

Comments
 (0)