diff --git a/crates/bevy_ui/src/layout/mod.rs b/crates/bevy_ui/src/layout/mod.rs index 4429a73511f6d..b05edfa008d3c 100644 --- a/crates/bevy_ui/src/layout/mod.rs +++ b/crates/bevy_ui/src/layout/mod.rs @@ -18,7 +18,7 @@ use bevy_utils::HashMap; use bevy_window::{PrimaryWindow, Window, WindowResolution, WindowScaleFactorChanged}; use std::fmt; use taffy::{ - prelude::Size, + prelude::{AvailableSpace, Size}, style_helpers::TaffyMaxContent, Taffy, }; @@ -91,11 +91,25 @@ impl UiSurface { } } - pub fn update_measure(&mut self, entity: Entity, content_size: &mut ContentSize) { - if let Some(measure_func) = content_size.measure_func.take() { - let taffy_node = self.entity_to_taffy.get(&entity).unwrap(); - self.taffy.set_measure(*taffy_node, Some(taffy::node::MeasureFunc::Boxed(measure_func))).ok(); - } + pub fn update_measure(&mut self, entity: Entity, content_size: &ContentSize) { + let measure = content_size.measure.dyn_clone(); + let measure_func = taffy::node::MeasureFunc::Boxed(Box::new( + move |constraints: Size>, available: Size| { + let size = measure.measure( + constraints.width, + constraints.height, + available.width, + available.height, + ); + taffy::geometry::Size { + width: size.x, + height: size.y, + } + }, + )); + + let taffy_node = self.entity_to_taffy.get(&entity).unwrap(); + self.taffy.set_measure(*taffy_node, Some(measure_func)).ok(); } pub fn update_children(&mut self, entity: Entity, children: &Children) { @@ -216,7 +230,7 @@ pub fn ui_layout_system( mut ui_surface: ResMut, root_node_query: Query, Without)>, style_query: Query<(Entity, Ref