diff --git a/sixtyfps_compiler/generator/rust.rs b/sixtyfps_compiler/generator/rust.rs index 4e77d6db5..fdccd7c32 100644 --- a/sixtyfps_compiler/generator/rust.rs +++ b/sixtyfps_compiler/generator/rust.rs @@ -572,8 +572,6 @@ fn generate_sub_component( let mut sub_component_names: Vec = vec![]; let mut sub_component_types: Vec = vec![]; - let mut repeater_count = 0; - for sub in &component.sub_components { let field_name = ident(&sub.name); 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(); 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!( - #repeater_count..=#last_repeater => { - Self::FIELD_OFFSETS.#field_name.apply_pin(_self).visit_dynamic_children(dyn_index - #repeater_count, order, visitor) + #repeater_offset..=#last_repeater => { + 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_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); if node.repeated { 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!( sixtyfps::re_exports::ItemTreeNode::DynamicTree { index: #repeater_index, diff --git a/sixtyfps_compiler/llr/expression.rs b/sixtyfps_compiler/llr/expression.rs index c2c2cdb03..73a46a94b 100644 --- a/sixtyfps_compiler/llr/expression.rs +++ b/sixtyfps_compiler/llr/expression.rs @@ -255,7 +255,7 @@ impl Expression { Self::Condition { true_expr, .. } => true_expr.ty(ctx), Self::Array { element_ty, .. } => Type::Array(element_ty.clone().into()), Self::Struct { ty, .. } => ty.clone(), - Self::PathEvents { .. } => todo!(), + Self::PathEvents { .. } => Type::PathData, Self::EasingCurve(_) => Type::Easing, Self::LinearGradient { .. } => Type::Brush, Self::EnumerationValue(e) => Type::Enumeration(e.enumeration.clone()), diff --git a/sixtyfps_compiler/llr/item_tree.rs b/sixtyfps_compiler/llr/item_tree.rs index b7f2b9d85..3a6e8a861 100644 --- a/sixtyfps_compiler/llr/item_tree.rs +++ b/sixtyfps_compiler/llr/item_tree.rs @@ -198,7 +198,7 @@ pub struct SubComponentInstance { pub ty: Rc, pub name: String, pub index_in_tree: usize, - //pub property_values: Vec<(PropertyReference, BindingExpression)>, + pub repeater_offset: usize, } impl std::fmt::Debug for SubComponentInstance { diff --git a/sixtyfps_compiler/llr/lower_to_item_tree.rs b/sixtyfps_compiler/llr/lower_to_item_tree.rs index 783ee3769..0dae168c4 100644 --- a/sixtyfps_compiler/llr/lower_to_item_tree.rs +++ b/sixtyfps_compiler/llr/lower_to_item_tree.rs @@ -201,6 +201,7 @@ fn lower_sub_component( }; let s: Option = None; + let mut repeater_offset = 0; crate::object_tree::recurse_elem(&component.root_element, &s, &mut |element, parent| { let elem = element.borrow(); for (p, x) in &elem.property_declarations { @@ -246,10 +247,12 @@ fn lower_sub_component( property_bindings.push((prop_ref.unwrap(), b.borrow().clone())); } sub_component.sub_components.push(SubComponentInstance { - ty, + ty: ty.clone(), name: elem.id.clone(), index_in_tree: *elem.item_index.get().unwrap(), + repeater_offset, }); + repeater_offset += ty.repeater_count(); } Type::Native(n) => { @@ -307,6 +310,9 @@ fn lower_sub_component( } sub_component.repeated = 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 .popup_windows .borrow()