[lua] Fix new layers not going to the top when selected (fix #5364)

This commit is contained in:
Christian Kaiser 2025-08-19 13:35:29 -03:00 committed by David Capello
parent 3bc4ac0838
commit af349ce7ee
2 changed files with 81 additions and 10 deletions

View File

@ -267,16 +267,8 @@ void NewLayerCommand::onExecute(Context* context)
bool afterBackground = false;
switch (m_type) {
case Type::Layer:
if (m_place == Place::BeforeActiveLayer) {
layer = api.newLayer(parent, name);
api.restackLayerBefore(layer, parent, activeLayer);
}
else
layer = api.newLayerAfter(parent, name, activeLayer);
break;
case Type::Group: layer = api.newGroupAfter(parent, name, activeLayer); break;
case Type::Layer: layer = api.newLayer(parent, name); break;
case Type::Group: layer = api.newGroup(parent, name); break;
case Type::ReferenceLayer:
layer = api.newLayer(parent, name);
if (layer)
@ -311,6 +303,15 @@ void NewLayerCommand::onExecute(Context* context)
ASSERT(layer->parent());
// Reorder the resulting layer.
switch (m_place) {
case Place::AfterActiveLayer: api.restackLayerAfter(layer, parent, activeLayer); break;
case Place::BeforeActiveLayer: api.restackLayerBefore(layer, parent, activeLayer); break;
case Place::Top:
api.restackLayerAfter(layer, sprite->root(), sprite->root()->lastLayer());
break;
}
// Put new layer as an overlay of the background or in the first
// layer in case the sprite is transparent.
if (afterBackground) {

View File

@ -140,6 +140,76 @@ do -- NewLayer/RemoveLayer
assert(#s.layers == 1)
end
-- NewLayer Ordering
do
local function testNewLayerOrdering(testGroup, testTilemap)
local s = Sprite(32, 32)
assert(#s.layers == 1)
local base = app.layer
app.command.NewLayer{ name = "First", group = testGroup, tilemap = testTilemap }
local first = app.layer
app.command.NewLayer{ name = "Second", group = testGroup, tilemap = testTilemap }
local second = app.layer
app.command.NewLayer{ name = "Third", group = testGroup, tilemap = testTilemap }
local third = app.layer
s:deleteLayer(base)
expect_eq(first.name, "First")
expect_eq(second.name, "Second")
expect_eq(third.name, "Third")
expect_eq(first.stackIndex, 1)
expect_eq(second.stackIndex, 2)
expect_eq(third.stackIndex, 3)
app.layer = second
app.command.NewLayer{ before = true, name = "Before Second", group = testGroup, tilemap = testTilemap }
local beforeSecond = app.layer
app.layer = second
app.command.NewLayer{ before = false, name = "After Second", group = testGroup, tilemap = testTilemap }
local afterSecond = app.layer
expect_eq(first.name, "First")
expect_eq(second.name, "Second")
expect_eq(third.name, "Third")
expect_eq(beforeSecond.name, "Before Second")
expect_eq(afterSecond.name, "After Second")
expect_eq(first.stackIndex, 1)
expect_eq(beforeSecond.stackIndex, 2)
expect_eq(second.stackIndex, 3)
expect_eq(afterSecond.stackIndex, 4)
expect_eq(third.stackIndex, 5)
app.layer = second
app.command.NewLayer{ top = true, name = "Top", group = testGroup, tilemap = testTilemap }
local top = app.layer
expect_eq(top.stackIndex, 6)
app.layer = first
app.command.NewLayer{ before = true, name = "Bottom", group = testGroup, tilemap = testTilemap }
local bottom = app.layer
expect_eq(bottom.stackIndex, 1)
expect_eq(first.stackIndex, 2)
expect_eq(beforeSecond.stackIndex, 3)
expect_eq(second.stackIndex, 4)
expect_eq(afterSecond.stackIndex, 5)
expect_eq(third.stackIndex, 6)
expect_eq(top.stackIndex, 7)
s:close()
end
testNewLayerOrdering(false, false) -- Regular layers
testNewLayerOrdering(true, false) -- Groups
testNewLayerOrdering(false, true) -- Tilemaps
end
do -- Background/Transparent layers
local s = Sprite(32, 32)
assert(s.layers[1].isTransparent)