mirror of
https://github.com/emilk/egui.git
synced 2026-09-01 14:20:04 -04:00
Correctly handle truncated text preferred size
This commit is contained in:
@@ -3,6 +3,7 @@ use crate::{
|
|||||||
};
|
};
|
||||||
use ahash::HashMap;
|
use ahash::HashMap;
|
||||||
use emath::{Align2, NumExt, Rect, Vec2};
|
use emath::{Align2, NumExt, Rect, Vec2};
|
||||||
|
use epaint::text::TextWrapMode;
|
||||||
use epaint::{Color32, Fonts, Galley};
|
use epaint::{Color32, Fonts, Galley};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
@@ -33,6 +34,7 @@ pub struct WidgetLayout<'a> {
|
|||||||
pub(crate) sense: Sense,
|
pub(crate) sense: Sense,
|
||||||
fallback_text_color: Option<Color32>,
|
fallback_text_color: Option<Color32>,
|
||||||
min_size: Vec2,
|
min_size: Vec2,
|
||||||
|
wrap_mode: Option<TextWrapMode>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> WidgetLayout<'a> {
|
impl<'a> WidgetLayout<'a> {
|
||||||
@@ -45,6 +47,7 @@ impl<'a> WidgetLayout<'a> {
|
|||||||
sense: Sense::hover(),
|
sense: Sense::hover(),
|
||||||
fallback_text_color: None,
|
fallback_text_color: None,
|
||||||
min_size: Vec2::ZERO,
|
min_size: Vec2::ZERO,
|
||||||
|
wrap_mode: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,6 +87,11 @@ impl<'a> WidgetLayout<'a> {
|
|||||||
self
|
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 {
|
pub fn show(self, ui: &mut Ui) -> AtomicLayoutResponse {
|
||||||
let Self {
|
let Self {
|
||||||
id,
|
id,
|
||||||
@@ -93,6 +101,7 @@ impl<'a> WidgetLayout<'a> {
|
|||||||
sense,
|
sense,
|
||||||
fallback_text_color,
|
fallback_text_color,
|
||||||
min_size,
|
min_size,
|
||||||
|
wrap_mode,
|
||||||
} = self;
|
} = self;
|
||||||
|
|
||||||
let id = id.unwrap_or_else(|| ui.next_auto_id());
|
let id = id.unwrap_or_else(|| ui.next_auto_id());
|
||||||
@@ -157,7 +166,7 @@ impl<'a> WidgetLayout<'a> {
|
|||||||
}
|
}
|
||||||
let (preferred_size, sized) =
|
let (preferred_size, sized) =
|
||||||
item.kind
|
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();
|
let size = sized.size();
|
||||||
|
|
||||||
desired_width += size.x;
|
desired_width += size.x;
|
||||||
@@ -175,7 +184,9 @@ impl<'a> WidgetLayout<'a> {
|
|||||||
available_inner_size.x - desired_width,
|
available_inner_size.x - desired_width,
|
||||||
available_inner_size.y,
|
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();
|
let size = sized.size();
|
||||||
|
|
||||||
desired_width += size.x;
|
desired_width += size.x;
|
||||||
@@ -328,11 +339,27 @@ impl<'a> AtomicKind<'a> {
|
|||||||
ui: &Ui,
|
ui: &Ui,
|
||||||
available_size: Vec2,
|
available_size: Vec2,
|
||||||
font_size: f32,
|
font_size: f32,
|
||||||
|
wrap_mode: Option<TextWrapMode>,
|
||||||
) -> (Vec2, SizedAtomicKind<'a>) {
|
) -> (Vec2, SizedAtomicKind<'a>) {
|
||||||
match self {
|
match self {
|
||||||
AtomicKind::Text(text) => {
|
AtomicKind::Text(text) => {
|
||||||
let galley = text.into_galley(ui, None, available_size.x, TextStyle::Button);
|
let wrap_mode = wrap_mode.unwrap_or(ui.wrap_mode());
|
||||||
(galley.desired_size(), SizedAtomicKind::Text(galley))
|
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) => {
|
AtomicKind::Image(image) => {
|
||||||
let max_size = Vec2::splat(font_size);
|
let max_size = Vec2::splat(font_size);
|
||||||
|
|||||||
Reference in New Issue
Block a user