mirror of
https://github.com/slint-ui/slint.git
synced 2025-10-01 06:11:16 +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); }
|
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 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)
|
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 repeated_input_branch = vec![];
|
||||||
let mut repeater_layout_code = vec![];
|
let mut repeater_layout_code = vec![];
|
||||||
let mut tree_array = vec![];
|
let mut tree_array = vec![];
|
||||||
let mut item_names_and_vt_symbols = vec![];
|
|
||||||
let mut repeater_count = 0;
|
let mut repeater_count = 0;
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
@ -1146,9 +1145,6 @@ fn generate_component(
|
||||||
parent_index,
|
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| {
|
|state, sub_component, item_rc| {
|
||||||
|
@ -1265,23 +1261,8 @@ fn generate_component(
|
||||||
destructor.push("if (!parent) return;".to_owned())
|
destructor.push("if (!parent) return;".to_owned())
|
||||||
}
|
}
|
||||||
|
|
||||||
if !item_names_and_vt_symbols.is_empty() {
|
destructor
|
||||||
destructor.push("sixtyfps::private_api::ItemRef items[] = {".into());
|
.push("m_window.window_handle().free_graphics_resources(this, item_tree());".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());
|
|
||||||
}
|
|
||||||
|
|
||||||
component_struct.members.push((
|
component_struct.members.push((
|
||||||
Access::Public,
|
Access::Public,
|
||||||
|
|
|
@ -113,4 +113,19 @@ pub(crate) mod ffi {
|
||||||
window,
|
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