diff options
author | 2024-04-02 09:42:50 +0200 | |
---|---|---|
committer | 2024-04-02 09:42:50 +0200 | |
commit | 6c75836f123eba909154ce517299c3ffcd21b25b (patch) | |
tree | 46d3f1b92efcc3b815662c23aed292dae722366d /core | |
parent | c30b4b0a1c9b191bcb65ae1732581b5c96b8bcfe (diff) | |
parent | 488cac714896002791f3c7b9a99181310c1d1b5c (diff) | |
download | iced-6c75836f123eba909154ce517299c3ffcd21b25b.tar.gz iced-6c75836f123eba909154ce517299c3ffcd21b25b.tar.bz2 iced-6c75836f123eba909154ce517299c3ffcd21b25b.zip |
Merge pull request #2363 from iced-rs/specialize-text-helper
Specialize `widget::text` helper
Diffstat (limited to 'core')
-rw-r--r-- | core/src/widget/text.rs | 74 |
1 files changed, 70 insertions, 4 deletions
diff --git a/core/src/widget/text.rs b/core/src/widget/text.rs index 12f6956a..53591e41 100644 --- a/core/src/widget/text.rs +++ b/core/src/widget/text.rs @@ -21,7 +21,7 @@ where Theme: Catalog, Renderer: text::Renderer, { - content: Cow<'a, str>, + fragment: Fragment<'a>, size: Option<Pixels>, line_height: LineHeight, width: Length, @@ -39,9 +39,9 @@ where Renderer: text::Renderer, { /// Create a new fragment of [`Text`] with the given contents. - pub fn new(content: impl Into<Cow<'a, str>>) -> Self { + pub fn new(fragment: impl IntoFragment<'a>) -> Self { Text { - content: content.into(), + fragment: fragment.into_fragment(), size: None, line_height: LineHeight::default(), font: None, @@ -184,7 +184,7 @@ where limits, self.width, self.height, - &self.content, + &self.fragment, self.line_height, self.size, self.font, @@ -366,3 +366,69 @@ impl Catalog for Theme { class(self) } } + +/// A fragment of [`Text`]. +/// +/// This is just an alias to a string that may be either +/// borrowed or owned. +pub type Fragment<'a> = Cow<'a, str>; + +/// A trait for converting a value to some text [`Fragment`]. +pub trait IntoFragment<'a> { + /// Converts the value to some text [`Fragment`]. + fn into_fragment(self) -> Fragment<'a>; +} + +impl<'a> IntoFragment<'a> for &'a str { + fn into_fragment(self) -> Fragment<'a> { + Fragment::Borrowed(self) + } +} + +impl<'a> IntoFragment<'a> for &'a String { + fn into_fragment(self) -> Fragment<'a> { + Fragment::Borrowed(self.as_str()) + } +} + +impl<'a> IntoFragment<'a> for String { + fn into_fragment(self) -> Fragment<'a> { + Fragment::Owned(self) + } +} + +macro_rules! into_fragment { + ($type:ty) => { + impl<'a> IntoFragment<'a> for $type { + fn into_fragment(self) -> Fragment<'a> { + Fragment::Owned(self.to_string()) + } + } + + impl<'a> IntoFragment<'a> for &$type { + fn into_fragment(self) -> Fragment<'a> { + Fragment::Owned(self.to_string()) + } + } + }; +} + +into_fragment!(char); +into_fragment!(bool); + +into_fragment!(u8); +into_fragment!(u16); +into_fragment!(u32); +into_fragment!(u64); +into_fragment!(u128); +into_fragment!(usize); + +into_fragment!(i8); +into_fragment!(i16); +into_fragment!(i32); +into_fragment!(i64); +into_fragment!(i128); +into_fragment!(isize); + +into_fragment!(f32); +into_fragment!(f64); |