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}