nrelm 0.1.0

An idiomatic GUI library inspired by Elm and based on gtk3-rs
use nrelm::gtk::prelude::*;
use nrelm::prelude::*;
pub struct App(Controller<Inner>);

#[nrelm::component(pub)]
impl SimpleComponent for App {
    type Init = ();
    type Input = ();
    type Output = ();

    view! {
        #[root]
        window = gtk::Window {
            set_title: "Conditional Root Example",
            set_default_size: (200, 150),

            gtk::Box {
                set_orientation: gtk::Orientation::Vertical,
                set_spacing: 5,
                set_margin_all: 5,
                set_align: gtk::Align::Center,

                #[local_ref]
                inner -> gtk::Stack {},

                gtk::Button {
                    set_label: "Toggle",
                    connect_clicked => (),
                }
            }

        }
    }

    fn init(
        _init: Self::Init,
        root: Self::Root,
        _sender: ComponentSender<Self>,
    ) -> ComponentParts<Self> {
        let model = Self(Inner::builder().launch(()).detach());
        let inner = model.0.widget();

        let widgets = view_output!();

        ComponentParts { model, widgets }
    }

    fn update(&mut self, _message: Self::Input, _sender: ComponentSender<Self>) {
        self.0
            .sender()
            .send(())
            .expect("Failed to send message to Inner component!");
    }
}

pub struct Inner {
    state: bool,
    counter: usize,
}

#[nrelm::component(pub)]
impl SimpleComponent for Inner {
    type Init = ();
    type Input = ();
    type Output = ();

    view! {
        if model.state {
            gtk::Label {
                #[watch]
                set_label: &format!("Toggled {} times", model.counter),
            }
        } else {
            gtk::Label {
                set_label: "False",
            }
        }
    }

    fn init(
        _init: Self::Init,
        root: Self::Root,
        _sender: ComponentSender<Self>,
    ) -> ComponentParts<Self> {
        let model = Self {
            state: true,
            counter: 0,
        };
        let widgets = view_output!();
        ComponentParts { model, widgets }
    }

    fn update(&mut self, _msg: Self::Input, _sender: ComponentSender<Self>) {
        self.state = !self.state;
        self.counter += 1;
    }
}

fn main() {
    let app = RelmApp::new("nrelm.example.conditional_root");
    app.run::<App>(());
}