pierro 0.1.0

An immediate mode UI library for Rust
Documentation

struct Gallery {
    docking_state: pierro::DockingState<GalleryTab>
}

struct Basic {
    text_edit_text: String,
    checkbox_state: bool,
    dropdown_state: String
}

impl Basic {

    fn new() -> Self {
        Self {
            text_edit_text: "A text edit box".to_owned(),
            checkbox_state: true,
            dropdown_state: "Option A".to_owned()
        }
    }

    fn ui(&mut self, ui: &mut pierro::UI) {
        pierro::scroll_area(ui, |ui| {
            pierro::margin(ui, |ui| { 
                pierro::label(ui, "A label");
                pierro::v_spacing(ui, 10.0);

                pierro::button(ui, "A button");
                pierro::v_spacing(ui, 10.0);

                pierro::text_edit(ui, &mut self.text_edit_text);
                pierro::v_spacing(ui, 10.0);

                pierro::checkbox_labeled(ui, "A checkbox", &mut self.checkbox_state);
                pierro::v_spacing(ui, 10.0);

                let context_menu_response = pierro::label(ui, "Context menu (right click me!)");
                pierro::context_menu(ui, &context_menu_response, |ui| {
                    pierro::label(ui, "Inside the context menu");
                });
                pierro::v_spacing(ui, 10.0);

                pierro::collapsing_header(ui, "A collapsing header", |ui| {
                    for i in 0..50 {
                        pierro::label(ui, i.to_string());
                    }
                });
                pierro::v_spacing(ui, 10.0);

                pierro::dropdown(ui, self.dropdown_state.clone(), |ui| {
                    for option in ["Option A", "Option B", "Option C"] {
                        if pierro::menu_button(ui, option).mouse_clicked() {
                            self.dropdown_state = option.to_owned();
                        }
                    }
                });

            });
        });
    }

}

struct Layout {
    axis: pierro::Axis,
    justify: pierro::Justify,
    align: pierro::Align
}

impl Layout {
    
    fn new() -> Self {
        Self {
            axis: pierro::Axis::X,
            justify: pierro::Justify::Center,
            align: pierro::Align::Center
        }
    }

    fn node(&self, ui: &mut pierro::UI, color: pierro::Color) {
        ui.node(
            pierro::UINodeParams::new(pierro::Size::px(100.0), pierro::Size::px(100.0))
                .with_fill(color)
        );
    }

    fn ui(&mut self, ui: &mut pierro::UI) {

        pierro::margin(ui, |ui| {
            pierro::dropdown_labeled(ui, "Axis: ", match self.axis {
                pierro::Axis::X => "X",
                pierro::Axis::Y => "Y",
            }, |ui| {
                if pierro::menu_button(ui, "X").mouse_clicked() {
                    self.axis = pierro::Axis::X;
                }
                if pierro::menu_button(ui, "Y").mouse_clicked() {
                    self.axis = pierro::Axis::Y;
                }
            });
            pierro::v_spacing(ui, 5.0);

            pierro::dropdown_labeled(ui, "Justify: ", match self.justify {
                pierro::Justify::Min => "Min",
                pierro::Justify::Center => "Center",
                pierro::Justify::Max => "Max",
            }, |ui| {
                if pierro::menu_button(ui, "Min").mouse_clicked() {
                    self.justify = pierro::Justify::Min;
                }
                if pierro::menu_button(ui, "Center").mouse_clicked() {
                    self.justify = pierro::Justify::Center;
                }
                if pierro::menu_button(ui, "Max").mouse_clicked() {
                    self.justify = pierro::Justify::Max;
                }
            });
            pierro::v_spacing(ui, 5.0);

            pierro::dropdown_labeled(ui, "Align: ", match self.align {
                pierro::Align::Min => "Min",
                pierro::Align::Center => "Center",
                pierro::Align::Max => "Max",
            }, |ui| {
                if pierro::menu_button(ui, "Min").mouse_clicked() {
                    self.align = pierro::Align::Min;
                }
                if pierro::menu_button(ui, "Center").mouse_clicked() {
                    self.align = pierro::Align::Center;
                }
                if pierro::menu_button(ui, "Max").mouse_clicked() {
                    self.align = pierro::Align::Max;
                }
            });
        });

        pierro::h_divider(ui);
        pierro::container(ui,
            pierro::Size::fr(1.0),
            pierro::Size::fr(1.0),
            pierro::Layout::new(self.axis).with_justify(self.justify).with_align(self.align),
            |ui| {
                self.node(ui, pierro::Color::RED);   
                self.node(ui, pierro::Color::GREEN);   
                self.node(ui, pierro::Color::BLUE);
            });
    }

}

enum GalleryTab {
    Basic(Basic),
    Layout(Layout)
}

impl pierro::DockingTab for GalleryTab {

    type Context = ();

    fn title(&self) -> String {
        match self {
            GalleryTab::Basic(..) => "Basic Widgets".to_owned(),
            GalleryTab::Layout(..) => "Layout".to_owned()
        }
    }

    fn render(&mut self, ui: &mut pierro::UI, _context: &mut ()) {
            match self {
                GalleryTab::Basic(basic) => basic.ui(ui),
                GalleryTab::Layout(layout) => layout.ui(ui)
            }
    }

    fn add_tab_dropdown<F: FnMut(Self)>(ui: &mut pierro::UI, mut add_tab: F, _context: &mut ()) {
        if pierro::menu_button(ui, "Basic Widgets").mouse_clicked() {
            add_tab(Self::Basic(Basic::new()));
        }
        if pierro::menu_button(ui, "Layout").mouse_clicked() {
            add_tab(Self::Layout(Layout::new()));
        }
    }

}

impl pierro::App for Gallery {

    fn window_config() -> pierro::WindowConfig {
        pierro::WindowConfig::default()
            .with_title("Pierro Widget Gallery")
    }

    fn tick(&mut self, ui: &mut pierro::UI) {
        pierro::menu_bar(ui, |ui| {
            pierro::menu_bar_item(ui, "Menubar", |ui| {
                pierro::menu_button(ui, "Button A");
                pierro::menu_button(ui, "Button B");
                pierro::menu_button(ui, "Button C");
                pierro::menu_category(ui, "Category", |ui| {
                    pierro::menu_button(ui, "Button X");
                    pierro::menu_button(ui, "Button Y");
                });
            });
        });
        self.docking_state.render(ui, &mut ());
    }

}

fn main() {
    pierro::run(Gallery {
        docking_state: pierro::DockingState::new(vec![
            GalleryTab::Basic(Basic::new())
        ])
    });
}