bevy_animation_graph_editor 0.10.0

Animation graph editor for the Bevy game engine
Documentation
use bevy_animation_graph::core::edge_data::bone_mask::{BoneMask, BoneMaskType};

use crate::ui::generic_widgets::{
    bone_id::{BoneIdReadonlyWidget, BoneIdWidget},
    hashmap::HashMapWidget,
    picker::PickerWidget,
};

pub struct BoneMaskWidget<'a> {
    pub bone_mask: &'a mut BoneMask,
    pub id_hash: egui::Id,
}

impl<'a> BoneMaskWidget<'a> {
    pub fn new_salted(bone_mask: &'a mut BoneMask, salt: impl std::hash::Hash) -> Self {
        Self {
            bone_mask,
            id_hash: egui::Id::new(salt),
        }
    }
}

impl<'a> egui::Widget for BoneMaskWidget<'a> {
    fn ui(self, ui: &mut egui::Ui) -> egui::Response {
        ui.push_id(self.id_hash, |ui| {
            let previous_base = self.bone_mask.base;
            let mut response = PickerWidget::new_salted("bone mask type")
                .ui(ui, format!("{:?}", self.bone_mask.base), |ui| {
                    for val in [BoneMaskType::Positive, BoneMaskType::Negative] {
                        ui.selectable_value(&mut self.bone_mask.base, val, format!("{:?}", val));
                    }
                })
                .response;
            if previous_base != self.bone_mask.base {
                response.mark_changed();
            }

            response |= HashMapWidget::new_salted(&mut self.bone_mask.weights, "bone mask weights")
                .ui(
                    ui,
                    |ui, key| ui.add(BoneIdWidget::new_salted(key, "bone mask bone id")),
                    |ui, key| ui.add(BoneIdReadonlyWidget::new_salted(key, "bone mask bone id")),
                    |ui, weight| ui.add(egui::DragValue::new(weight).speed(0.01)),
                );

            response
        })
        .inner
    }
}