Skip to main content

ferroui_base/media/
text_trailing_trimming.rs

1use std::fmt;
2use std::rc::Rc;
3
4use crate::media::text_formatting::{TextCollapsingProperties, TextTrailingCharacterEllipsis, TextTrailingWordEllipsis};
5use crate::media::{TextCollapsingCreateInfo, TextTrimming};
6
7/// Trims text at the end, at character or word granularity.
8pub struct TextTrailingTrimming {
9    ellipsis: String,
10    is_word_based: bool,
11}
12
13impl TextTrailingTrimming {
14    pub fn new(ellipsis: &str, is_word_based: bool) -> Self {
15        Self { ellipsis: ellipsis.to_owned(), is_word_based }
16    }
17}
18
19impl TextTrimming for TextTrailingTrimming {
20    fn create_collapsing_properties(&self, create_info: &TextCollapsingCreateInfo) -> Rc<dyn TextCollapsingProperties> {
21        if self.is_word_based {
22            return Rc::new(TextTrailingWordEllipsis::new(
23                &self.ellipsis,
24                create_info.width,
25                create_info.text_run_properties.clone(),
26                create_info.flow_direction,
27            ));
28        }
29
30        Rc::new(TextTrailingCharacterEllipsis::new(
31            &self.ellipsis,
32            create_info.width,
33            create_info.text_run_properties.clone(),
34            create_info.flow_direction,
35        ))
36    }
37}
38
39impl fmt::Display for TextTrailingTrimming {
40    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41        f.write_str(if self.is_word_based { "WordEllipsis" } else { "CharacterEllipsis" })
42    }
43}