mirror of
https://github.com/slint-ui/slint.git
synced 2025-09-30 05:44:52 +00:00
More visitor cleanups
Provide a non-mutable visitor as well, as the actual rendering loop doesn't need to change the items fortunately.
This commit is contained in:
parent
f22b18584e
commit
5986d5f2b8
2 changed files with 38 additions and 4 deletions
|
@ -186,14 +186,48 @@ impl ComponentUniquePtr {
|
|||
///
|
||||
/// The state parametter returned by the visitor is passed to each children.
|
||||
pub fn visit_items<State>(
|
||||
&mut self,
|
||||
mut visitor: impl FnMut(&mut Item, &State) -> State,
|
||||
&self,
|
||||
mut visitor: impl FnMut(&Item, &State) -> State,
|
||||
state: State,
|
||||
) {
|
||||
self.visit_internal(&mut visitor, 0, &state)
|
||||
}
|
||||
|
||||
fn visit_internal<State>(
|
||||
&self,
|
||||
visitor: &mut impl FnMut(&Item, &State) -> State,
|
||||
index: isize,
|
||||
state: &State,
|
||||
) {
|
||||
let item_tree = unsafe { (self.vtable.as_ref().item_tree)(self.vtable.as_ptr()) };
|
||||
match unsafe { &*item_tree.offset(index) } {
|
||||
ItemTreeNode::Item { vtable, offset, children_index, chilren_count } => {
|
||||
let item = unsafe {
|
||||
Item::new(
|
||||
NonNull::new_unchecked(*vtable as *mut _),
|
||||
NonNull::new_unchecked(
|
||||
(self.inner.as_ptr() as *mut u8).offset(*offset) as *mut _
|
||||
),
|
||||
)
|
||||
};
|
||||
let state = visitor(&item, state);
|
||||
for c in *children_index..(*children_index + *chilren_count) {
|
||||
self.visit_internal(visitor, c as isize, &state)
|
||||
}
|
||||
}
|
||||
ItemTreeNode::DynamicTree { .. } => todo!(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn visit_items_mut<State>(
|
||||
&mut self,
|
||||
mut visitor: impl FnMut(&mut Item, &State) -> State,
|
||||
state: State,
|
||||
) {
|
||||
self.visit_internal_mut(&mut visitor, 0, &state)
|
||||
}
|
||||
|
||||
fn visit_internal_mut<State>(
|
||||
&mut self,
|
||||
visitor: &mut impl FnMut(&mut Item, &State) -> State,
|
||||
index: isize,
|
||||
|
@ -212,7 +246,7 @@ impl ComponentUniquePtr {
|
|||
};
|
||||
let state = visitor(&mut item, state);
|
||||
for c in *children_index..(*children_index + *chilren_count) {
|
||||
self.visit_internal(visitor, c as isize, &state)
|
||||
self.visit_internal_mut(visitor, c as isize, &state)
|
||||
}
|
||||
}
|
||||
ItemTreeNode::DynamicTree { .. } => todo!(),
|
||||
|
|
|
@ -89,7 +89,7 @@ pub fn run_component<GraphicsBackend, GraphicsFactoryFunc>(
|
|||
let rendering_cache = &mut main_window.rendering_cache;
|
||||
|
||||
// Generate cached rendering data once
|
||||
component.visit_items(
|
||||
component.visit_items_mut(
|
||||
move |item, _| {
|
||||
let item_rendering_info = {
|
||||
match item.rendering_info() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue