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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
use std::borrow::Borrow;
use crate::style::*;
#[derive(Clone, Debug, PartialEq)]
pub struct Text {
pub content: String,
colour: Option<Colour>,
size: Option<Size>,
strength: Option<Strength>,
}
#[derive(Clone, Debug, PartialEq)]
enum Colour {
Danger,
Primary,
}
#[derive(Clone, Debug, PartialEq)]
enum Strength {
Base,
Weak,
}
#[derive(Clone, Debug, PartialEq)]
enum Size {
Small,
Base,
}
impl Text {
pub fn default(content: &str) -> Self {
Self {
content: String::from(content),
colour: Some(Colour::Primary),
size: Some(Size::Base),
strength: Some(Strength::Base),
}
}
pub fn new(content: &str) -> Self {
Self {
content: String::from(content),
colour: None,
size: None,
strength: None,
}
}
pub fn as_element<'a, Message>(self) -> iced::Element<'a, Message> {
<Self as Into<iced::Element<'a, Message>>>::into(self)
}
pub fn small(&self) -> Self {
Self {
size: Some(Size::Small),
..self.clone()
}
}
pub fn danger(&self) -> Self {
Self {
colour: Some(Colour::Danger),
..self.clone()
}
}
pub fn weak(&self) -> Self {
Self {
strength: Some(Strength::Weak),
..self.clone()
}
}
}
impl<'a, Message> From<Text> for iced::Element<'a, Message> {
fn from(text: Text) -> Self {
text_as_element(text)
}
}
impl<'a, Message> From<&'a Text> for iced::Element<'a, Message> {
fn from(text: &'a Text) -> Self {
text_as_element(text)
}
}
fn text_as_element<'a, T, Message>(text: T) -> iced::Element<'a, Message>
where
T: Borrow<Text> + 'a,
{
iced::widget::text(text.borrow().content.clone())
.size(match text.borrow().size {
Some(Size::Small) => TEXT_SIZE_SM,
Some(Size::Base) | None => TEXT_SIZE_BASE,
})
.style(move |theme: &iced::Theme| iced::widget::text::Style {
color: match (
&text.borrow().borrow().colour,
&text.borrow().borrow().strength,
) {
(Some(Colour::Danger), Some(Strength::Base) | None) => {
Some(theme.extended_palette().danger.base.text)
}
(Some(Colour::Danger), Some(Strength::Weak)) => {
Some(theme.extended_palette().danger.weak.text)
}
(Some(Colour::Primary), Some(Strength::Base) | None) => {
Some(theme.extended_palette().primary.base.text)
}
(Some(Colour::Primary), Some(Strength::Weak)) => {
Some(theme.extended_palette().primary.weak.text)
}
(None, _) => None,
},
})
.into()
}
|