diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e9e7763..abc6840d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). * Add support for secondary and middle mouse buttons. * `egui::popup::popup_below_widget`: show a popup area below another widget. * Add `Slider::clamp_to_range(bool)`: if set, clamp the incoming and outgoing values to the slider range. +* Add `Label` methods for code, strong, strikethrough and underline. ### Changed 🔧 diff --git a/egui/src/style.rs b/egui/src/style.rs index d1e884b2..cbf21934 100644 --- a/egui/src/style.rs +++ b/egui/src/style.rs @@ -169,6 +169,10 @@ impl Visuals { self.override_text_color .unwrap_or_else(|| self.widgets.noninteractive.text_color()) } + + pub fn strong_text_color(&self) -> Color32 { + self.widgets.active.text_color() + } } /// Selected text, selected elements etc diff --git a/egui/src/widgets/label.rs b/egui/src/widgets/label.rs index d80898af..a7a2c044 100644 --- a/egui/src/widgets/label.rs +++ b/egui/src/widgets/label.rs @@ -8,8 +8,11 @@ pub struct Label { pub(crate) multiline: Option, pub(crate) text_style: Option, pub(crate) background_color: Color32, - use_code_bg_color: bool, pub(crate) text_color: Option, + code: bool, + strong: bool, + strikethrough: bool, + underline: bool, } impl Label { @@ -19,8 +22,11 @@ impl Label { multiline: None, text_style: None, background_color: Color32::TRANSPARENT, - use_code_bg_color: false, text_color: None, + code: false, + strong: false, + strikethrough: false, + underline: false, } } @@ -39,7 +45,7 @@ impl Label { self } - /// If you do not set a `TextStyle`, the default `style.text_style`. + /// The default is [`Style::body_text_style`] (generally [`TextStyle::Body`]). pub fn text_style(mut self, text_style: TextStyle) -> Self { self.text_style = Some(text_style); self @@ -55,10 +61,28 @@ impl Label { /// Monospace label with gray background pub fn code(mut self) -> Self { - self.use_code_bg_color = true; + self.code = true; self.text_style(TextStyle::Monospace) } + /// Extra white text + pub fn strong(mut self) -> Self { + self.strong = true; + self + } + + /// draw a line under the text + pub fn underline(mut self) -> Self { + self.underline = true; + self + } + + /// draw a line through the text, crossing it out + pub fn strikethrough(mut self) -> Self { + self.strikethrough = true; + self + } + pub fn small(self) -> Self { self.text_style(TextStyle::Small) } @@ -103,22 +127,52 @@ impl Label { // This should be the easiest method of putting text anywhere. pub fn paint_galley(&self, ui: &mut Ui, pos: Pos2, galley: Galley) { - let mut background_color = self.background_color; - if self.use_code_bg_color { + let Self { + mut background_color, + code, + strong, + strikethrough, + underline, + .. + } = *self; + + let text_color = self.text_color.unwrap_or_else(|| { + if strong { + ui.style().visuals.strong_text_color() + } else { + ui.style().visuals.text_color() + } + }); + + if code { background_color = ui.style().visuals.code_bg_color; } - if background_color != Color32::TRANSPARENT { + + if strikethrough || underline || background_color != Color32::TRANSPARENT { for row in &galley.rows { let rect = row.rect().translate(pos.to_vec2()); - let rect = rect.expand(1.0); // looks better - ui.painter().rect_filled(rect, 0.0, background_color); + + let stroke_width = 1.0; + if strikethrough { + ui.painter().line_segment( + [rect.left_center(), rect.right_center()], + (stroke_width, text_color), + ); + } + if underline { + ui.painter().line_segment( + [rect.left_bottom(), rect.right_bottom()], + (stroke_width, text_color), + ); + } + if background_color != Color32::TRANSPARENT { + let rect = rect.expand(1.0); // looks better + ui.painter().rect_filled(rect, 0.0, background_color); + } } } let text_style = self.text_style_or_default(ui.style()); - let text_color = self - .text_color - .unwrap_or_else(|| ui.style().visuals.text_color()); ui.painter().galley(pos, galley, text_style, text_color); }