Add Label methods for code, strong, strikethrough and underline

This commit is contained in:
Emil Ernerfeldt 2021-01-30 15:51:19 +01:00
parent 26d47eabf0
commit d249ed86ba
3 changed files with 71 additions and 12 deletions

View file

@ -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 🔧

View file

@ -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

View file

@ -8,8 +8,11 @@ pub struct Label {
pub(crate) multiline: Option<bool>,
pub(crate) text_style: Option<TextStyle>,
pub(crate) background_color: Color32,
use_code_bg_color: bool,
pub(crate) text_color: Option<Color32>,
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);
}