gled-ui 2.34.0

gled's egui interface, shared by the desktop app and the browser
Documentation
use gled_model::asset::midi_controller::{
    MidiEffectTarget, MidiSceneTarget, MidiValueSource, MidiValueSourceKind,
};

pub(super) fn value_source_from_kind(
    kind: MidiValueSourceKind,
    current: MidiValueSource,
) -> MidiValueSource {
    match kind {
        MidiValueSourceKind::SelectedSceneOpacity => MidiValueSource::SelectedSceneOpacity,
        MidiValueSourceKind::SelectedSceneDistributed => MidiValueSource::SelectedSceneDistributed,
        MidiValueSourceKind::SelectedEffectDistributed => {
            MidiValueSource::SelectedEffectDistributed
        }
        MidiValueSourceKind::SelectedSceneOpacityLive => MidiValueSource::SelectedSceneOpacityLive,
        MidiValueSourceKind::SelectedSceneEffectLive => MidiValueSource::SelectedSceneEffectLive {
            effect: current_effect_from_value_source(&current),
            parameter: match current {
                MidiValueSource::SelectedSceneEffectLive { parameter, .. } => parameter,
                _ => Default::default(),
            },
        },
        MidiValueSourceKind::EffectSelected => MidiValueSource::EffectSelected {
            index: match current {
                MidiValueSource::EffectSelected { index } => index,
                _ => 0,
            },
        },
        MidiValueSourceKind::SelectedSceneInputDimmer => MidiValueSource::SelectedSceneInputDimmer,
        MidiValueSourceKind::SelectedSceneBeatOffset => MidiValueSource::SelectedSceneBeatOffset,
        MidiValueSourceKind::SelectedSceneIgnoreMainDimmer => {
            MidiValueSource::SelectedSceneIgnoreMainDimmer
        }
        MidiValueSourceKind::SelectedSceneSetOffsetOnFlash => {
            MidiValueSource::SelectedSceneSetOffsetOnFlash
        }
        MidiValueSourceKind::MainDimmer => MidiValueSource::MainDimmer,
        MidiValueSourceKind::BeatFlankPulse => match current {
            current @ MidiValueSource::BeatFlankPulse { .. } => current,
            _ => MidiValueSource::BeatFlankPulse {
                start_beat: 0.0,
                end_beat: 0.0,
                blackout_blink_value: None,
                every_beat: false,
            },
        },
        MidiValueSourceKind::Blackout => match current {
            MidiValueSource::Blackout { inverted, blink } => {
                MidiValueSource::Blackout { inverted, blink }
            }
            _ => MidiValueSource::Blackout {
                inverted: false,
                blink: false,
            },
        },
        MidiValueSourceKind::SceneOpacity => MidiValueSource::SceneOpacity {
            target: current_target_from_value_source(&current),
        },
        MidiValueSourceKind::SceneOpacityLive => MidiValueSource::SceneOpacityLive {
            target: current_target_from_value_source(&current),
        },
        MidiValueSourceKind::SceneInputDimmer => MidiValueSource::SceneInputDimmer {
            target: current_target_from_value_source(&current),
        },
        MidiValueSourceKind::SceneBeatOffset => MidiValueSource::SceneBeatOffset {
            target: current_target_from_value_source(&current),
        },
        MidiValueSourceKind::SceneIgnoreMainDimmer => MidiValueSource::SceneIgnoreMainDimmer {
            target: current_target_from_value_source(&current),
        },
        MidiValueSourceKind::SceneSetOffsetOnFlash => MidiValueSource::SceneSetOffsetOnFlash {
            target: current_target_from_value_source(&current),
        },
        MidiValueSourceKind::SceneActive => MidiValueSource::SceneActive {
            target: current_target_from_value_source(&current),
        },
        MidiValueSourceKind::SceneFlashed => MidiValueSource::SceneFlashed {
            target: current_target_from_value_source(&current),
        },
        MidiValueSourceKind::SceneSelected => MidiValueSource::SceneSelected {
            target: current_target_from_value_source(&current),
        },
        MidiValueSourceKind::ModeActive => MidiValueSource::ModeActive {
            mode: match current {
                MidiValueSource::ModeActive { mode } => mode,
                _ => 0,
            },
        },
        MidiValueSourceKind::SceneEffectSettingF32 => MidiValueSource::SceneEffectSettingF32 {
            target: current_target_from_value_source(&current),
            effect: current_effect_from_value_source(&current),
            setting_index: current_setting_index_from_value_source(&current),
        },
        MidiValueSourceKind::SceneEffectOpacity => MidiValueSource::SceneEffectOpacity {
            target: current_target_from_value_source(&current),
            effect: current_effect_from_value_source(&current),
        },
        MidiValueSourceKind::SceneEffectColorShift => MidiValueSource::SceneEffectColorShift {
            target: current_target_from_value_source(&current),
            effect: current_effect_from_value_source(&current),
        },
        MidiValueSourceKind::SceneEffectBeatProgression => {
            MidiValueSource::SceneEffectBeatProgression {
                target: current_target_from_value_source(&current),
                effect: current_effect_from_value_source(&current),
            }
        }
        MidiValueSourceKind::SceneEffectBeatOffset => MidiValueSource::SceneEffectBeatOffset {
            target: current_target_from_value_source(&current),
            effect: current_effect_from_value_source(&current),
        },
        MidiValueSourceKind::SceneEffectSpeedExponent => {
            MidiValueSource::SceneEffectSpeedExponent {
                target: current_target_from_value_source(&current),
                effect: current_effect_from_value_source(&current),
            }
        }
        MidiValueSourceKind::SceneEffectLayout => MidiValueSource::SceneEffectLayout {
            target: current_target_from_value_source(&current),
            effect: current_effect_from_value_source(&current),
        },
    }
}

fn current_target_from_value_source(source: &MidiValueSource) -> MidiSceneTarget {
    match source {
        MidiValueSource::SceneOpacity { target }
        | MidiValueSource::SceneOpacityLive { target }
        | MidiValueSource::SceneInputDimmer { target }
        | MidiValueSource::SceneBeatOffset { target }
        | MidiValueSource::SceneIgnoreMainDimmer { target }
        | MidiValueSource::SceneSetOffsetOnFlash { target }
        | MidiValueSource::SceneActive { target }
        | MidiValueSource::SceneFlashed { target }
        | MidiValueSource::SceneSelected { target }
        | MidiValueSource::SceneEffectSettingF32 { target, .. }
        | MidiValueSource::SceneEffectOpacity { target, .. }
        | MidiValueSource::SceneEffectColorShift { target, .. }
        | MidiValueSource::SceneEffectBeatProgression { target, .. }
        | MidiValueSource::SceneEffectBeatOffset { target, .. }
        | MidiValueSource::SceneEffectSpeedExponent { target, .. }
        | MidiValueSource::SceneEffectLayout { target, .. } => target.clone(),
        _ => MidiSceneTarget::Selected,
    }
}

fn current_effect_from_value_source(source: &MidiValueSource) -> MidiEffectTarget {
    match source {
        MidiValueSource::SceneEffectSettingF32 { effect, .. }
        | MidiValueSource::SceneEffectOpacity { effect, .. }
        | MidiValueSource::SceneEffectColorShift { effect, .. }
        | MidiValueSource::SceneEffectBeatProgression { effect, .. }
        | MidiValueSource::SceneEffectBeatOffset { effect, .. }
        | MidiValueSource::SceneEffectSpeedExponent { effect, .. }
        | MidiValueSource::SceneEffectLayout { effect, .. }
        | MidiValueSource::SelectedSceneEffectLive { effect, .. } => *effect,
        _ => MidiEffectTarget::Selected,
    }
}

fn current_setting_index_from_value_source(source: &MidiValueSource) -> u8 {
    match source {
        MidiValueSource::SceneEffectSettingF32 { setting_index, .. } => *setting_index,
        _ => 0,
    }
}