chiron 0.1.0

Graphical and command-line interface tools for Biomechanics Foundation
Documentation
use super::plot::PlotData;
use super::settings::StripedTable;
use crate::ui::windows::AddWindowEvent;
use super::EguiTab;
use bevy::prelude::*;
use bevy_c3d::prelude::*;
use egui_extras::{Column, TableBuilder};

pub fn draw_analog_data_view(ui: &mut egui::Ui, world: &mut World) {
    let c3d_loaded = world.resource_scope::<C3dState, bool>(|world, c3d_state| {
        let c3d_asset = world.get_resource::<Assets<C3dAsset>>();
        if let Some(c3d_asset) = c3d_asset {
            let c3d_asset = c3d_asset.get(&c3d_state.handle);
            if let Some(_) = c3d_asset {
                return true;
            }
        }
        false
    });
    if !c3d_loaded {
        return;
    }
    world.resource_scope::<C3dState, _>(|world, c3d_state| {
        world.resource_scope::<Assets<C3dAsset>, _>(|world, c3d_asset| {
            let c3d_asset = c3d_asset.get(&c3d_state.handle);
            if let Some(c3d_asset) = c3d_asset {
                draw_analog_data(ui, world, &c3d_asset.c3d);
            }
        });
    });
}

fn draw_analog_data(ui: &mut egui::Ui, world: &mut World, c3d: &C3d) {
    world.resource_scope::<StripedTable, _>(|world, striped_table| {
        TableBuilder::new(ui)
            .striped(striped_table.0)
            .resizable(true)
            .column(Column::initial(30.0).at_least(30.0).clip(true))
            .column(Column::remainder())
            .header(20.0, |mut header| {
                header.col(|ui| {
                    ui.label("#");
                });
                header.col(|ui| {
                    ui.label("Data Name");
                });
            })
            .body(|body| {
                body.rows(18.0, c3d.analog.analog.cols(), |mut row| {
                    let i = row.index();
                    row.col(|ui| {
                        ui.label(i.to_string());
                    });
                    row.col(|ui| {
                        let analog = if let Some(label) = c3d.analog.labels.get(i) {
                            label
                        } else {
                            "Unknown"
                        };
                        if ui.button(analog).clicked() {
                            let data = c3d
                                .analog
                                .iter_col(i)
                                .enumerate()
                                .map(|(i, v)| [i as f64, *v as f64])
                                .collect();
                            world.send_event(AddWindowEvent {
                                window: EguiTab::PlotView(PlotData {
                                    title: analog.to_string(),
                                    data,
                                }),
                            });
                        }
                    });
                });
            });
    });
}