| 1 | // Copyright © SixtyFPS GmbH <info@slint.dev> |
| 2 | // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0 |
| 3 | |
| 4 | use crate::diagnostics::BuildDiagnostics; |
| 5 | use crate::langtype::ElementType; |
| 6 | use crate::object_tree::*; |
| 7 | use crate::typeregister::TypeRegister; |
| 8 | use std::rc::Rc; |
| 9 | |
| 10 | pub fn lower_component_container( |
| 11 | component: &Rc<Component>, |
| 12 | type_register: &TypeRegister, |
| 13 | diag: &mut BuildDiagnostics, |
| 14 | ) { |
| 15 | let empty_type: ElementType = type_register.empty_type(); |
| 16 | |
| 17 | recurse_elem_including_sub_components_no_borrow(component, &None, &mut |elem: &Rc>, _| { |
| 18 | if matches!(&elem.borrow().builtin_type(), Some(b) if b.name == "ComponentContainer" ) { |
| 19 | diagnose_component_container(element:elem, diag); |
| 20 | process_component_container(element:elem, &empty_type); |
| 21 | } |
| 22 | Some(elem.clone()) |
| 23 | }) |
| 24 | } |
| 25 | |
| 26 | fn diagnose_component_container(element: &ElementRc, diag: &mut BuildDiagnostics) { |
| 27 | if !element.borrow().children.is_empty() { |
| 28 | diag.push_error(message:"ComponentContainers may not have children" .into(), &*element.borrow()); |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | fn process_component_container(element: &ElementRc, empty_type: &ElementType) { |
| 33 | let mut elem: RefMut<'_, Element> = element.borrow_mut(); |
| 34 | |
| 35 | let embedded_element: Rc> = Element::make_rc(self:Element { |
| 36 | base_type: empty_type.clone(), |
| 37 | id: elem.id.clone(), |
| 38 | debug: elem.debug.clone(), |
| 39 | enclosing_component: elem.enclosing_component.clone(), |
| 40 | default_fill_parent: (true, true), |
| 41 | is_legacy_syntax: elem.is_legacy_syntax, |
| 42 | inline_depth: elem.inline_depth, |
| 43 | is_component_placeholder: true, |
| 44 | ..Default::default() |
| 45 | }); |
| 46 | |
| 47 | elem.children.push(embedded_element); |
| 48 | } |
| 49 | |