glacier-cli 0.2.6

CLI do glacier-ui: cria um projeto pronto (templates .gv, .gss e scripts Luau) e instala as extensões de VS Code.
use glacier_ui::{
    GlacierDaemon, TrayActions, TrayConfig, TrayItem, notifications_enabled,
    set_notifications_enabled, window,
};

const ICONE: &[u8] = include_bytes!("../assets/icone.png");

fn main() -> glacier_ui::iced::Result {
    GlacierDaemon::new()
        .main_window(window::Settings {
            icon: window::icon::from_file_data(ICONE, None).ok(),
            ..Default::default()
        })
        .remember_window_geometry(true)
        .storage_dir(diretorio_de_dados())
        .tray(TrayConfig {
            icon: ICONE.to_vec(),
            tooltip: "{{titulo}}".to_string(),
            items: vec![
                TrayItem::button("abrir", "Abrir {{titulo}}"),
                TrayItem::button("notificacoes", "Desligar notificações"),
                TrayItem::separator(),
                TrayItem::button("sair", "Sair"),
            ],
        })
        .on_tray(ao_clicar_na_bandeja)
        .single_instance("{{nome_crate}}")
        .main(|motor| {
            if let Err(erro) = motor.register_component("painel", "views/painel.gv") {
                eprintln!("{erro}");
            }
            motor.set_initial_screen("painel");
        })
        .run()
}

fn ao_clicar_na_bandeja(id: &str, bandeja: &mut TrayActions) {
    match id {
        "abrir" => bandeja.open_main(),
        "sair" => bandeja.quit(),
        "notificacoes" => {
            let ligadas = !notifications_enabled();
            set_notifications_enabled(ligadas);
            bandeja.set_label(
                "notificacoes",
                if ligadas {
                    "Desligar notificações"
                } else {
                    "Ligar notificações"
                },
            );
        }
        _ => {}
    }
}

fn diretorio_de_dados() -> std::path::PathBuf {
    std::env::var_os("XDG_DATA_HOME")
        .or_else(|| std::env::var_os("APPDATA"))
        .map(std::path::PathBuf::from)
        .or_else(|| {
            std::env::var_os("HOME").map(|h| std::path::PathBuf::from(h).join(".local/share"))
        })
        .unwrap_or_else(|| std::path::PathBuf::from("."))
        .join("{{nome_projeto}}")
}