1use crate::align::AlignX;
2use crate::color::Color;
3use crate::renderer::FontAsset;
4use crate::shaders::{ShaderAsset, ShaderBuilder, ShaderConfig};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
7#[repr(u8)]
8pub enum WrapMode {
9 #[default]
11 Words,
12 Newline,
14 None,
16}
17
18#[derive(Debug, Clone)]
20pub struct TextConfig {
21 pub(crate) user_data: usize,
23 pub color: Color,
25 pub font_asset: Option<&'static FontAsset>,
27 pub font_size: u16,
29 pub letter_spacing: u16,
31 pub line_height: u16,
33 pub wrap_mode: WrapMode,
35 pub alignment: AlignX,
37 pub(crate) effects: Vec<ShaderConfig>,
39 pub(crate) accessible: bool,
41}
42
43impl TextConfig {
44 pub(crate) fn new() -> Self {
46 Self::default()
47 }
48
49 #[inline]
51 pub fn color(&mut self, color: impl Into<Color>) -> &mut Self {
52 self.color = color.into();
53 self
54 }
55
56 #[inline]
58 pub fn font(&mut self, asset: &'static FontAsset) -> &mut Self {
59 self.font_asset = Some(asset);
60 self
61 }
62
63 #[inline]
65 pub fn font_size(&mut self, size: u16) -> &mut Self {
66 self.font_size = size;
67 self
68 }
69
70 #[inline]
72 pub fn letter_spacing(&mut self, spacing: u16) -> &mut Self {
73 self.letter_spacing = spacing;
74 self
75 }
76
77 #[inline]
79 pub fn line_height(&mut self, height: u16) -> &mut Self {
80 self.line_height = height;
81 self
82 }
83
84 #[inline]
86 pub fn wrap_mode(&mut self, mode: WrapMode) -> &mut Self {
87 self.wrap_mode = mode;
88 self
89 }
90
91 #[inline]
93 pub fn alignment(&mut self, alignment: AlignX) -> &mut Self {
94 self.alignment = alignment;
95 self
96 }
97
98 #[inline]
100 pub fn effect(&mut self, asset: &ShaderAsset, f: impl FnOnce(&mut ShaderBuilder<'_>)) -> &mut Self {
101 let mut builder = ShaderBuilder::new(asset);
102 f(&mut builder);
103 self.effects.push(builder.into_config());
104 self
105 }
106
107 #[inline]
113 pub fn accessible(&mut self) -> &mut Self {
114 self.accessible = true;
115 self
116 }
117}
118
119impl Default for TextConfig {
120 fn default() -> Self {
121 Self {
122 user_data: 0,
123 color: Color::rgba(0., 0., 0., 0.),
124 font_size: 0,
125 letter_spacing: 0,
126 line_height: 0,
127 wrap_mode: WrapMode::Words,
128 alignment: AlignX::Left,
129 effects: Vec::new(),
130 font_asset: None,
131 accessible: false,
132 }
133 }
134}