ofps-suite 0.1.0

GUI tool for OFPS
use egui::*;
use ofps::plugins::properties::{Property, PropertyMut};
use std::collections::BTreeMap;

pub fn transfer_props(
    obj: Vec<(&str, PropertyMut)>,
    props: &BTreeMap<String, Property>,
    out: &mut BTreeMap<String, Property>,
) {
    out.clear();

    for (n, mut p) in obj {
        if let Some(np) = props.get(n) {
            p.set(np);
        }
        out.insert(n.into(), p.into());
    }
}

pub fn property_ui(ui: &mut Ui, n: &str, p: &mut Property) {
    ui.label(format!("{n}:"));

    match p {
        Property::String(s) => {
            ui.add(TextEdit::singleline(s));
        }
        Property::Bool(b) => {
            let tf = if *b { "True" } else { "False" };
            ui.checkbox(b, tf);
        }
        Property::Float(v) => {
            ui.add(Slider::new(&mut v.val, v.min..=v.max));
        }
        Property::Usize(v) => {
            ui.add(Slider::new(&mut v.val, v.min..=v.max));
        }
    }
}

pub fn properties_ui(
    ui: &mut Ui,
    settings_properties: &mut BTreeMap<String, Property>,
    in_properties: Option<&BTreeMap<String, Property>>,
) {
    // Add any properties available
    if let Some(in_properties) = in_properties {
        // Clear any unused properties.
        settings_properties.retain(|s, _| in_properties.contains_key(s));

        for (n, p) in in_properties {
            settings_properties
                .entry(n.clone())
                .or_insert_with(|| p.clone());
        }
    }

    for (n, p) in settings_properties {
        property_ui(ui, n, p);
        ui.end_row();
    }
}

pub fn properties_grid_ui(
    ui: &mut Ui,
    id: &str,
    settings_properties: &mut BTreeMap<String, Property>,
    in_properties: Option<&BTreeMap<String, Property>>,
) {
    Grid::new(id).show(ui, |ui| {
        properties_ui(ui, settings_properties, in_properties)
    });
}