use anyhow::anyhow; use gpui::*; use gpui_component::{v_flex, IconName, Root}; use rust_embed::RustEmbed; use std::borrow::Cow; /// An asset source that loads assets from the `./assets` folder. #[derive(RustEmbed)] #[folder = "./assets"] #[include = "icons/**/*.svg"] pub struct Assets; impl AssetSource for Assets { fn load(&self, path: &str) -> Result>> { if path.is_empty() { return Ok(None); } Self::get(path) .map(|f| Some(f.data)) .ok_or_else(|| anyhow!("could not find asset at path \"{path}\"")) } fn list(&self, path: &str) -> Result> { Ok(Self::iter() .filter_map(|p| p.starts_with(path).then(|| p.into())) .collect()) } } pub struct Example; impl Render for Example { fn render(&mut self, _: &mut Window, _: &mut Context) -> impl IntoElement { v_flex() .gap_2() .size_full() .items_center() .justify_center() .text_center() .child(IconName::Inbox) .child(IconName::Bot) } } fn main() { // Register Assets to GPUI application. let app = Application::new().with_assets(Assets); app.run(move |cx| { // We must initialize gpui_component before using it. gpui_component::init(cx); cx.spawn(async move |cx| { cx.open_window(WindowOptions::default(), |window, cx| { let view = cx.new(|_| Example); // The first level on the window must be Root. cx.new(|cx| Root::new(view.into(), window, cx)) })?; Ok::<_, anyhow::Error>(()) }) .detach(); }); }