Skip to content

Commit 5161321

Browse files
committed
Engine: Add text bubbles to sorted drawables
1 parent 008c920 commit 5161321

File tree

2 files changed

+128
-11
lines changed

2 files changed

+128
-11
lines changed

src/engine/internal/engine.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,11 +444,13 @@ void Engine::initClone(std::shared_ptr<Sprite> clone)
444444
assert(std::find(m_sortedDrawables.begin(), m_sortedDrawables.end(), clone.get()) == m_sortedDrawables.end());
445445
m_clones.insert(clone);
446446
m_sortedDrawables.push_back(clone.get()); // execution order needs to be updated after this
447+
m_sortedDrawables.push_back(clone->bubble());
447448
}
448449

449450
void Engine::deinitClone(std::shared_ptr<Sprite> clone)
450451
{
451452
m_clones.erase(clone);
453+
m_sortedDrawables.erase(std::remove(m_sortedDrawables.begin(), m_sortedDrawables.end(), clone->bubble()), m_sortedDrawables.end());
452454
m_sortedDrawables.erase(std::remove(m_sortedDrawables.begin(), m_sortedDrawables.end(), clone.get()), m_sortedDrawables.end());
453455
}
454456

@@ -1161,8 +1163,14 @@ void Engine::setTargets(const std::vector<std::shared_ptr<Target>> &newTargets)
11611163
}
11621164
}
11631165

1164-
// Sort the drawables by layer order
1166+
// Sort the targets by layer order
11651167
std::sort(m_sortedDrawables.begin(), m_sortedDrawables.end(), [](Drawable *d1, Drawable *d2) { return d1->layerOrder() < d2->layerOrder(); });
1168+
1169+
// Add text bubbles (layers are irrelevant until text is displayed)
1170+
for (auto target : m_targets) {
1171+
target->bubble()->setLayerOrder(m_sortedDrawables.size());
1172+
m_sortedDrawables.push_back(target->bubble());
1173+
}
11661174
}
11671175

11681176
Target *Engine::targetAt(int index) const

test/engine/engine_test.cpp

Lines changed: 119 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <scratchcpp/project.h>
44
#include <scratchcpp/sprite.h>
55
#include <scratchcpp/stage.h>
6+
#include <scratchcpp/textbubble.h>
67
#include <scratchcpp/variable.h>
78
#include <scratchcpp/list.h>
89
#include <scratchcpp/keyevent.h>
@@ -1246,27 +1247,49 @@ TEST(EngineTest, MoveDrawableToFront)
12461247
engine.moveDrawableToFront(sprites[2]);
12471248
ASSERT_EQ(sprites[0]->layerOrder(), 1);
12481249
ASSERT_EQ(sprites[1]->layerOrder(), 4);
1249-
ASSERT_EQ(sprites[2]->layerOrder(), 5);
1250+
ASSERT_EQ(sprites[2]->layerOrder(), 11);
12501251
ASSERT_EQ(sprites[3]->layerOrder(), 3);
12511252
ASSERT_EQ(sprites[4]->layerOrder(), 2);
1253+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 6);
1254+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 7);
1255+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 8);
1256+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 9);
1257+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 10);
12521258

12531259
for (int i = 0; i < 2; i++) {
12541260
engine.moveDrawableToFront(sprites[0]);
1255-
ASSERT_EQ(sprites[0]->layerOrder(), 5);
1261+
ASSERT_EQ(sprites[0]->layerOrder(), 11);
12561262
ASSERT_EQ(sprites[1]->layerOrder(), 3);
1257-
ASSERT_EQ(sprites[2]->layerOrder(), 4);
1263+
ASSERT_EQ(sprites[2]->layerOrder(), 10);
12581264
ASSERT_EQ(sprites[3]->layerOrder(), 2);
12591265
ASSERT_EQ(sprites[4]->layerOrder(), 1);
1266+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 5);
1267+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 6);
1268+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 7);
1269+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 8);
1270+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 9);
12601271
}
12611272

1273+
engine.moveDrawableToFront(sprites[0]->bubble());
1274+
ASSERT_EQ(sprites[0]->layerOrder(), 10);
1275+
ASSERT_EQ(sprites[1]->layerOrder(), 3);
1276+
ASSERT_EQ(sprites[2]->layerOrder(), 9);
1277+
ASSERT_EQ(sprites[3]->layerOrder(), 2);
1278+
ASSERT_EQ(sprites[4]->layerOrder(), 1);
1279+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 11);
1280+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 5);
1281+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 6);
1282+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 7);
1283+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 8);
1284+
12621285
auto stage = std::make_shared<Stage>();
12631286
stage->setLayerOrder(0);
12641287
auto sprite = std::make_shared<Sprite>();
12651288
sprite->setLayerOrder(1);
12661289

12671290
engine.setTargets({ stage, sprite });
12681291
engine.moveDrawableToFront(sprite.get());
1269-
ASSERT_EQ(sprite->layerOrder(), 1);
1292+
ASSERT_EQ(sprite->layerOrder(), 3);
12701293
}
12711294

12721295
TEST(EngineTest, MoveDrawableToBack)
@@ -1281,6 +1304,11 @@ TEST(EngineTest, MoveDrawableToBack)
12811304
ASSERT_EQ(sprites[2]->layerOrder(), 1);
12821305
ASSERT_EQ(sprites[3]->layerOrder(), 4);
12831306
ASSERT_EQ(sprites[4]->layerOrder(), 3);
1307+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 7);
1308+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 8);
1309+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 9);
1310+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 10);
1311+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
12841312

12851313
for (int i = 0; i < 1; i++) {
12861314
engine.moveDrawableToBack(sprites[1]);
@@ -1289,8 +1317,25 @@ TEST(EngineTest, MoveDrawableToBack)
12891317
ASSERT_EQ(sprites[2]->layerOrder(), 2);
12901318
ASSERT_EQ(sprites[3]->layerOrder(), 5);
12911319
ASSERT_EQ(sprites[4]->layerOrder(), 4);
1320+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 7);
1321+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 8);
1322+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 9);
1323+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 10);
1324+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
12921325
}
12931326

1327+
engine.moveDrawableToBack(sprites[2]->bubble());
1328+
ASSERT_EQ(sprites[0]->layerOrder(), 4);
1329+
ASSERT_EQ(sprites[1]->layerOrder(), 2);
1330+
ASSERT_EQ(sprites[2]->layerOrder(), 3);
1331+
ASSERT_EQ(sprites[3]->layerOrder(), 6);
1332+
ASSERT_EQ(sprites[4]->layerOrder(), 5);
1333+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 8);
1334+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 9);
1335+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 1);
1336+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 10);
1337+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
1338+
12941339
auto stage = std::make_shared<Stage>();
12951340
stage->setLayerOrder(0);
12961341
auto sprite = std::make_shared<Sprite>();
@@ -1313,27 +1358,59 @@ TEST(EngineTest, MoveDrawableForwardLayers)
13131358
ASSERT_EQ(sprites[2]->layerOrder(), 2);
13141359
ASSERT_EQ(sprites[3]->layerOrder(), 3);
13151360
ASSERT_EQ(sprites[4]->layerOrder(), 4);
1361+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 7);
1362+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 8);
1363+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 9);
1364+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 10);
1365+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
13161366

13171367
engine.moveDrawableForwardLayers(sprites[4], 2);
13181368
ASSERT_EQ(sprites[0]->layerOrder(), 1);
13191369
ASSERT_EQ(sprites[1]->layerOrder(), 4);
13201370
ASSERT_EQ(sprites[2]->layerOrder(), 2);
13211371
ASSERT_EQ(sprites[3]->layerOrder(), 3);
1322-
ASSERT_EQ(sprites[4]->layerOrder(), 5);
1372+
ASSERT_EQ(sprites[4]->layerOrder(), 6);
1373+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 7);
1374+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 8);
1375+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 9);
1376+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 10);
1377+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
13231378

13241379
engine.moveDrawableForwardLayers(sprites[4], -3);
13251380
ASSERT_EQ(sprites[0]->layerOrder(), 1);
13261381
ASSERT_EQ(sprites[1]->layerOrder(), 5);
1327-
ASSERT_EQ(sprites[2]->layerOrder(), 3);
1382+
ASSERT_EQ(sprites[2]->layerOrder(), 2);
13281383
ASSERT_EQ(sprites[3]->layerOrder(), 4);
1329-
ASSERT_EQ(sprites[4]->layerOrder(), 2);
1384+
ASSERT_EQ(sprites[4]->layerOrder(), 3);
1385+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 7);
1386+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 8);
1387+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 9);
1388+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 10);
1389+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
13301390

13311391
engine.moveDrawableForwardLayers(sprites[2], -3);
13321392
ASSERT_EQ(sprites[0]->layerOrder(), 2);
13331393
ASSERT_EQ(sprites[1]->layerOrder(), 5);
13341394
ASSERT_EQ(sprites[2]->layerOrder(), 1);
13351395
ASSERT_EQ(sprites[3]->layerOrder(), 4);
13361396
ASSERT_EQ(sprites[4]->layerOrder(), 3);
1397+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 7);
1398+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 8);
1399+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 9);
1400+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 10);
1401+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
1402+
1403+
engine.moveDrawableForwardLayers(sprites[0]->bubble(), 3);
1404+
ASSERT_EQ(sprites[0]->layerOrder(), 2);
1405+
ASSERT_EQ(sprites[1]->layerOrder(), 5);
1406+
ASSERT_EQ(sprites[2]->layerOrder(), 1);
1407+
ASSERT_EQ(sprites[3]->layerOrder(), 4);
1408+
ASSERT_EQ(sprites[4]->layerOrder(), 3);
1409+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 10);
1410+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 7);
1411+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 8);
1412+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 9);
1413+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
13371414
}
13381415

13391416
TEST(EngineTest, MoveDrawableBackwardLayers)
@@ -1348,27 +1425,59 @@ TEST(EngineTest, MoveDrawableBackwardLayers)
13481425
ASSERT_EQ(sprites[2]->layerOrder(), 2);
13491426
ASSERT_EQ(sprites[3]->layerOrder(), 3);
13501427
ASSERT_EQ(sprites[4]->layerOrder(), 4);
1428+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 7);
1429+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 8);
1430+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 9);
1431+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 10);
1432+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
13511433

13521434
engine.moveDrawableBackwardLayers(sprites[4], -2);
13531435
ASSERT_EQ(sprites[0]->layerOrder(), 1);
13541436
ASSERT_EQ(sprites[1]->layerOrder(), 4);
13551437
ASSERT_EQ(sprites[2]->layerOrder(), 2);
13561438
ASSERT_EQ(sprites[3]->layerOrder(), 3);
1357-
ASSERT_EQ(sprites[4]->layerOrder(), 5);
1439+
ASSERT_EQ(sprites[4]->layerOrder(), 6);
1440+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 7);
1441+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 8);
1442+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 9);
1443+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 10);
1444+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
13581445

13591446
engine.moveDrawableBackwardLayers(sprites[4], 3);
13601447
ASSERT_EQ(sprites[0]->layerOrder(), 1);
13611448
ASSERT_EQ(sprites[1]->layerOrder(), 5);
1362-
ASSERT_EQ(sprites[2]->layerOrder(), 3);
1449+
ASSERT_EQ(sprites[2]->layerOrder(), 2);
13631450
ASSERT_EQ(sprites[3]->layerOrder(), 4);
1364-
ASSERT_EQ(sprites[4]->layerOrder(), 2);
1451+
ASSERT_EQ(sprites[4]->layerOrder(), 3);
1452+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 7);
1453+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 8);
1454+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 9);
1455+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 10);
1456+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
13651457

13661458
engine.moveDrawableBackwardLayers(sprites[2], 3);
13671459
ASSERT_EQ(sprites[0]->layerOrder(), 2);
13681460
ASSERT_EQ(sprites[1]->layerOrder(), 5);
13691461
ASSERT_EQ(sprites[2]->layerOrder(), 1);
13701462
ASSERT_EQ(sprites[3]->layerOrder(), 4);
13711463
ASSERT_EQ(sprites[4]->layerOrder(), 3);
1464+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 7);
1465+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 8);
1466+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 9);
1467+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 10);
1468+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
1469+
1470+
engine.moveDrawableBackwardLayers(sprites[0]->bubble(), -3);
1471+
ASSERT_EQ(sprites[0]->layerOrder(), 2);
1472+
ASSERT_EQ(sprites[1]->layerOrder(), 5);
1473+
ASSERT_EQ(sprites[2]->layerOrder(), 1);
1474+
ASSERT_EQ(sprites[3]->layerOrder(), 4);
1475+
ASSERT_EQ(sprites[4]->layerOrder(), 3);
1476+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 10);
1477+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 7);
1478+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 8);
1479+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 9);
1480+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
13721481
}
13731482

13741483
TEST(EngineTest, MoveDrawableBehindOther)

0 commit comments

Comments
 (0)