slint::include_modules!();
use slint::{ModelRc, VecModel, Model, Color};
use std::rc::Rc;
pub enum Widget {
Text(TextWidget),
Scaffold(ScaffoldWidget),
}
pub struct SlintedScaffold {
pub body: Widget,
}
impl SlintedScaffold {
pub fn build(&self, desktop: &DesktopWindow) {
match &self.body {
Widget::Text(text_widget) => {
let scaffold = ScaffoldWidget {
background: Color::from_rgb_u8(255, 255, 255),
text: text_widget.clone(),
};
self.push(desktop, scaffold);
}
Widget::Scaffold(scaffold_widget) => {
self.push(desktop, scaffold_widget.clone());
}
}
}
pub fn push(&self, desktop: &DesktopWindow, scaffold: ScaffoldWidget) {
let model = desktop.get_scaffolds();
let mut items: Vec<ScaffoldWidget> = model.iter().collect();
items.push(scaffold);
let vec_model = Rc::new(VecModel::from(items));
desktop.set_scaffolds(ModelRc::from(vec_model));
}
}
pub fn run_app(scaffold: SlintedScaffold) -> Result<(), slint::PlatformError> {
let desktop = DesktopWindow::new().unwrap();
scaffold.build(&desktop);
desktop.run()
}
#[cfg(test)]
mod tests {
use crate::{SlintedScaffold, TextWidget, Widget, run_app};
#[test]
fn launch_test_app() -> Result<(), slint::PlatformError> {
run_app(SlintedScaffold {
body: Widget::Text(TextWidget{
text: "Hello World".into(),
}),
})
}
}