fa_iced/
lib.rs

1//!
2//! Rust-Iced-FA
3//!
4//! Wrapper for Font Awesome icons.
5//!
6
7use iced::advanced::graphics::text::font_system;
8use iced::font::{Family, Weight};
9use iced::widget::text;
10use iced::{Element, Font};
11use std::borrow::Cow;
12use std::fmt;
13
14//
15// TODO: FUTURE API
16//
17// pub enum FaStyle {
18//     Regular,
19//     Solid,
20//     Brands,
21// }
22// pub const FONT_FA_REGULAR: Font = Font {
23//     family: Family::Name("Font Awesome 6 Free"),
24//     ..Font::DEFAULT
25// };
26//
27// pub const FONT_FA_SOLID: Font = Font {
28//     family: Family::Name("Font Awesome 6 Free Solid"),
29//     ..Font::DEFAULT
30// };
31//
32// pub const FONT_FA_BRANDS: Font = Font {
33//     family: Family::Name("Font Awesome 6 Brands"),
34//     ..Font::DEFAULT
35// };
36//
37// pub fn fa_font(style: FaStyle) -> Font {
38//     match style {
39//         FaStyle::Regular => FONT_FA_REGULAR,
40//         FaStyle::Solid => FONT_FA_SOLID,
41//         FaStyle::Brands => FONT_FA_BRANDS,
42//     }
43// }
44//
45// pub fn iced_fa_icon<'a, Message>(code: &str, style: FaStyle) -> Element<'a, Message> {
46//     let code_u32 = u32::from_str_radix(code, 16).unwrap();
47//     let unicode_char = char::from_u32(code_u32).unwrap();
48//
49//     text(unicode_char)
50//         .font(fa_font(style))
51//         .size(32)
52//         .into()
53// }
54
55///
56/// Load Font Awesome TTF files. Should only be called once.
57///
58pub fn load_font_fontawesome_ttf() {
59    let mut font_system = font_system().write().unwrap();
60    font_system.load_font(Cow::from(FONT_DATA_FA_REGULAR_TTF));
61    font_system.load_font(Cow::from(FONT_DATA_FA_BRANDS_TTF));
62    font_system.load_font(Cow::from(FONT_DATA_FA_SOLID_TTF));
63}
64
65///
66/// Load Font Awesome OTF files. Should only be called once.
67///
68pub fn load_font_fontawesome_otf() {
69    let mut font_system = font_system().write().unwrap();
70    font_system.load_font(Cow::from(FONT_DATA_FA_REGULAR_TTF));
71    font_system.load_font(Cow::from(FONT_DATA_FA_BRANDS_TTF));
72    font_system.load_font(Cow::from(FONT_DATA_FA_SOLID_TTF));
73}
74
75///
76/// Create an iced `text` element containing the specified Font Awesome icon.
77///
78/// Uses `FONT_FA_REGULAR`.
79///
80pub fn iced_text_icon_regular<'a, Message>(code: &str, size: u16) -> Element<'a, Message> {
81    text(fa_unicode_char(&code))
82        .font(FONT_FA_REGULAR)
83        .size(size)
84        .into()
85}
86
87///
88/// Create an iced `text` element containing the specified Font Awesome icon.
89///
90/// Uses `FONT_FA_SOLID`.
91///
92pub fn iced_text_icon_solid<'a, Message>(code: &str, size: u16) -> Element<'a, Message> {
93    text(fa_unicode_char(&code))
94        .font(FONT_FA_SOLID)
95        .size(size)
96        .into()
97}
98
99///
100/// Convert the Font Awesome `code` into the corresponding Unicode char.
101///
102pub fn fa_unicode_char(code: &str) -> char {
103    let code_u32 = u32::from_str_radix(&code, 16).unwrap();
104    let unicode_char = char::from_u32(code_u32).unwrap();
105    unicode_char
106}
107
108///
109/// The "Regular" version of Font Awesome version 6 Free.
110///
111pub const FONT_FA_REGULAR: Font = Font {
112    family: Family::Name("Font Awesome 6 Free"),
113    ..Font::DEFAULT
114};
115
116///
117/// The "Solid" version of Font Awesome version 6 Free.
118///
119pub const FONT_FA_SOLID: Font = Font {
120    family: Family::Name("Font Awesome 6 Free"),
121    weight: Weight::Black, // Solid weights are bold
122    ..Font::DEFAULT
123};
124
125//
126// Font data
127//
128
129///
130/// Font data for Font Awesome Regular OTF. Loaded using `include_bytes!()`.
131///
132pub const FONT_DATA_FA_REGULAR_OTF: &[u8] =
133    include_bytes!("../fonts/font-awesome-6-free-regular-400.otf");
134
135///
136/// Font data for Font Awesome Brands OTF. Loaded using `include_bytes!()`.
137///
138pub const FONT_DATA_FA_BRANDS_OTF: &[u8] =
139    include_bytes!("../fonts/font-awesome-6-brands-regular-400.otf");
140
141///
142/// Font data for Font Awesome Solid OTF. Loaded using `include_bytes!()`.
143///
144pub const FONT_DATA_FA_SOLID_OTF: &[u8] =
145    include_bytes!("../fonts/font-awesome-6-free-solid-900.otf");
146
147///
148/// Font data for Font Awesome Regular TTF. Loaded using `include_bytes!()`.
149///
150pub const FONT_DATA_FA_REGULAR_TTF: &[u8] = include_bytes!("../fonts/fa-regular-400.ttf");
151
152///
153/// Font data for Font Awesome Brands TTF. Loaded using `include_bytes!()`.
154///
155pub const FONT_DATA_FA_BRANDS_TTF: &[u8] = include_bytes!("../fonts/fa-brands-400.ttf");
156
157///
158/// Font data for Font Awesome Solid TTF. Loaded using `include_bytes!()`.
159///
160pub const FONT_DATA_FA_SOLID_TTF: &[u8] = include_bytes!("../fonts/fa-solid-900.ttf");
161
162//
163// File operations
164//
165
166/// Font Awesome Unicode string for `https://fontawesome.com/icons/user`.
167pub const FA_ICON_USER: &str = "f007";
168
169/// Font Awesome Unicode string for `https://fontawesome.com/icons/file`.
170pub const FA_ICON_NEW: &str = "f15b";
171
172/// Font Awesome Unicode string for `https://fontawesome.com/icons/folder-open`.
173pub const FA_ICON_OPEN: &str = "f07c";
174
175/// Font Awesome Unicode string for `https://fontawesome.com/icons/floppy-disk`.
176pub const FA_ICON_SAVE: &str = "f0c7";
177
178//
179// Numbers
180//
181
182/// Font Awesome Unicode string for `https://fontawesome.com/icons/0`.
183pub const FA_ICON_0: &str = "30";
184
185/// Font Awesome Unicode string for `https://fontawesome.com/icons/1`.
186pub const FA_ICON_1: &str = "31";
187
188/// Font Awesome Unicode string for `https://fontawesome.com/icons/2`.
189pub const FA_ICON_2: &str = "32";
190
191/// Font Awesome Unicode string for `https://fontawesome.com/icons/3`.
192pub const FA_ICON_3: &str = "33";
193
194/// Font Awesome Unicode string for `https://fontawesome.com/icons/4`.
195pub const FA_ICON_4: &str = "34";
196
197/// Font Awesome Unicode string for `https://fontawesome.com/icons/5`.
198pub const FA_ICON_5: &str = "35";
199
200/// Font Awesome Unicode string for `https://fontawesome.com/icons/6`.
201pub const FA_ICON_6: &str = "36";
202
203/// Font Awesome Unicode string for `https://fontawesome.com/icons/7`.
204pub const FA_ICON_7: &str = "37";
205
206/// Font Awesome Unicode string for `https://fontawesome.com/icons/8`.
207pub const FA_ICON_8: &str = "38";
208
209/// Font Awesome Unicode string for `https://fontawesome.com/icons/9`.
210pub const FA_ICON_9: &str = "39";
211
212//
213// Circle
214//
215
216/// Font Awesome Unicode string for https://fontawesome.com/icons/circle-check
217pub const FA_ICON_CIRCLE_CHECK: &str = "f058";
218
219/// Font Awesome Unicode string for https://fontawesome.com/icons/circle-xmark
220pub const FA_ICON_CIRCLE_XMARK: &str = "f057";
221
222//
223// Settings/Options/Utility
224//
225
226/// Font Awesome Unicode string for https://fontawesome.com/icons/bars
227pub const FA_ICON_BARS: &str = "f0c9";
228
229/// Font Awesome Unicode string for https://fontawesome.com/icons/gear
230///
231/// Only available in SOLID variant.
232pub const FA_ICON_GEAR: &str = "f013";
233
234/// Font Awesome Unicode string for https://fontawesome.com/icons/screwdriver-wrench
235///
236/// Only available in SOLID variant.
237pub const FA_ICON_SCREWDRIVER_WRENCH: &str = "f7d9";
238
239//
240// ID cards and badges
241//
242
243/// Font Awesome Unicode string for https://fontawesome.com/icons/id-card
244pub const FA_ICON_ID_CARD: &str = "f2c2";
245
246/// Font Awesome Unicode string for https://fontawesome.com/icons/id-card-clip
247pub const FA_ICON_ID_CARD_CLIP: &str = "f47f";
248
249/// Font Awesome Unicode string for https://fontawesome.com/icons/id-badge
250pub const FA_ICON_ID_BADGE: &str = "f2c1";
251
252//
253// Enum
254//
255
256///
257/// Implementation of Font Awesome icons as enum.
258///
259#[derive(Debug, Clone, Copy, PartialEq, Eq)]
260pub enum FaIcon {
261    User,
262    CircleCheck,
263    CircleXmark,
264    ScrewdriverWrench,
265    Gear,
266    Bars,
267    New,
268    Open,
269    Save,
270    Number0,
271    Number1,
272    Number2,
273    Number3,
274    Number4,
275    Number5,
276    Number6,
277    Number7,
278    Number8,
279    Number9,
280    IdCard,
281    IdCardClip,
282    IdBadge,
283}
284
285impl fmt::Display for FaIcon {
286    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
287        f.write_str(self.as_str())
288    }
289}
290
291impl FaIcon {
292    pub fn as_str(&self) -> &str {
293        match self {
294            FaIcon::User => "f007",
295            FaIcon::CircleCheck => "f058",
296            FaIcon::CircleXmark => "f057",
297            FaIcon::ScrewdriverWrench => "f7d9",
298            FaIcon::Gear => "f013",
299            FaIcon::Bars => "f0c9",
300            FaIcon::New => "f15b",
301            FaIcon::Open => "f07c",
302            FaIcon::Save => "f0c7",
303            FaIcon::Number0 => "30",
304            FaIcon::Number1 => "31",
305            FaIcon::Number2 => "32",
306            FaIcon::Number3 => "33",
307            FaIcon::Number4 => "34",
308            FaIcon::Number5 => "35",
309            FaIcon::Number6 => "36",
310            FaIcon::Number7 => "37",
311            FaIcon::Number8 => "38",
312            FaIcon::Number9 => "39",
313            FaIcon::IdCard => "f2c2",
314            FaIcon::IdCardClip => "f47f",
315            FaIcon::IdBadge => "f2c1",
316        }
317    }
318}