use anyhow::Context; use gpui::{App, AssetSource, Result, SharedString}; use gpui_component::IconNamed; use rust_embed::RustEmbed; #[derive(RustEmbed)] #[folder = "assets"] #[include = "icons/**/*.svg"] #[exclude = "*.DS_Store"] pub struct Assets; impl AssetSource for Assets { fn load(&self, path: &str) -> Result>> { Self::get(path) .map(|f| Some(f.data)) .with_context(|| format!("loading asset at path {path:?}")) } fn list(&self, path: &str) -> Result> { Ok(Self::iter() .filter_map(|p| { if p.starts_with(path) { Some(p.into()) } else { None } }) .collect()) } } impl Assets { pub fn load_fonts(&self, cx: &App) -> anyhow::Result<()> { let font_paths = self.list("fonts")?; let mut embedded_fonts = Vec::new(); for font_path in font_paths { if font_path.ends_with(".ttf") { let font_bytes = cx .asset_source() .load(&font_path)? .expect("Assets should never return None"); embedded_fonts.push(font_bytes); } } cx.text_system().add_fonts(embedded_fonts) } } pub enum CustomIconName { Unlock, Filter, GlobalOn, GlobalOff, GitIssueOpen, GitIssueClosed, GitIssueOngoing, GitClone, GitBranch, Tag, } impl IconNamed for CustomIconName { fn path(self) -> gpui::SharedString { match self { CustomIconName::Unlock => "icons/unlock.svg", CustomIconName::Filter => "icons/filter.svg", CustomIconName::GlobalOn => "icons/global-on.svg", CustomIconName::GlobalOff => "icons/global-off.svg", CustomIconName::GitIssueOpen => "icons/git-issue-open.svg", CustomIconName::GitIssueClosed => "icons/git-issue-close.svg", CustomIconName::GitIssueOngoing => "icons/git-issue-ongoing.svg", CustomIconName::GitClone => "icons/git-clone.svg", CustomIconName::GitBranch => "icons/git-branch.svg", CustomIconName::Tag => "icons/tag.svg", } .into() } }