Skip to content

Commit 064d1ca

Browse files
committed
fix #637: Ignore invisible text bubbles when changing layer
Resolves: #637
1 parent 4484d24 commit 064d1ca

File tree

2 files changed

+56
-8
lines changed

2 files changed

+56
-8
lines changed

src/engine/internal/engine.cpp

+18-8
Original file line numberDiff line numberDiff line change
@@ -1324,16 +1324,26 @@ void Engine::moveDrawableForwardLayers(Drawable *drawable, int layers)
13241324
if (it == m_sortedDrawables.end())
13251325
return;
13261326

1327-
auto target = it + layers;
1327+
auto target = it;
1328+
int layersAbs = std::abs(layers);
13281329

1329-
if (target <= m_sortedDrawables.begin()) {
1330-
moveDrawableToBack(drawable);
1331-
return;
1332-
}
1330+
for (int i = 0; i < layersAbs; i++) {
1331+
if (target <= m_sortedDrawables.begin()) {
1332+
moveDrawableToBack(drawable);
1333+
return;
1334+
}
13331335

1334-
if (target >= m_sortedDrawables.end()) {
1335-
moveDrawableToFront(drawable);
1336-
return;
1336+
if (target >= m_sortedDrawables.end()) {
1337+
moveDrawableToFront(drawable);
1338+
return;
1339+
}
1340+
1341+
Drawable *currentDrawable;
1342+
1343+
do {
1344+
currentDrawable = *target;
1345+
target += layers / layersAbs;
1346+
} while (currentDrawable->isTextBubble() && static_cast<TextBubble *>(currentDrawable)->text().empty());
13371347
}
13381348

13391349
if (layers > 0)

test/engine/engine_test.cpp

+38
Original file line numberDiff line numberDiff line change
@@ -1362,6 +1362,11 @@ TEST(EngineTest, MoveDrawableForwardLayers)
13621362
std::vector<Sprite *> sprites;
13631363
createTargets(&engine, sprites);
13641364

1365+
const auto &targets = engine.targets();
1366+
1367+
for (auto target : targets)
1368+
target->bubble()->setText("test");
1369+
13651370
engine.moveDrawableForwardLayers(sprites[4], 2);
13661371
ASSERT_EQ(sprites[0]->layerOrder(), 1);
13671372
ASSERT_EQ(sprites[1]->layerOrder(), 5);
@@ -1421,6 +1426,20 @@ TEST(EngineTest, MoveDrawableForwardLayers)
14211426
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 8);
14221427
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 9);
14231428
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
1429+
1430+
sprites[1]->bubble()->setText("");
1431+
sprites[3]->bubble()->setText("");
1432+
engine.moveDrawableForwardLayers(sprites[2], 8);
1433+
ASSERT_EQ(sprites[0]->layerOrder(), 1);
1434+
ASSERT_EQ(sprites[1]->layerOrder(), 4);
1435+
ASSERT_EQ(sprites[2]->layerOrder(), 11);
1436+
ASSERT_EQ(sprites[3]->layerOrder(), 3);
1437+
ASSERT_EQ(sprites[4]->layerOrder(), 2);
1438+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 9);
1439+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 6);
1440+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 7);
1441+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 8);
1442+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 10);
14241443
}
14251444

14261445
TEST(EngineTest, MoveDrawableBackwardLayers)
@@ -1429,6 +1448,11 @@ TEST(EngineTest, MoveDrawableBackwardLayers)
14291448
std::vector<Sprite *> sprites;
14301449
createTargets(&engine, sprites);
14311450

1451+
const auto &targets = engine.targets();
1452+
1453+
for (auto target : targets)
1454+
target->bubble()->setText("test");
1455+
14321456
engine.moveDrawableBackwardLayers(sprites[4], -2);
14331457
ASSERT_EQ(sprites[0]->layerOrder(), 1);
14341458
ASSERT_EQ(sprites[1]->layerOrder(), 5);
@@ -1488,6 +1512,20 @@ TEST(EngineTest, MoveDrawableBackwardLayers)
14881512
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 8);
14891513
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 9);
14901514
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
1515+
1516+
sprites[1]->bubble()->setText("");
1517+
sprites[3]->bubble()->setText("");
1518+
engine.moveDrawableBackwardLayers(sprites[2], -8);
1519+
ASSERT_EQ(sprites[0]->layerOrder(), 1);
1520+
ASSERT_EQ(sprites[1]->layerOrder(), 4);
1521+
ASSERT_EQ(sprites[2]->layerOrder(), 11);
1522+
ASSERT_EQ(sprites[3]->layerOrder(), 3);
1523+
ASSERT_EQ(sprites[4]->layerOrder(), 2);
1524+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 9);
1525+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 6);
1526+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 7);
1527+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 8);
1528+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 10);
14911529
}
14921530

14931531
TEST(EngineTest, MoveDrawableBehindOther)

0 commit comments

Comments
 (0)