Skip to main content

cranpose_ui/text/
decoration.rs

1use crate::modifier::Color;
2
3#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
4pub struct TextDecoration(u32);
5
6impl TextDecoration {
7    pub const NONE: Self = Self(0);
8    pub const UNDERLINE: Self = Self(1);
9    pub const LINE_THROUGH: Self = Self(2);
10
11    pub fn contains(&self, other: Self) -> bool {
12        (self.0 | other.0) == self.0
13    }
14
15    pub fn combine(self, other: Self) -> Self {
16        Self(self.0 | other.0)
17    }
18}
19
20impl Default for TextDecoration {
21    fn default() -> Self {
22        Self::NONE
23    }
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29
30    #[test]
31    fn contains_requires_all_bits_from_other_decoration() {
32        let combined = TextDecoration::UNDERLINE.combine(TextDecoration::LINE_THROUGH);
33
34        assert!(combined.contains(TextDecoration::UNDERLINE));
35        assert!(combined.contains(TextDecoration::LINE_THROUGH));
36        assert!(combined.contains(combined));
37        assert!(!TextDecoration::UNDERLINE.contains(combined));
38        assert!(!TextDecoration::LINE_THROUGH.contains(combined));
39    }
40
41    #[test]
42    fn none_contains_only_none() {
43        assert!(TextDecoration::NONE.contains(TextDecoration::NONE));
44        assert!(TextDecoration::UNDERLINE.contains(TextDecoration::NONE));
45        assert!(!TextDecoration::NONE.contains(TextDecoration::UNDERLINE));
46        assert!(!TextDecoration::NONE.contains(TextDecoration::LINE_THROUGH));
47    }
48}
49
50#[derive(Clone, Copy, Debug, PartialEq)]
51pub struct Shadow {
52    pub color: Color,
53    pub offset: crate::modifier::Point, // Using Point as Offset counterpart
54    pub blur_radius: f32,
55}
56
57impl Default for Shadow {
58    fn default() -> Self {
59        Self {
60            color: Color(0.0, 0.0, 0.0, 1.0), // Black default
61            offset: crate::modifier::Point::new(0.0, 0.0),
62            blur_radius: 0.0,
63        }
64    }
65}