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}