diff --git a/crates/egui/src/widget_layout.rs b/crates/egui/src/widget_layout.rs index c6bc10b3a..28f243896 100644 --- a/crates/egui/src/widget_layout.rs +++ b/crates/egui/src/widget_layout.rs @@ -3,6 +3,7 @@ use crate::{ }; use ahash::HashMap; use emath::{Align2, NumExt, Rect, Vec2}; +use epaint::text::TextWrapMode; use epaint::{Color32, Fonts, Galley}; use std::sync::Arc; @@ -33,6 +34,7 @@ pub struct WidgetLayout<'a> { pub(crate) sense: Sense, fallback_text_color: Option, min_size: Vec2, + wrap_mode: Option, } impl<'a> WidgetLayout<'a> { @@ -45,6 +47,7 @@ impl<'a> WidgetLayout<'a> { sense: Sense::hover(), fallback_text_color: None, min_size: Vec2::ZERO, + wrap_mode: None, } } @@ -84,6 +87,11 @@ impl<'a> WidgetLayout<'a> { self } + pub fn wrap_mode(mut self, wrap_mode: TextWrapMode) -> Self { + self.wrap_mode = Some(wrap_mode); + self + } + pub fn show(self, ui: &mut Ui) -> AtomicLayoutResponse { let Self { id, @@ -93,6 +101,7 @@ impl<'a> WidgetLayout<'a> { sense, fallback_text_color, min_size, + wrap_mode, } = self; let id = id.unwrap_or_else(|| ui.next_auto_id()); @@ -157,7 +166,7 @@ impl<'a> WidgetLayout<'a> { } let (preferred_size, sized) = item.kind - .into_sized(ui, available_inner_size, max_font_size); + .into_sized(ui, available_inner_size, max_font_size, wrap_mode); let size = sized.size(); desired_width += size.x; @@ -175,7 +184,9 @@ impl<'a> WidgetLayout<'a> { available_inner_size.x - desired_width, available_inner_size.y, ); - let (preferred_size, sized) = item.kind.into_sized(ui, shrunk_size, max_font_size); + let (preferred_size, sized) = + item.kind + .into_sized(ui, shrunk_size, max_font_size, wrap_mode); let size = sized.size(); desired_width += size.x; @@ -328,11 +339,27 @@ impl<'a> AtomicKind<'a> { ui: &Ui, available_size: Vec2, font_size: f32, + wrap_mode: Option, ) -> (Vec2, SizedAtomicKind<'a>) { match self { AtomicKind::Text(text) => { - let galley = text.into_galley(ui, None, available_size.x, TextStyle::Button); - (galley.desired_size(), SizedAtomicKind::Text(galley)) + let wrap_mode = wrap_mode.unwrap_or(ui.wrap_mode()); + let desired_size = matches!(wrap_mode, TextWrapMode::Truncate).then(|| { + text.clone() + .into_galley( + ui, + Some(TextWrapMode::Extend), + available_size.x, + TextStyle::Button, + ) + .desired_size() + }); + let galley = + text.into_galley(ui, Some(wrap_mode), available_size.x, TextStyle::Button); + ( + desired_size.unwrap_or_else(|| galley.desired_size()), + SizedAtomicKind::Text(galley), + ) } AtomicKind::Image(image) => { let max_size = Vec2::splat(font_size);