Skip to content

Commit 4e3b3cd

Browse files
committed
fix #637: Ignore invisible text bubbles when changing layer
Resolves: #637
1 parent 6104c4a commit 4e3b3cd

File tree

2 files changed

+56
-8
lines changed

2 files changed

+56
-8
lines changed

src/engine/internal/engine.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,16 +1262,26 @@ void Engine::moveDrawableForwardLayers(Drawable *drawable, int layers)
12621262
if (it == m_sortedDrawables.end())
12631263
return;
12641264

1265-
auto target = it + layers;
1265+
auto target = it;
1266+
int layersAbs = std::abs(layers);
12661267

1267-
if (target <= m_sortedDrawables.begin()) {
1268-
moveDrawableToBack(drawable);
1269-
return;
1270-
}
1268+
for (int i = 0; i < layersAbs; i++) {
1269+
if (target <= m_sortedDrawables.begin()) {
1270+
moveDrawableToBack(drawable);
1271+
return;
1272+
}
12711273

1272-
if (target >= m_sortedDrawables.end()) {
1273-
moveDrawableToFront(drawable);
1274-
return;
1274+
if (target >= m_sortedDrawables.end()) {
1275+
moveDrawableToFront(drawable);
1276+
return;
1277+
}
1278+
1279+
Drawable *currentDrawable;
1280+
1281+
do {
1282+
currentDrawable = *target;
1283+
target += layers / layersAbs;
1284+
} while (currentDrawable->isTextBubble() && static_cast<TextBubble *>(currentDrawable)->text().empty());
12751285
}
12761286

12771287
if (layers > 0)

test/engine/engine_test.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,6 +1321,11 @@ TEST(EngineTest, MoveDrawableForwardLayers)
13211321
std::vector<Sprite *> sprites;
13221322
createTargets(&engine, sprites);
13231323

1324+
const auto &targets = engine.targets();
1325+
1326+
for (auto target : targets)
1327+
target->bubble()->setText("test");
1328+
13241329
engine.moveDrawableForwardLayers(sprites[4], 2);
13251330
ASSERT_EQ(sprites[0]->layerOrder(), 1);
13261331
ASSERT_EQ(sprites[1]->layerOrder(), 5);
@@ -1380,6 +1385,20 @@ TEST(EngineTest, MoveDrawableForwardLayers)
13801385
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 8);
13811386
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 9);
13821387
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
1388+
1389+
sprites[1]->bubble()->setText("");
1390+
sprites[3]->bubble()->setText("");
1391+
engine.moveDrawableForwardLayers(sprites[2], 8);
1392+
ASSERT_EQ(sprites[0]->layerOrder(), 1);
1393+
ASSERT_EQ(sprites[1]->layerOrder(), 4);
1394+
ASSERT_EQ(sprites[2]->layerOrder(), 11);
1395+
ASSERT_EQ(sprites[3]->layerOrder(), 3);
1396+
ASSERT_EQ(sprites[4]->layerOrder(), 2);
1397+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 9);
1398+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 6);
1399+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 7);
1400+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 8);
1401+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 10);
13831402
}
13841403

13851404
TEST(EngineTest, MoveDrawableBackwardLayers)
@@ -1388,6 +1407,11 @@ TEST(EngineTest, MoveDrawableBackwardLayers)
13881407
std::vector<Sprite *> sprites;
13891408
createTargets(&engine, sprites);
13901409

1410+
const auto &targets = engine.targets();
1411+
1412+
for (auto target : targets)
1413+
target->bubble()->setText("test");
1414+
13911415
engine.moveDrawableBackwardLayers(sprites[4], -2);
13921416
ASSERT_EQ(sprites[0]->layerOrder(), 1);
13931417
ASSERT_EQ(sprites[1]->layerOrder(), 5);
@@ -1447,6 +1471,20 @@ TEST(EngineTest, MoveDrawableBackwardLayers)
14471471
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 8);
14481472
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 9);
14491473
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 11);
1474+
1475+
sprites[1]->bubble()->setText("");
1476+
sprites[3]->bubble()->setText("");
1477+
engine.moveDrawableBackwardLayers(sprites[2], -8);
1478+
ASSERT_EQ(sprites[0]->layerOrder(), 1);
1479+
ASSERT_EQ(sprites[1]->layerOrder(), 4);
1480+
ASSERT_EQ(sprites[2]->layerOrder(), 11);
1481+
ASSERT_EQ(sprites[3]->layerOrder(), 3);
1482+
ASSERT_EQ(sprites[4]->layerOrder(), 2);
1483+
ASSERT_EQ(sprites[0]->bubble()->layerOrder(), 9);
1484+
ASSERT_EQ(sprites[1]->bubble()->layerOrder(), 6);
1485+
ASSERT_EQ(sprites[2]->bubble()->layerOrder(), 7);
1486+
ASSERT_EQ(sprites[3]->bubble()->layerOrder(), 8);
1487+
ASSERT_EQ(sprites[4]->bubble()->layerOrder(), 10);
14501488
}
14511489

14521490
TEST(EngineTest, MoveDrawableBehindOther)

0 commit comments

Comments
 (0)