Fix composite widgets with top level container
When wrapping container widgets to create reusable composite widgets, `drill` will be called twice on the same widget definition. The first call happens within the wrapping function and applies the children widgets fine. The second call happens when the composite widget is used, but since there are no children widgets defined, the call to `set_children` sets the existing child to `nil` instead. Fixes #3213. Signed-off-by: Lucas Schwiderski <lucas@lschwiderski.de>
This commit is contained in:
parent
aba1cf398f
commit
7bc3ec4c35
|
@ -533,32 +533,34 @@ local function drill(ids, content)
|
|||
end
|
||||
end
|
||||
|
||||
-- Add all widgets.
|
||||
for k = 1, max do
|
||||
-- ipairs cannot be used on sparse tables.
|
||||
local v, id2, e = widgets[k], id, nil
|
||||
if v then
|
||||
-- It is another declarative container, parse it.
|
||||
if (not v.is_widget) and (v.widget or v.layout) then
|
||||
e, id2 = drill(ids, v)
|
||||
widgets[k] = e
|
||||
elseif (not v.is_widget) and is_callable(v) then
|
||||
widgets[k] = v()
|
||||
end
|
||||
base.check_widget(widgets[k])
|
||||
if widgets and max > 0 then
|
||||
-- Add all widgets.
|
||||
for k = 1, max do
|
||||
-- ipairs cannot be used on sparse tables.
|
||||
local v, id2, e = widgets[k], id, nil
|
||||
if v then
|
||||
-- It is another declarative container, parse it.
|
||||
if (not v.is_widget) and (v.widget or v.layout) then
|
||||
e, id2 = drill(ids, v)
|
||||
widgets[k] = e
|
||||
elseif (not v.is_widget) and is_callable(v) then
|
||||
widgets[k] = v()
|
||||
end
|
||||
base.check_widget(widgets[k])
|
||||
|
||||
-- Place the widget in the access table.
|
||||
if id2 then
|
||||
l [id2] = e
|
||||
ids[id2] = ids[id2] or {}
|
||||
table.insert(ids[id2], e)
|
||||
-- Place the widget in the access table.
|
||||
if id2 then
|
||||
l [id2] = e
|
||||
ids[id2] = ids[id2] or {}
|
||||
table.insert(ids[id2], e)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Replace all children (if any) with the new ones.
|
||||
if widgets then
|
||||
|
||||
-- Replace all children (if any) with the new ones.
|
||||
l:set_children(widgets)
|
||||
end
|
||||
|
||||
return l, id
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue