use eframe::egui;
const BREP_ICONS: &[u8] = include_bytes!("../assets/fonts/BrepIcons.ttf");
pub fn install(ctx: &egui::Context) {
let mut fonts = match os_monospace() {
Some((bytes, index)) => os_mono_defs(bytes, index),
None => egui::FontDefinitions::default(),
};
fonts.font_data.insert(
"brep_icons".to_owned(),
egui::FontData::from_static(BREP_ICONS).into(),
);
for family in [egui::FontFamily::Proportional, egui::FontFamily::Monospace] {
fonts
.families
.entry(family)
.or_default()
.insert(0, "brep_icons".to_owned());
}
ctx.set_fonts(fonts);
}
fn os_mono_defs(bytes: Vec<u8>, index: u32) -> egui::FontDefinitions {
let mut fonts = egui::FontDefinitions::empty();
let mut data = egui::FontData::from_owned(bytes);
data.index = index; fonts.font_data.insert("os_mono".to_owned(), data.into());
for family in [egui::FontFamily::Proportional, egui::FontFamily::Monospace] {
fonts.families.insert(family, vec!["os_mono".to_owned()]);
}
fonts
}
#[cfg(not(target_arch = "wasm32"))]
fn os_monospace() -> Option<(Vec<u8>, u32)> {
let out = std::process::Command::new("fc-match")
.args(["--format=%{file}\n%{index}", "monospace"])
.output()
.ok()?;
if !out.status.success() {
return None;
}
let text = String::from_utf8_lossy(&out.stdout);
let mut lines = text.lines();
let path = lines.next()?.trim();
if path.is_empty() {
return None;
}
let index = lines.next().and_then(|l| l.trim().parse().ok()).unwrap_or(0);
let bytes = std::fs::read(path).ok()?; Some((bytes, index))
}
#[cfg(target_arch = "wasm32")]
fn os_monospace() -> Option<(Vec<u8>, u32)> {
None
}