#[cfg(feature = "rhai")]
pub mod error;
#[cfg(feature = "rhai")]
pub mod eval;
#[cfg(feature = "rhai")]
pub use error::ViewConfigError;
#[cfg(feature = "rhai")]
pub use eval::{eval_script, eval_file, load_all};
use std::rc::Rc;
use slint::VecModel;
use crate::AppWindow;
use crate::ShellToolbarItem;
use crate::dsl::icons::fluent_icon;
#[derive(Debug, Default, Clone)]
pub struct ViewConfig {
pub status: Option<String>,
pub toolbar: Vec<crate::dsl::Toolbar>,
}
pub fn apply(ui: &AppWindow, cfg: &ViewConfig) {
if let Some(ref text) = cfg.status {
ui.set_status_text(text.as_str().into());
}
if !cfg.toolbar.is_empty() {
let items: Vec<ShellToolbarItem> = cfg.toolbar.iter().filter_map(|t| {
let icon_code = fluent_icon(&t.icon)?;
Some(ShellToolbarItem {
id: t.id.as_str().into(),
icon: icon_code.into(),
tooltip: t.tooltip.as_str().into(),
})
}).collect();
ui.set_toolbar_items(Rc::new(VecModel::from(items)).into());
ui.set_show_toolbar(true);
}
}
#[cfg(test)]
#[cfg(feature = "rhai")]
mod tests {
use super::*;
#[test]
fn parse_view_status() {
let cfg = eval_script(r#"view_status("Welcome");"#).unwrap();
assert_eq!(cfg.status, Some("Welcome".into()));
assert!(cfg.toolbar.is_empty());
}
#[test]
fn parse_view_toolbar() {
let cfg = eval_script(r#"view_toolbar(["add:add:New"]);"#).unwrap();
assert!(cfg.status.is_none());
assert_eq!(cfg.toolbar.len(), 1);
assert_eq!(cfg.toolbar[0].id, "add");
assert_eq!(cfg.toolbar[0].icon, "add");
assert_eq!(cfg.toolbar[0].tooltip, "New");
}
#[test]
fn empty_rhai_gives_default() {
let cfg = eval_script("").unwrap();
assert!(cfg.status.is_none());
assert!(cfg.toolbar.is_empty());
}
}