1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
use crate::elements::Vec2D;
/// An enum to set the alignment of a Text element's content
#[derive(Debug, Clone, Copy)]
pub enum TextAlign {
/// Align to the beginning of the text
Begin,
/// Align to the center of the text
Centered,
/// Align to the end of the text
End,
}
impl TextAlign {
/// Align the given 1-dimentional coordinate as dictated by the `TextAlign` enum variation
#[must_use]
pub const fn apply_to(&self, pos: isize, text_length: isize) -> isize {
match self {
Self::Begin => pos,
Self::Centered => pos - text_length / 2,
Self::End => pos - text_length,
}
}
}
/// Two-dimensional text align, used by [`Sprite`](super::Sprite) and all variations
#[derive(Debug, Clone, Copy)]
pub struct TextAlign2D {
/// X coordinate TextAlign. TextAlign::Begin is left
x: TextAlign,
/// Y coordinate TextAlign. TextAlign::Begin is top
y: TextAlign,
}
impl Default for TextAlign2D {
fn default() -> Self {
Self::new(TextAlign::Begin, TextAlign::Begin)
}
}
impl TextAlign2D {
/// Align to centre of text
pub const CENTERED: Self = Self::new(TextAlign::Centered, TextAlign::Centered);
/// Create a new `TextAlign2D` with a given x and y align
#[must_use]
pub const fn new(x_align: TextAlign, y_align: TextAlign) -> Self {
Self {
x: x_align,
y: y_align,
}
}
/// Align the given position as dictated by the X and Y `TextAlign` enum variations
#[must_use]
pub const fn apply_to(&self, pos: Vec2D, text_block_size: Vec2D) -> Vec2D {
Vec2D::new(
self.x.apply_to(pos.x, text_block_size.x),
self.y.apply_to(pos.y, text_block_size.y),
)
}
}