fluttered_slint 0.0.1

A way to create slint interfaces in a similar way to Google's Flutter.
Documentation
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(),
            }),
        })
    }
}