Add background styling to span / rich text

This commit is contained in:
Cory Forsstrom 2024-07-23 13:36:40 -07:00 committed by Héctor Ramón Jiménez
parent 23a7e9f981
commit ddcf02f9d0
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
7 changed files with 141 additions and 16 deletions

View file

@ -111,6 +111,10 @@ impl text::Paragraph for () {
fn hit_span(&self, _point: Point) -> Option<usize> {
None
}
fn span_bounds(&self, _index: usize) -> Vec<Rectangle> {
vec![]
}
}
impl text::Editor for () {

View file

@ -8,7 +8,7 @@ pub use highlighter::Highlighter;
pub use paragraph::Paragraph;
use crate::alignment;
use crate::{Color, Pixels, Point, Rectangle, Size};
use crate::{Border, Color, Pixels, Point, Rectangle, Size};
use std::borrow::Cow;
use std::hash::{Hash, Hasher};
@ -235,6 +235,8 @@ pub struct Span<'a, Link = (), Font = crate::Font> {
pub font: Option<Font>,
/// The [`Color`] of the [`Span`].
pub color: Option<Color>,
/// The [`Background`] of the [`Span`].
pub background: Option<Background>,
/// The link of the [`Span`].
pub link: Option<Link>,
}
@ -248,6 +250,7 @@ impl<'a, Link, Font> Span<'a, Link, Font> {
line_height: None,
font: None,
color: None,
background: None,
link: None,
}
}
@ -288,6 +291,21 @@ impl<'a, Link, Font> Span<'a, Link, Font> {
self
}
/// Sets the [`Background`] of the [`Span`].
pub fn background(mut self, background: impl Into<Background>) -> Self {
self.background = Some(background.into());
self
}
/// Sets the [`Background`] of the [`Span`], if any.
pub fn background_maybe(
mut self,
background: Option<impl Into<Background>>,
) -> Self {
self.background = background.map(Into::into);
self
}
/// Sets the link of the [`Span`].
pub fn link(mut self, link: impl Into<Link>) -> Self {
self.link = Some(link.into());
@ -308,6 +326,7 @@ impl<'a, Link, Font> Span<'a, Link, Font> {
line_height: self.line_height,
font: self.font,
color: self.color,
background: self.background,
link: self.link,
}
}
@ -406,3 +425,21 @@ into_fragment!(isize);
into_fragment!(f32);
into_fragment!(f64);
/// The background style of text
#[derive(Debug, Clone, Copy)]
pub struct Background {
/// The background [`Color`]
pub color: Color,
/// The background [`Border`]
pub border: Border,
}
impl From<Color> for Background {
fn from(color: Color) -> Self {
Background {
color,
border: Border::default(),
}
}
}

View file

@ -1,7 +1,7 @@
//! Draw paragraphs.
use crate::alignment;
use crate::text::{Difference, Hit, Span, Text};
use crate::{Point, Size};
use crate::{Point, Rectangle, Size};
/// A text paragraph.
pub trait Paragraph: Sized + Default {
@ -42,6 +42,10 @@ pub trait Paragraph: Sized + Default {
/// that was hit.
fn hit_span(&self, point: Point) -> Option<usize>;
/// Returns all bounds for the provided [`Span`] index of the [`Paragraph`].
/// A [`Span`] can have multiple bounds for each line it's on.
fn span_bounds(&self, index: usize) -> Vec<Rectangle>;
/// Returns the distance to the given grapheme index in the [`Paragraph`].
fn grapheme_position(&self, line: usize, index: usize) -> Option<Point>;