mirror of
https://github.com/slint-ui/slint.git
synced 2025-09-30 22:01:13 +00:00
Simplify the destructor of generated C++ components
Similar to the parent commit, avoid creating an array of item refs and pass the item tree instead to a run-time helper function.
This commit is contained in:
parent
67579ec560
commit
096fbab93d
3 changed files with 21 additions and 23 deletions
|
@ -113,9 +113,11 @@ public:
|
|||
float scale_factor() const { return sixtyfps_windowrc_get_scale_factor(&inner); }
|
||||
void set_scale_factor(float value) const { sixtyfps_windowrc_set_scale_factor(&inner, value); }
|
||||
|
||||
void free_graphics_resources(const sixtyfps::Slice<ItemRef> &items) const
|
||||
template<typename Component, typename ItemTree>
|
||||
void free_graphics_resources(Component *c, ItemTree items) const
|
||||
{
|
||||
cbindgen_private::sixtyfps_windowrc_free_graphics_resources(&inner, &items);
|
||||
cbindgen_private::sixtyfps_component_free_item_graphics_resources(
|
||||
vtable::VRef<ComponentVTable> { &Component::static_vtable, c }, items, &inner);
|
||||
}
|
||||
|
||||
void set_focus_item(const ComponentRc &component_rc, uintptr_t item_index)
|
||||
|
|
|
@ -1097,7 +1097,6 @@ fn generate_component(
|
|||
let mut repeated_input_branch = vec![];
|
||||
let mut repeater_layout_code = vec![];
|
||||
let mut tree_array = vec![];
|
||||
let mut item_names_and_vt_symbols = vec![];
|
||||
let mut repeater_count = 0;
|
||||
|
||||
#[derive(Default)]
|
||||
|
@ -1146,9 +1145,6 @@ fn generate_component(
|
|||
parent_index,
|
||||
));
|
||||
}
|
||||
let item_field_name = format!("{}{}", state.field_prefix, ident(&item.id));
|
||||
item_names_and_vt_symbols
|
||||
.push((item_field_name, item.base_type.as_native().cpp_vtable_getter.clone()));
|
||||
}
|
||||
},
|
||||
|state, sub_component, item_rc| {
|
||||
|
@ -1265,23 +1261,8 @@ fn generate_component(
|
|||
destructor.push("if (!parent) return;".to_owned())
|
||||
}
|
||||
|
||||
if !item_names_and_vt_symbols.is_empty() {
|
||||
destructor.push("sixtyfps::private_api::ItemRef items[] = {".into());
|
||||
destructor.push(
|
||||
item_names_and_vt_symbols
|
||||
.iter()
|
||||
.map(|(item_name, vt_symbol)| {
|
||||
format!(
|
||||
"{{ {vt}, const_cast<decltype(this->{id})*>(&this->{id}) }}",
|
||||
id = item_name,
|
||||
vt = vt_symbol
|
||||
)
|
||||
})
|
||||
.join(","),
|
||||
);
|
||||
destructor.push("};".into());
|
||||
destructor.push("m_window.window_handle().free_graphics_resources(sixtyfps::Slice<sixtyfps::private_api::ItemRef>{items, std::size(items)});".into());
|
||||
}
|
||||
destructor
|
||||
.push("m_window.window_handle().free_graphics_resources(this, item_tree());".into());
|
||||
|
||||
component_struct.members.push((
|
||||
Access::Public,
|
||||
|
|
|
@ -113,4 +113,19 @@ pub(crate) mod ffi {
|
|||
window,
|
||||
)
|
||||
}
|
||||
|
||||
/// Free the backend graphics resources allocated by the component's items.
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn sixtyfps_component_free_item_graphics_resources(
|
||||
component: ComponentRefPin,
|
||||
item_tree: Slice<ItemTreeNode<u8>>,
|
||||
window_handle: *const crate::window::ffi::WindowRcOpaque,
|
||||
) {
|
||||
let window = &*(window_handle as *const WindowRc);
|
||||
super::free_component_item_graphics_resources(
|
||||
core::pin::Pin::new_unchecked(&*(component.as_ptr() as *const u8)),
|
||||
item_tree.as_slice(),
|
||||
window,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue