diff --git a/crates/egui/src/widget_text.rs b/crates/egui/src/widget_text.rs index 011a4adcbb0..6aa6edcb4fb 100644 --- a/crates/egui/src/widget_text.rs +++ b/crates/egui/src/widget_text.rs @@ -20,7 +20,7 @@ use crate::{ /// RichText::new("colored").color(Color32::RED); /// RichText::new("Large and underlined").size(20.0).underline(); /// ``` -#[derive(Clone, Default, PartialEq)] +#[derive(Clone, PartialEq)] pub struct RichText { text: String, size: Option, @@ -29,6 +29,7 @@ pub struct RichText { family: Option, text_style: Option, background_color: Color32, + expand_bg: f32, text_color: Option, code: bool, strong: bool, @@ -39,6 +40,29 @@ pub struct RichText { raised: bool, } +impl Default for RichText { + fn default() -> Self { + Self { + text: Default::default(), + size: Default::default(), + extra_letter_spacing: Default::default(), + line_height: Default::default(), + family: Default::default(), + text_style: Default::default(), + background_color: Default::default(), + expand_bg: 1.0, + text_color: Default::default(), + code: Default::default(), + strong: Default::default(), + weak: Default::default(), + strikethrough: Default::default(), + underline: Default::default(), + italics: Default::default(), + raised: Default::default(), + } + } +} + impl From<&str> for RichText { #[inline] fn from(text: &str) -> Self { @@ -360,6 +384,7 @@ impl RichText { family, text_style, background_color, + expand_bg, text_color: _, // already used by `get_text_color` code, strong: _, // already used by `get_text_color` @@ -425,6 +450,7 @@ impl RichText { underline, strikethrough, valign, + expand_bg, }, ) } diff --git a/crates/epaint/src/text/text_layout.rs b/crates/epaint/src/text/text_layout.rs index 9db77f888af..04d68efc964 100644 --- a/crates/epaint/src/text/text_layout.rs +++ b/crates/epaint/src/text/text_layout.rs @@ -753,10 +753,10 @@ fn add_row_backgrounds(job: &LayoutJob, row: &Row, mesh: &mut Mesh) { return; } - let mut end_run = |start: Option<(Color32, Rect)>, stop_x: f32| { - if let Some((color, start_rect)) = start { + let mut end_run = |start: Option<(Color32, Rect, f32)>, stop_x: f32| { + if let Some((color, start_rect, expand)) = start { let rect = Rect::from_min_max(start_rect.left_top(), pos2(stop_x, start_rect.bottom())); - let rect = rect.expand(1.0); // looks better + let rect = rect.expand(expand); mesh.add_colored_rect(rect, color); } }; @@ -771,18 +771,19 @@ fn add_row_backgrounds(job: &LayoutJob, row: &Row, mesh: &mut Mesh) { if color == Color32::TRANSPARENT { end_run(run_start.take(), last_rect.right()); - } else if let Some((existing_color, start)) = run_start { + } else if let Some((existing_color, start, expand)) = run_start { if existing_color == color && start.top() == rect.top() && start.bottom() == rect.bottom() + && format.expand_bg == expand { // continue the same background rectangle } else { end_run(run_start.take(), last_rect.right()); - run_start = Some((color, rect)); + run_start = Some((color, rect, format.expand_bg)); } } else { - run_start = Some((color, rect)); + run_start = Some((color, rect, format.expand_bg)); } last_rect = rect; diff --git a/crates/epaint/src/text/text_layout_types.rs b/crates/epaint/src/text/text_layout_types.rs index 17826e6afb1..fa02a971f2e 100644 --- a/crates/epaint/src/text/text_layout_types.rs +++ b/crates/epaint/src/text/text_layout_types.rs @@ -271,6 +271,11 @@ pub struct TextFormat { pub background: Color32, + /// Amount to expand background fill by. + /// + /// Default: 1.0 + pub expand_bg: f32, + pub italics: bool, pub underline: Stroke, @@ -298,6 +303,7 @@ impl Default for TextFormat { line_height: None, color: Color32::GRAY, background: Color32::TRANSPARENT, + expand_bg: 1.0, italics: false, underline: Stroke::NONE, strikethrough: Stroke::NONE, @@ -315,6 +321,7 @@ impl std::hash::Hash for TextFormat { line_height, color, background, + expand_bg, italics, underline, strikethrough, @@ -327,6 +334,7 @@ impl std::hash::Hash for TextFormat { } color.hash(state); background.hash(state); + emath::OrderedFloat(*expand_bg).hash(state); italics.hash(state); underline.hash(state); strikethrough.hash(state);