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// Enum
273//
274
275///
276/// Implementation of Font Awesome icons as enum.
277///
278#[derive(Debug, Clone, Copy, PartialEq, Eq)]
279pub enum FaIcon {
280 User,
281 CircleCheck,
282 CircleXmark,
283 ScrewdriverWrench,
284 Gear,
285 Bars,
286 New,
287 Open,
288 Save,
289 Number0,
290 Number1,
291 Number2,
292 Number3,
293 Number4,
294 Number5,
295 Number6,
296 Number7,
297 Number8,
298 Number9,
299 IdCard,
300 IdCardClip,
301 IdBadge,
302}
303
304impl fmt::Display for FaIcon {
305 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
306 f.write_str(self.as_str())
307 }
308}
309
310impl FaIcon {
311 pub fn as_str(&self) -> &str {
312 match self {
313 FaIcon::User => "f007",
314 FaIcon::CircleCheck => "f058",
315 FaIcon::CircleXmark => "f057",
316 FaIcon::ScrewdriverWrench => "f7d9",
317 FaIcon::Gear => "f013",
318 FaIcon::Bars => "f0c9",
319 FaIcon::New => "f15b",
320 FaIcon::Open => "f07c",
321 FaIcon::Save => "f0c7",
322 FaIcon::Number0 => "30",
323 FaIcon::Number1 => "31",
324 FaIcon::Number2 => "32",
325 FaIcon::Number3 => "33",
326 FaIcon::Number4 => "34",
327 FaIcon::Number5 => "35",
328 FaIcon::Number6 => "36",
329 FaIcon::Number7 => "37",
330 FaIcon::Number8 => "38",
331 FaIcon::Number9 => "39",
332 FaIcon::IdCard => "f2c2",
333 FaIcon::IdCardClip => "f47f",
334 FaIcon::IdBadge => "f2c1",
335 }
336 }
337}