Remove internal State from responsive

This commit is contained in:
Héctor Ramón Jiménez 2025-08-20 23:31:35 +02:00
parent 497ebcd0c3
commit 6f72ac4650
No known key found for this signature in database
GPG key ID: 7CC46565708259A7

View file

@ -46,23 +46,18 @@ where
} }
} }
struct State {
tree: Tree,
}
impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer> impl<Message, Theme, Renderer> Widget<Message, Theme, Renderer>
for Responsive<'_, Message, Theme, Renderer> for Responsive<'_, Message, Theme, Renderer>
where where
Renderer: core::Renderer, Renderer: core::Renderer,
{ {
fn tag(&self) -> tree::Tag { fn tag(&self) -> tree::Tag {
tree::Tag::of::<State>() struct Marker;
tree::Tag::of::<Marker>()
} }
fn state(&self) -> tree::State { fn diff(&mut self, _tree: &mut Tree) {
tree::State::new(State { // Diff is deferred to layout
tree: Tree::empty(),
})
} }
fn size(&self) -> Size<Length> { fn size(&self) -> Size<Length> {
@ -78,14 +73,13 @@ where
renderer: &Renderer, renderer: &Renderer,
limits: &layout::Limits, limits: &layout::Limits,
) -> layout::Node { ) -> layout::Node {
let state = tree.state.downcast_mut::<State>();
let size = limits.max(); let size = limits.max();
self.content = (self.view)(size); self.content = (self.view)(size);
state.tree.diff(&mut self.content); tree.diff_children(std::slice::from_mut(&mut self.content));
self.content.as_widget_mut().layout( self.content.as_widget_mut().layout(
&mut state.tree, &mut tree.children[0],
renderer, renderer,
&limits.loose(), &limits.loose(),
) )
@ -102,10 +96,8 @@ where
shell: &mut Shell<'_, Message>, shell: &mut Shell<'_, Message>,
viewport: &Rectangle, viewport: &Rectangle,
) { ) {
let state = tree.state.downcast_mut::<State>();
self.content.as_widget_mut().update( self.content.as_widget_mut().update(
&mut state.tree, &mut tree.children[0],
event, event,
layout, layout,
cursor, cursor,
@ -126,10 +118,8 @@ where
cursor: mouse::Cursor, cursor: mouse::Cursor,
viewport: &Rectangle, viewport: &Rectangle,
) { ) {
let state = tree.state.downcast_ref::<State>();
self.content.as_widget().draw( self.content.as_widget().draw(
&state.tree, &tree.children[0],
renderer, renderer,
theme, theme,
style, style,
@ -147,10 +137,8 @@ where
viewport: &Rectangle, viewport: &Rectangle,
renderer: &Renderer, renderer: &Renderer,
) -> mouse::Interaction { ) -> mouse::Interaction {
let state = tree.state.downcast_ref::<State>();
self.content.as_widget().mouse_interaction( self.content.as_widget().mouse_interaction(
&state.tree, &tree.children[0],
layout, layout,
cursor, cursor,
viewport, viewport,
@ -165,10 +153,8 @@ where
renderer: &Renderer, renderer: &Renderer,
operation: &mut dyn widget::Operation, operation: &mut dyn widget::Operation,
) { ) {
let state = tree.state.downcast_mut::<State>();
self.content.as_widget_mut().operate( self.content.as_widget_mut().operate(
&mut state.tree, &mut tree.children[0],
layout, layout,
renderer, renderer,
operation, operation,
@ -183,10 +169,8 @@ where
viewport: &Rectangle, viewport: &Rectangle,
translation: Vector, translation: Vector,
) -> Option<overlay::Element<'a, Message, Theme, Renderer>> { ) -> Option<overlay::Element<'a, Message, Theme, Renderer>> {
let state = tree.state.downcast_mut::<State>();
self.content.as_widget_mut().overlay( self.content.as_widget_mut().overlay(
&mut state.tree, &mut tree.children[0],
layout, layout,
renderer, renderer,
viewport, viewport,