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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use super::control::*;
use super::attributes::*;

use modifier::*;

///
/// Attributes for fonts
/// 
#[derive(Copy, Clone, PartialEq, Debug, Serialize, Deserialize)]
pub enum Font {
    /// Font size in pixels
    Size(f32),

    /// Horizontal alignment
    Align(TextAlign),

    /// Font weight
    Weight(FontWeight)
}

///
/// Represents the weight of a font
/// 
#[repr(u32)]
#[derive(Copy, Clone, PartialEq, Debug, Serialize, Deserialize)]
pub enum FontWeight {
    Light       = 100,
    Normal      = 400,
    Bold        = 700,
    ExtraBold   = 900
}

///
/// Represents the horizontal alignment for text
/// 
#[derive(Copy, Clone, PartialEq, Debug, Serialize, Deserialize)]
pub enum TextAlign {
    Left,
    Center,
    Right
}

// Modifiers for convenience

impl Modifier<Control> for Font {
    fn modify(self, control: &mut Control) {
        control.add_attribute(ControlAttribute::FontAttr(self))
    }
}

impl<'a> Modifier<Control> for &'a Font {
    fn modify(self, control: &mut Control) {
        control.add_attribute(ControlAttribute::FontAttr(*self))
    }
}

impl Modifier<Control> for TextAlign {
    fn modify(self, control: &mut Control) {
        control.add_attribute(ControlAttribute::FontAttr(Font::Align(self)))
    }
}

impl<'a> Modifier<Control> for &'a TextAlign {
    fn modify(self, control: &mut Control) {
        control.add_attribute(ControlAttribute::FontAttr(Font::Align(*self)))
    }
}

impl Modifier<Control> for FontWeight {
    fn modify(self, control: &mut Control) {
        control.add_attribute(ControlAttribute::FontAttr(Font::Weight(self)))
    }
}

impl<'a> Modifier<Control> for &'a FontWeight {
    fn modify(self, control: &mut Control) {
        control.add_attribute(ControlAttribute::FontAttr(Font::Weight(*self)))
    }
}