refactor: track virtual offset in the layout

This commit is contained in:
Ashley Wulber 2025-03-20 10:10:02 -04:00 committed by Michael Murphy
parent 91eae67dd5
commit a3525ef56e
9 changed files with 200 additions and 78 deletions

View file

@ -137,10 +137,13 @@ impl<Message: 'static + Clone> Widget<Message, crate::Theme, Renderer> for FlexR
.iter()
.zip(&mut tree.children)
.zip(layout.children())
.for_each(|((child, state), layout)| {
child
.as_widget()
.operate(state, layout, renderer, operation);
.for_each(|((child, state), c_layout)| {
child.as_widget().operate(
state,
c_layout.with_virtual_offset(layout.virtual_offset()),
renderer,
operation,
);
});
});
}
@ -160,11 +163,11 @@ impl<Message: 'static + Clone> Widget<Message, crate::Theme, Renderer> for FlexR
.iter_mut()
.zip(&mut tree.children)
.zip(layout.children())
.map(|((child, state), layout)| {
.map(|((child, state), c_layout)| {
child.as_widget_mut().on_event(
state,
event.clone(),
layout,
c_layout.with_virtual_offset(layout.virtual_offset()),
cursor,
renderer,
clipboard,
@ -187,10 +190,14 @@ impl<Message: 'static + Clone> Widget<Message, crate::Theme, Renderer> for FlexR
.iter()
.zip(&tree.children)
.zip(layout.children())
.map(|((child, state), layout)| {
child
.as_widget()
.mouse_interaction(state, layout, cursor, viewport, renderer)
.map(|((child, state), c_layout)| {
child.as_widget().mouse_interaction(
state,
c_layout.with_virtual_offset(layout.virtual_offset()),
cursor,
viewport,
renderer,
)
})
.max()
.unwrap_or_default()
@ -206,15 +213,21 @@ impl<Message: 'static + Clone> Widget<Message, crate::Theme, Renderer> for FlexR
cursor: mouse::Cursor,
viewport: &Rectangle,
) {
for ((child, state), layout) in self
for ((child, state), c_layout) in self
.children
.iter()
.zip(&tree.children)
.zip(layout.children())
{
child
.as_widget()
.draw(state, renderer, theme, style, layout, cursor, viewport);
child.as_widget().draw(
state,
renderer,
theme,
style,
c_layout.with_virtual_offset(layout.virtual_offset()),
cursor,
viewport,
);
}
}