Files

Icon assets in GPUI Component

The IconName is a enum that defined a bunch of icon names, because some internal components in GPUI Component will use them.

You can see, we have a lot of svg icon files in the assets/icons folder, but we are not embed all of the icon files in the library by default. This for keep the library size small.

So you must have your own icon files to use the Icon component in GPUI Component.

You can download the icon files from here or use your own icon files as you wish, just use the same filename as the icon name (match with the IconName defined) you want to use.

For example your assets folder:

app_root
  assets
    icons
      close.svg
      menu.svg
      ...
  src
    main.rs
  Cargo.toml

You also can just copy the svg files you want from the assets/icons folder in GPUI Component repo to your own assets folder.

How to use

You need define a Assets struct with rust-embed to register assets to GPUI application.

use anyhow::anyhow;
use gpui::*;
use rust_embed::RustEmbed;
use std::borrow::Cow;

#[derive(RustEmbed)]
#[folder = "./assets"]
#[include = "icons/**/*.svg"]
pub struct Assets;

impl AssetSource for Assets {
    fn load(&self, path: &str) -> Result<Option<Cow<'static, [u8]>>> {
        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<Vec<SharedString>> {
        Ok(Self::iter()
            .filter_map(|p| p.starts_with(path).then(|| p.into()))
            .collect())
    }
}

fn main() {
    // Call with_assets to register assets
    let app = gpui_platform::application().with_assets(Assets);

    // ...
}

Use default bundled assets.

The gpui-component-assets crate provide a default bundled assets implementation that include all the icon files in the assets/icons folder.

If you don't want to manage your own icon files, you can just use the default bundled assets.

Just add gpui-component-assets as a dependency in your Cargo.toml:

[dependencies]
gpui-component = "*"
gpui-component-assets = "*"

And then use it in your application:

let app = gpui_platform::application().with_assets(gpui_component_assets::Assets);