gled-ui 2.31.2

gled's egui interface, shared by the desktop app and the browser
Documentation
use crate::assets::AssetEdits;
use crate::midi_learn::{LearnState, MidiLearnTarget};
use gled_model::{
    asset::{
        Asset,
        midi_controller::{MidiController, MidiOutputBindingKind},
    },
    collection::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;
                        }
                        // Moving a strip's fader picks that strip: Mackie
                        // faders send pitch bend on the strip's channel.
                        MidiOutputBindingKind::Meter(meter) => {
                            meter.strip = capture.trigger.status & 0x07;
                        }
                    }
                    changed = true;
                }
            }
        }
    }

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