use egui::epaint::text::FontInsert;
use egui::epaint::text::FontPriority;
use egui::epaint::text::InsertFontFamily;
use egui::FontData;
use egui::FontFamily;
use std::fs;
use std::path::Path;
use thiserror::Error;
pub struct LoaderFontData {
pub name: String,
pub path: String,
}
#[derive(Error, Debug)]
pub enum LoadFontError {
#[error("Font file not found at path: {0}")]
FileNotFound(String),
#[error("Failed to read font file at {path}: {source}")]
FileReadError {
path: String,
#[source]
source: std::io::Error,
},
}
#[macro_export]
macro_rules! load_font {
($ctx: expr, $($name:literal, $path:literal),*) => {
$(
$ctx.add_font(
FontInsert {
name: $name.into(),
data: FontData::from_static(include_bytes!($path)).into(),
families: vec![InsertFontFamily {
family: FontFamily::Name($name.into()),
priority: FontPriority::Lowest
}]
}
);
)*
};
}
pub fn load_fonts(
ctx: &egui::Context,
fonts: impl IntoIterator<Item = LoaderFontData>,
) -> Result<(), LoadFontError> {
for font in fonts {
let path = Path::new(&font.path);
if !path.exists() {
return Err(LoadFontError::FileNotFound(font.path));
}
let file_data = fs::read(path).map_err(|e| LoadFontError::FileReadError {
path: font.path,
source: e,
})?;
ctx.add_font(FontInsert {
families: vec![InsertFontFamily {
family: FontFamily::Name(font.name.as_str().into()),
priority: FontPriority::Lowest,
}],
name: font.name,
data: FontData::from_owned(file_data),
});
}
Ok(())
}