LLR: Fix the repeater indices

This commit is contained in:
Olivier Goffart 2022-01-10 11:42:21 +01:00 committed by Olivier Goffart
parent 9e61d4168b
commit 07ea17fe71
4 changed files with 19 additions and 10 deletions

View file

@ -572,8 +572,6 @@ fn generate_sub_component(
let mut sub_component_names: Vec<Ident> = vec![]; let mut sub_component_names: Vec<Ident> = vec![];
let mut sub_component_types: Vec<Ident> = vec![]; let mut sub_component_types: Vec<Ident> = vec![];
let mut repeater_count = 0;
for sub in &component.sub_components { for sub in &component.sub_components {
let field_name = ident(&sub.name); let field_name = ident(&sub.name);
let sub_component_id = self::inner_component_id(&sub.ty); let sub_component_id = self::inner_component_id(&sub.ty);
@ -598,14 +596,14 @@ fn generate_sub_component(
let sub_component_repeater_count = sub.ty.repeater_count(); let sub_component_repeater_count = sub.ty.repeater_count();
if sub_component_repeater_count > 0 { if sub_component_repeater_count > 0 {
let last_repeater: usize = repeater_count + sub_component_repeater_count - 1; let repeater_offset = sub.repeater_offset;
let last_repeater: usize = repeater_offset + sub_component_repeater_count - 1;
repeated_visit_branch.push(quote!( repeated_visit_branch.push(quote!(
#repeater_count..=#last_repeater => { #repeater_offset..=#last_repeater => {
Self::FIELD_OFFSETS.#field_name.apply_pin(_self).visit_dynamic_children(dyn_index - #repeater_count, order, visitor) Self::FIELD_OFFSETS.#field_name.apply_pin(_self).visit_dynamic_children(dyn_index - #repeater_offset, order, visitor)
} }
)); ));
} }
repeater_count += sub_component_repeater_count;
sub_component_names.push(field_name); sub_component_names.push(field_name);
sub_component_types.push(sub_component_id); sub_component_types.push(sub_component_id);
@ -851,7 +849,12 @@ fn generate_item_tree(
let (path, component) = follow_sub_component_path(&sub_tree.root, &node.sub_component_path); let (path, component) = follow_sub_component_path(&sub_tree.root, &node.sub_component_path);
if node.repeated { if node.repeated {
assert_eq!(node.children.len(), 0); assert_eq!(node.children.len(), 0);
let repeater_index = node.item_index; let mut repeater_index = node.item_index;
let mut sub_component = &sub_tree.root;
for i in &node.sub_component_path {
repeater_index += sub_component.sub_components[*i].repeater_offset;
sub_component = &sub_component.sub_components[*i].ty;
}
item_tree_array.push(quote!( item_tree_array.push(quote!(
sixtyfps::re_exports::ItemTreeNode::DynamicTree { sixtyfps::re_exports::ItemTreeNode::DynamicTree {
index: #repeater_index, index: #repeater_index,

View file

@ -255,7 +255,7 @@ impl Expression {
Self::Condition { true_expr, .. } => true_expr.ty(ctx), Self::Condition { true_expr, .. } => true_expr.ty(ctx),
Self::Array { element_ty, .. } => Type::Array(element_ty.clone().into()), Self::Array { element_ty, .. } => Type::Array(element_ty.clone().into()),
Self::Struct { ty, .. } => ty.clone(), Self::Struct { ty, .. } => ty.clone(),
Self::PathEvents { .. } => todo!(), Self::PathEvents { .. } => Type::PathData,
Self::EasingCurve(_) => Type::Easing, Self::EasingCurve(_) => Type::Easing,
Self::LinearGradient { .. } => Type::Brush, Self::LinearGradient { .. } => Type::Brush,
Self::EnumerationValue(e) => Type::Enumeration(e.enumeration.clone()), Self::EnumerationValue(e) => Type::Enumeration(e.enumeration.clone()),

View file

@ -198,7 +198,7 @@ pub struct SubComponentInstance {
pub ty: Rc<SubComponent>, pub ty: Rc<SubComponent>,
pub name: String, pub name: String,
pub index_in_tree: usize, pub index_in_tree: usize,
//pub property_values: Vec<(PropertyReference, BindingExpression)>, pub repeater_offset: usize,
} }
impl std::fmt::Debug for SubComponentInstance { impl std::fmt::Debug for SubComponentInstance {

View file

@ -201,6 +201,7 @@ fn lower_sub_component(
}; };
let s: Option<ElementRc> = None; let s: Option<ElementRc> = None;
let mut repeater_offset = 0;
crate::object_tree::recurse_elem(&component.root_element, &s, &mut |element, parent| { crate::object_tree::recurse_elem(&component.root_element, &s, &mut |element, parent| {
let elem = element.borrow(); let elem = element.borrow();
for (p, x) in &elem.property_declarations { for (p, x) in &elem.property_declarations {
@ -246,10 +247,12 @@ fn lower_sub_component(
property_bindings.push((prop_ref.unwrap(), b.borrow().clone())); property_bindings.push((prop_ref.unwrap(), b.borrow().clone()));
} }
sub_component.sub_components.push(SubComponentInstance { sub_component.sub_components.push(SubComponentInstance {
ty, ty: ty.clone(),
name: elem.id.clone(), name: elem.id.clone(),
index_in_tree: *elem.item_index.get().unwrap(), index_in_tree: *elem.item_index.get().unwrap(),
repeater_offset,
}); });
repeater_offset += ty.repeater_count();
} }
Type::Native(n) => { Type::Native(n) => {
@ -307,6 +310,9 @@ fn lower_sub_component(
} }
sub_component.repeated = sub_component.repeated =
repeated.into_iter().map(|elem| lower_repeated_component(&elem, &ctx)).collect(); repeated.into_iter().map(|elem| lower_repeated_component(&elem, &ctx)).collect();
for s in &mut sub_component.sub_components {
s.repeater_offset += sub_component.repeated.len();
}
sub_component.popup_windows = component sub_component.popup_windows = component
.popup_windows .popup_windows
.borrow() .borrow()