pierro 0.1.0

An immediate mode UI library for Rust
Documentation

use crate::{icons, Size, UINodeParams, UI};

use super::{h_spacing, horizontal_fit, icon, label, v_spacing, vertical_fit};

struct CollapsingHeaderMemory {
    open: bool
}

impl Default for CollapsingHeaderMemory {

    fn default() -> Self {
        Self {
            open: false 
        }
    }

}

pub fn collapsing_header<S: Into<String>, F: FnOnce(&mut UI)>(ui: &mut UI, label_text: S, contents: F) {
    let container = ui.node(UINodeParams::new(Size::fit(), Size::fit()));

    ui.with_parent(container.node_ref, |ui| {
        let open = ui.memory().get::<CollapsingHeaderMemory>(container.id).open;
        let (header_response, _) = horizontal_fit(ui, |ui| {
            let icon_text = if open {
                icons::CARET_DOWN
            } else {
                icons::CARET_RIGHT
            };
            icon(ui, icon_text);
            h_spacing(ui, 3.0);
            label(ui, label_text);
        });
        ui.set_sense_mouse(header_response.node_ref, true);

        if header_response.mouse_clicked() {
            let memory = ui.memory().get::<CollapsingHeaderMemory>(container.id);    
            memory.open = !memory.open;
        }

        if open {
            v_spacing(ui, 5.0);
            horizontal_fit(ui, |ui| {
                h_spacing(ui, 15.0);
                vertical_fit(ui, |ui| {
                    contents(ui);
                });
            });
        }

    });
}