gled 2.28.5

gled is an application for creating animations and effects on artnet or dmx installations
use crate::{
    midi::learn::{LearnState, MidiLearnTarget},
    storage::{
        asset::{
            Asset,
            midi_controller::{MidiController, MidiOutputBindingKind},
        },
        collections::Collections,
    },
};

pub(super) fn apply_learn_captures(
    controller: &mut Asset<MidiController>,
    dirty: &mut bool,
    collections: &mut Collections,
    learn_state: &mut LearnState,
) {
    let mut changed = false;
    while let Some(capture) = learn_state.pop_capture() {
        if capture.controller_id != controller.id {
            continue;
        }

        match capture.target {
            MidiLearnTarget::InputBinding(binding_index) => {
                if let Some(binding) = controller
                    .data
                    .mapping
                    .input_bindings
                    .get_mut(binding_index)
                {
                    binding.trigger = capture.trigger;
                    changed = true;
                }
            }
            MidiLearnTarget::OutputBinding(binding_index) => {
                if let Some(binding) = controller
                    .data
                    .mapping
                    .output_bindings
                    .get_mut(binding_index)
                {
                    match &mut binding.kind {
                        MidiOutputBindingKind::Value(value) => {
                            value.status = capture.trigger.status;
                            value.data1 = capture.trigger.data1;
                        }
                        MidiOutputBindingKind::SceneColorValue(scene_color_value) => {
                            scene_color_value.status = capture.trigger.status;
                            scene_color_value.data1 = capture.trigger.data1;
                        }
                    }
                    changed = true;
                }
            }
        }
    }

    if changed {
        *dirty = true;
        controller.clone().save(collections);
    }
}