nrelm 0.1.1

An idiomatic GUI library inspired by Elm and based on gtk3-rs
use gtk::prelude::*;
use nrelm::prelude::*;

struct Probe;

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

    view! {
        gtk::Window {
            set_default_size: (360, 260),
            gtk::MenuButton {
                set_margin_top: 120,
                set_margin_start: 20,
                #[name(popover)]
                #[wrap(Some)]
                set_popover = &gtk::Popover {
                    #[name(pop_list_box)]
                    gtk::ListBox {
                        set_selection_mode: gtk::SelectionMode::None,
                        #[name(home_row)]
                        gtk::ListBoxRow {
                            gtk::Label { set_label: "#home", set_margin: 6 },
                        },
                        #[name(work_row)]
                        gtk::ListBoxRow {
                            gtk::Label { set_label: "#work", set_margin: 6 },
                        },
                    }
                }
            }
        }
    }

    fn init(
        init: Self::Init,
        root: Self::Root,
        sender: ComponentSender<Self>,
    ) -> ComponentParts<Self> {
        let _ = (init, sender);
        let widgets = view_output!();
        eprintln!("PROBE: init ok");

        let home = widgets.home_row.clone();
        widgets
            .pop_list_box
            .connect_row_activated(move |_, activated| {
                if activated == &home {
                    eprintln!("PROBE: POPOVER home-row activated");
                } else {
                    eprintln!("PROBE: POPOVER other row activated");
                }
            });

        // force-show the popover for testing
        widgets.popover.popup();
        let l = widgets.pop_list_box.clone();
        let h = widgets.home_row.clone();
        let w = widgets.work_row.clone();
        let pv = widgets.popover.clone();
        gtk::glib::timeout_add_local_once(std::time::Duration::from_millis(1200), move || {
            eprintln!("PROBE: pop_list_box = {:?}", l.allocation());
            eprintln!("PROBE: home_row = {:?}", h.allocation());
            eprintln!("PROBE: work_row = {:?}", w.allocation());
            if let Some(win) = pv.window() {
                let (ox, oy, _) = win.origin();
                eprintln!("PROBE: popover window origin = ({},{})", ox, oy);
            } else {
                eprintln!("PROBE: popover window none");
            }
        });

        ComponentParts {
            model: Probe,
            widgets,
        }
    }
}

fn main() {
    let app = RelmApp::new("nrelm.probe.popprobe");
    app.run::<Probe>(());
}