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/file`.
167pub const FA_ICON_NEW: &str = "f15b";
168
169/// Font Awesome Unicode string for `https://fontawesome.com/icons/folder-open`.
170pub const FA_ICON_OPEN: &str = "f07c";
171
172/// Font Awesome Unicode string for `https://fontawesome.com/icons/floppy-disk`.
173pub const FA_ICON_SAVE: &str = "f0c7";
174
175//
176// Numbers
177//
178
179/// Font Awesome Unicode string for `https://fontawesome.com/icons/0`.
180pub const FA_ICON_0: &str = "30";
181
182/// Font Awesome Unicode string for `https://fontawesome.com/icons/1`.
183pub const FA_ICON_1: &str = "31";
184
185/// Font Awesome Unicode string for `https://fontawesome.com/icons/2`.
186pub const FA_ICON_2: &str = "32";
187
188/// Font Awesome Unicode string for `https://fontawesome.com/icons/3`.
189pub const FA_ICON_3: &str = "33";
190
191/// Font Awesome Unicode string for `https://fontawesome.com/icons/4`.
192pub const FA_ICON_4: &str = "34";
193
194/// Font Awesome Unicode string for `https://fontawesome.com/icons/5`.
195pub const FA_ICON_5: &str = "35";
196
197/// Font Awesome Unicode string for `https://fontawesome.com/icons/6`.
198pub const FA_ICON_6: &str = "36";
199
200/// Font Awesome Unicode string for `https://fontawesome.com/icons/7`.
201pub const FA_ICON_7: &str = "37";
202
203/// Font Awesome Unicode string for `https://fontawesome.com/icons/8`.
204pub const FA_ICON_8: &str = "38";
205
206/// Font Awesome Unicode string for `https://fontawesome.com/icons/9`.
207pub const FA_ICON_9: &str = "39";
208
209//
210// Circle
211//
212
213/// Font Awesome Unicode string for `https://fontawesome.com/icons/circle-check`
214pub const FA_ICON_CIRCLE_CHECK: &str = "f058";
215
216/// Font Awesome Unicode string for `https://fontawesome.com/icons/circle-xmark`
217pub const FA_ICON_CIRCLE_XMARK: &str = "f057";
218
219//
220// Settings/Options/Utility
221//
222
223/// Font Awesome Unicode string for `https://fontawesome.com/icons/bars`
224pub const FA_ICON_BARS: &str = "f0c9";
225
226/// Font Awesome Unicode string for `https://fontawesome.com/icons/gear`
227///
228/// Only available in SOLID variant.
229pub const FA_ICON_GEAR: &str = "f013";
230
231/// Font Awesome Unicode string for `https://fontawesome.com/icons/screwdriver-wrench`
232///
233/// Only available in SOLID variant.
234pub const FA_ICON_SCREWDRIVER_WRENCH: &str = "f7d9";
235
236//
237// ID cards and badges
238//
239
240/// Font Awesome Unicode string for `https://fontawesome.com/icons/id-card`
241pub const FA_ICON_ID_CARD: &str = "f2c2";
242
243/// Font Awesome Unicode string for `https://fontawesome.com/icons/id-card-clip`
244pub const FA_ICON_ID_CARD_CLIP: &str = "f47f";
245
246/// Font Awesome Unicode string for `https://fontawesome.com/icons/id-badge`
247pub const FA_ICON_ID_BADGE: &str = "f2c1";
248
249//
250// Users
251//
252
253/// Font Awesome Unicode string for `https://fontawesome.com/icons/user`.
254pub const FA_ICON_USER: &str = "f007";
255
256/// Font Awesome Unicode string for `https://fontawesome.com/icons/users`.
257pub const FA_ICON_USERS: &str = "f0c0";
258
259/// Font Awesome Unicode string for `https://fontawesome.com/icons/users-between-lines`.
260pub const FA_ICON_USERS_BETWEEN_LINES: &str = "e591";
261
262/// Font Awesome Unicode string for `https://fontawesome.com/icons/users-line`.
263pub const FA_ICON_USERS_LINE: &str = "e592";
264
265/// Font Awesome Unicode string for `https://fontawesome.com/icons/users-rectangle`.
266pub const FA_ICON_USERS_RECTANGLE: &str = "e594";
267
268/// Font Awesome Unicode string for `https://fontawesome.com/icons/user_minus`
269pub const FA_ICON_USER_MINUS: &str = "f503";
270
271/// Font Awesome Unicode string for `https://fontawesome.com/icons/user_plus`
272pub const FA_ICON_USER_PLUS: &str = "f234";
273
274/// Font Awesome Unicode string for `https://fontawesome.com/icons/user_xmark`
275pub const FA_ICON_USER_XMARK: &str = "f235";
276
277//
278// Edit
279//
280
281/// Font Awesome Unicode string for `https://fontawesome.com/icons/pen-to-square`
282pub const FA_ICON_EDIT: &str = "f044";
283
284/// Font Awesome Unicode string for `https://fontawesome.com/icons/minus`
285pub const FA_ICON_MINUS: &str = "f068";
286
287//
288// List Icons
289//
290
291/// Font Awesome Unicode string for `https://fontawesome.com/icons/list`
292pub const FA_ICON_LIST: &str = "f03a";
293
294/// Font Awesome Unicode string for `https://fontawesome.com/icons/list-ul`
295pub const FA_ICON_LIST_UL: &str = "f0ca";
296
297/// Font Awesome Unicode string for `https://fontawesome.com/icons/list-ol`
298pub const FA_ICON_LIST_OL: &str = "f0cb";
299
300/// Font Awesome Unicode string for `https://fontawesome.com/icons/list-tree`
301pub const FA_ICON_LIST_TREE: &str = "e1d2";
302
303/// Font Awesome Unicode string for `https://fontawesome.com/icons/list-timeline`
304pub const FA_ICON_LIST_TIMELINE: &str = "e1d1";
305
306/// Font Awesome Unicode string for `https://fontawesome.com/icons/list-radio`
307pub const FA_ICON_LIST_RADIO: &str = "e1d0";
308
309/// Font Awesome Unicode string for `https://fontawesome.com/icons/table-list`
310pub const FA_ICON_TABLE_LIST: &str = "f00b";
311
312/// Font Awesome Unicode string for `https://fontawesome.com/icons/square-list`
313pub const FA_ICON_SQUARE_LIST: &str = "e489";
314
315/// Font Awesome Unicode string for `https://fontawesome.com/icons/rectangle-list`
316pub const FA_ICON_RECTANGLE_LIST: &str = "f022";
317
318//
319// FaIcon Enum
320//
321
322///
323/// Implementation of Font Awesome icons as enum.
324///
325#[derive(Debug, Clone, Copy, PartialEq, Eq)]
326pub enum FaIcon {
327    User,
328    CircleCheck,
329    CircleXmark,
330    ScrewdriverWrench,
331    Gear,
332    Bars,
333    New,
334    Open,
335    Save,
336    Number0,
337    Number1,
338    Number2,
339    Number3,
340    Number4,
341    Number5,
342    Number6,
343    Number7,
344    Number8,
345    Number9,
346    IdCard,
347    IdCardClip,
348    IdBadge,
349}
350
351impl fmt::Display for FaIcon {
352    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
353        f.write_str(self.as_str())
354    }
355}
356
357impl FaIcon {
358    pub fn as_str(&self) -> &str {
359        match self {
360            FaIcon::User => "f007",
361            FaIcon::CircleCheck => "f058",
362            FaIcon::CircleXmark => "f057",
363            FaIcon::ScrewdriverWrench => "f7d9",
364            FaIcon::Gear => "f013",
365            FaIcon::Bars => "f0c9",
366            FaIcon::New => "f15b",
367            FaIcon::Open => "f07c",
368            FaIcon::Save => "f0c7",
369            FaIcon::Number0 => "30",
370            FaIcon::Number1 => "31",
371            FaIcon::Number2 => "32",
372            FaIcon::Number3 => "33",
373            FaIcon::Number4 => "34",
374            FaIcon::Number5 => "35",
375            FaIcon::Number6 => "36",
376            FaIcon::Number7 => "37",
377            FaIcon::Number8 => "38",
378            FaIcon::Number9 => "39",
379            FaIcon::IdCard => "f2c2",
380            FaIcon::IdCardClip => "f47f",
381            FaIcon::IdBadge => "f2c1",
382        }
383    }
384}