mirror of
https://github.com/slint-ui/slint.git
synced 2025-10-01 14:21:16 +00:00
Fix missing repeaters in item tree with chained sub-components
The parent commit surfaced this issue, as we now rely on visiting all repeaters in the build_item_tree call.
This commit is contained in:
parent
e0f3e6b782
commit
d447cd155d
1 changed files with 32 additions and 0 deletions
|
@ -259,6 +259,38 @@ pub fn build_item_tree<T: ItemTreeBuilder>(
|
||||||
relative_parent_index,
|
relative_parent_index,
|
||||||
parent_item.borrow().item_index.get().map(|x| *x as u32).unwrap_or(parent_index)
|
parent_item.borrow().item_index.get().map(|x| *x as u32).unwrap_or(parent_index)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Suppose we have this:
|
||||||
|
// ```
|
||||||
|
// Button := Rectangle { /* some repeater here*/ }
|
||||||
|
// StandardButton := Button { /* no children */ }
|
||||||
|
// App := Dialog { StandardButton { /* no children */ }}
|
||||||
|
// ```
|
||||||
|
// The inlining pass ensures that *if* `StandardButton` had children, `Button` would be inlined, but that's not the case here.
|
||||||
|
//
|
||||||
|
// We are in the stage of visiting the Dialog's children and we'll end up visiting the Button's Rectangle because visit_item()
|
||||||
|
// on the StandardButton - a Dialog's child - follows all the way to the Rectangle as native item. We've also determine that
|
||||||
|
// StandardButton is a sub-component and we'll call visit_children() on it. Now we are here. However as `StandardButton` has no children,
|
||||||
|
// and therefore we would never recurse into `Button`'s children and thus miss the repeater. That is what this condition attempts to
|
||||||
|
// detect and chain the children visitation.
|
||||||
|
if children.is_empty() {
|
||||||
|
if let Some(nested_subcomponent) = parent_item.borrow().sub_component() {
|
||||||
|
visit_children(
|
||||||
|
state,
|
||||||
|
&nested_subcomponent.root_element.borrow().children,
|
||||||
|
&nested_subcomponent,
|
||||||
|
&nested_subcomponent.root_element,
|
||||||
|
parent_index,
|
||||||
|
relative_parent_index,
|
||||||
|
children_offset,
|
||||||
|
relative_children_offset,
|
||||||
|
repeater_count,
|
||||||
|
builder,
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let mut offset = children_offset + children.len() as u32;
|
let mut offset = children_offset + children.len() as u32;
|
||||||
|
|
||||||
let mut sub_component_states = VecDeque::new();
|
let mut sub_component_states = VecDeque::new();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue