dear-implot 0.16.0-alpha.1

High-level Rust bindings to ImPlot with dear-imgui-rs integration
Documentation
use std::sync::{Mutex, OnceLock};

use dear_imgui_rs::Context;
use dear_implot::{Colormap, FloatFormat, HeatmapPlot, Plot, PlotContext};

fn test_guard() -> std::sync::MutexGuard<'static, ()> {
    static GUARD: OnceLock<Mutex<()>> = OnceLock::new();
    GUARD
        .get_or_init(|| Mutex::new(()))
        .lock()
        .unwrap_or_else(|error| error.into_inner())
}

fn prepare_imgui(imgui: &mut Context) {
    let io = imgui.io_mut();
    io.set_display_size([800.0, 600.0]);
    io.set_delta_time(1.0 / 60.0);
    let _ = imgui.font_atlas().build();
}

#[test]
fn public_numeric_format_apis_execute_with_validated_formats() {
    let _guard = test_guard();
    let mut imgui = Context::create();
    prepare_imgui(&mut imgui);
    let plot = PlotContext::create(&imgui);

    let ui = imgui.frame();
    ui.window("numeric format APIs").build(|| {
        let plot_ui = plot.get_plot_ui(ui);
        let format = FloatFormat::new("%.2f").unwrap();

        plot_ui.colormap_scale_with_format("scale", 0.0, 1.0, 120.0, &format, Colormap::Viridis);

        let mut position = 0.5;
        let mut color = [0.0; 4];
        let _ = plot_ui.colormap_slider_with_format(
            "slider",
            &mut position,
            Some(&mut color),
            &format,
            Colormap::Viridis,
        );

        let values = [0.0, 0.25, 0.75, 1.0];
        if let Some(plot_token) = plot_ui.begin_plot("heatmap") {
            HeatmapPlot::new("values", &values, 2, 2)
                .with_label_format(format.borrowed())
                .plot(&plot_ui);
            HeatmapPlot::new("no labels", &values, 2, 2)
                .without_value_labels()
                .plot(&plot_ui);
            plot_token.end();
        }
    });
}