diff --git a/crates/bevy_text/src/pipeline.rs b/crates/bevy_text/src/pipeline.rs index 56c861016cd23..47df272ae02c8 100644 --- a/crates/bevy_text/src/pipeline.rs +++ b/crates/bevy_text/src/pipeline.rs @@ -177,10 +177,10 @@ impl TextMeasureInfo { max: Vec2::ZERO, }; - let min = info.compute_size(Vec2::new(0.0, f32::INFINITY)); - let max = info.compute_size(Vec2::INFINITY); - info.min = min; - info.max = max; + let min_width = info.compute_size(Vec2::new(0.0, f32::INFINITY)); + let max_width = info.compute_size(Vec2::INFINITY); + info.min = min_width.min(max_width); + info.max = min_width.max(max_width); info } diff --git a/crates/bevy_ui/src/widget/text.rs b/crates/bevy_ui/src/widget/text.rs index 77204e43c037c..6e412de641e1e 100644 --- a/crates/bevy_ui/src/widget/text.rs +++ b/crates/bevy_ui/src/widget/text.rs @@ -50,7 +50,7 @@ impl Measure for TextMeasure { width: Option, height: Option, available_width: AvailableSpace, - _available_height: AvailableSpace, + available_height: AvailableSpace, ) -> Vec2 { let x = width.unwrap_or_else(|| match available_width { AvailableSpace::Definite(x) => { @@ -64,16 +64,20 @@ impl Measure for TextMeasure { AvailableSpace::MaxContent => self.info.max.x, }); - height - .map_or_else( - || match available_width { - AvailableSpace::Definite(_) => self.info.compute_size(Vec2::new(x, f32::MAX)), - AvailableSpace::MinContent => Vec2::new(x, self.info.min.y), - AvailableSpace::MaxContent => Vec2::new(x, self.info.max.y), - }, - |y| Vec2::new(x, y), - ) - .ceil() + let y = height.unwrap_or_else(|| { + if width.is_some() || matches!(available_width, AvailableSpace::Definite(_)) { + // given a definite width we have a definite height + self.info.compute_size(Vec2::new(x, f32::MAX)).y + } else { + match available_height { + AvailableSpace::MinContent => self.info.min.y, + AvailableSpace::MaxContent => self.info.max.y, + AvailableSpace::Definite(_) => self.info.compute_size(Vec2::new(x, f32::MAX)).y, + } + } + }); + + Vec2::new(x, y).ceil() } } @@ -88,7 +92,12 @@ fn create_text_measure( match TextMeasureInfo::from_text(&text, fonts, scale_factor) { Ok(measure) => { if text.linebreak_behavior == BreakLineOn::NoWrap { - content_size.set(FixedMeasure { size: measure.max }); + // with no wrapping the text will always be a single line, which is as wide as + // possible and as short as possible. so we use the max width and min height + // directly. + content_size.set(FixedMeasure { + size: Vec2::new(measure.max.x, measure.min.y), + }); } else { content_size.set(TextMeasure { info: measure }); }