mirror of
https://github.com/slint-ui/slint.git
synced 2025-08-03 10:23:32 +00:00

These are two different concept, and it is confusing to keep them in the same enum We want to support component without any base element, and Void is already used for global component, so do this refactoring before
42 lines
1.3 KiB
Rust
42 lines
1.3 KiB
Rust
// Copyright © SixtyFPS GmbH <info@slint-ui.com>
|
|
// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-commercial
|
|
|
|
//! Passes that fills the root component used_types.sub_components
|
|
|
|
use by_address::ByAddress;
|
|
|
|
use crate::langtype::ElementType;
|
|
use crate::object_tree::*;
|
|
use std::collections::HashSet;
|
|
use std::rc::Rc;
|
|
|
|
/// Fill the root_component's used_types.sub_components
|
|
pub fn collect_subcomponents(root_component: &Rc<Component>) {
|
|
let mut result = vec![];
|
|
let mut hash = HashSet::new();
|
|
|
|
collect_subcomponents_recursive(root_component, &mut result, &mut hash);
|
|
|
|
root_component.used_types.borrow_mut().sub_components = result;
|
|
}
|
|
|
|
fn collect_subcomponents_recursive(
|
|
component: &Rc<Component>,
|
|
result: &mut Vec<Rc<Component>>,
|
|
hash: &mut HashSet<ByAddress<Rc<Component>>>,
|
|
) {
|
|
hash.insert(ByAddress(component.clone()));
|
|
recurse_elem(&component.root_element, &(), &mut |elem: &ElementRc, &()| {
|
|
let base_comp = match &elem.borrow().base_type {
|
|
ElementType::Component(base_comp) => {
|
|
if hash.contains(&ByAddress(base_comp.clone())) {
|
|
return;
|
|
}
|
|
base_comp.clone()
|
|
}
|
|
_ => return,
|
|
};
|
|
collect_subcomponents_recursive(&base_comp, result, hash);
|
|
result.push(base_comp);
|
|
});
|
|
}
|