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// Edit
254//
255
256/// Font Awesome Unicode string for https://fontawesome.com/icons/pen-to-square
257pub const FA_ICON_EDIT: &str = "f044";
258
259/// Font Awesome Unicode string for https://fontawesome.com/icons/user_minus
260pub const FA_ICON_USER_MINUS: &str = "f503";
261
262/// Font Awesome Unicode string for https://fontawesome.com/icons/user_plus
263pub const FA_ICON_USER_PLUS: &str = "f234";
264
265/// Font Awesome Unicode string for https://fontawesome.com/icons/user_xmark
266pub const FA_ICON_USER_XMARK: &str = "f235";
267
268/// Font Awesome Unicode string for https://fontawesome.com/icons/minus
269pub const FA_ICON_MINUS: &str = "f068";
270
271//
272// List Icons
273//
274
275/// Font Awesome Unicode string for https://fontawesome.com/icons/list
276pub const FA_ICON_LIST: &str = "f03a";
277
278/// Font Awesome Unicode string for https://fontawesome.com/icons/list-ul
279pub const FA_ICON_LIST_UL: &str = "f0ca";
280
281/// Font Awesome Unicode string for https://fontawesome.com/icons/list-ol
282pub const FA_ICON_LIST_OL: &str = "f0cb";
283
284/// Font Awesome Unicode string for https://fontawesome.com/icons/list-tree
285pub const FA_ICON_LIST_TREE: &str = "e1d2";
286
287/// Font Awesome Unicode string for https://fontawesome.com/icons/list-timeline
288pub const FA_ICON_LIST_TIMELINE: &str = "e1d1";
289
290/// Font Awesome Unicode string for https://fontawesome.com/icons/list-radio
291pub const FA_ICON_LIST_RADIO: &str = "e1d0";
292
293/// Font Awesome Unicode string for https://fontawesome.com/icons/table-list
294pub const FA_ICON_TABLE_LIST: &str = "f00b";
295
296/// Font Awesome Unicode string for https://fontawesome.com/icons/square-list
297pub const FA_ICON_SQUARE_LIST: &str = "e489";
298
299/// Font Awesome Unicode string for https://fontawesome.com/icons/rectangle-list
300pub const FA_ICON_RECTANGLE_LIST: &str = "f022";
301
302//
303// FaIcon Enum
304//
305
306///
307/// Implementation of Font Awesome icons as enum.
308///
309#[derive(Debug, Clone, Copy, PartialEq, Eq)]
310pub enum FaIcon {
311    User,
312    CircleCheck,
313    CircleXmark,
314    ScrewdriverWrench,
315    Gear,
316    Bars,
317    New,
318    Open,
319    Save,
320    Number0,
321    Number1,
322    Number2,
323    Number3,
324    Number4,
325    Number5,
326    Number6,
327    Number7,
328    Number8,
329    Number9,
330    IdCard,
331    IdCardClip,
332    IdBadge,
333}
334
335impl fmt::Display for FaIcon {
336    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
337        f.write_str(self.as_str())
338    }
339}
340
341impl FaIcon {
342    pub fn as_str(&self) -> &str {
343        match self {
344            FaIcon::User => "f007",
345            FaIcon::CircleCheck => "f058",
346            FaIcon::CircleXmark => "f057",
347            FaIcon::ScrewdriverWrench => "f7d9",
348            FaIcon::Gear => "f013",
349            FaIcon::Bars => "f0c9",
350            FaIcon::New => "f15b",
351            FaIcon::Open => "f07c",
352            FaIcon::Save => "f0c7",
353            FaIcon::Number0 => "30",
354            FaIcon::Number1 => "31",
355            FaIcon::Number2 => "32",
356            FaIcon::Number3 => "33",
357            FaIcon::Number4 => "34",
358            FaIcon::Number5 => "35",
359            FaIcon::Number6 => "36",
360            FaIcon::Number7 => "37",
361            FaIcon::Number8 => "38",
362            FaIcon::Number9 => "39",
363            FaIcon::IdCard => "f2c2",
364            FaIcon::IdCardClip => "f47f",
365            FaIcon::IdBadge => "f2c1",
366        }
367    }
368}