gled-ui 2.31.2

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 {
            MidiValueSource::BeatFlankPulse {
                start_beat,
                end_beat,
                blackout_blink_value,
            } => MidiValueSource::BeatFlankPulse {
                start_beat,
                end_beat,
                blackout_blink_value,
            },
            _ => MidiValueSource::BeatFlankPulse {
                start_beat: 0.0,
                end_beat: 0.0,
                blackout_blink_value: None,
            },
        },
        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::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::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::SceneInputDimmer { target }
        | MidiValueSource::SceneBeatOffset { target }
        | MidiValueSource::SceneIgnoreMainDimmer { target }
        | MidiValueSource::SceneSetOffsetOnFlash { target }
        | MidiValueSource::SceneActive { target }
        | MidiValueSource::SceneFlashed { 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,
    }
}

pub(super) fn value_source_uses_active_value(source: &MidiValueSource) -> bool {
    match source {
        MidiValueSource::SelectedSceneIgnoreMainDimmer
        | MidiValueSource::SelectedSceneSetOffsetOnFlash
        | MidiValueSource::BeatFlankPulse { .. }
        | MidiValueSource::Blackout { .. }
        | MidiValueSource::SceneIgnoreMainDimmer { .. }
        | MidiValueSource::SceneSetOffsetOnFlash { .. }
        | MidiValueSource::SceneActive { .. }
        | MidiValueSource::SceneFlashed { .. }
        | MidiValueSource::EffectSelected { .. } => true,
        MidiValueSource::SelectedSceneOpacity
        | MidiValueSource::SelectedSceneDistributed
        | MidiValueSource::SelectedEffectDistributed
        | MidiValueSource::SelectedSceneEffectLive { .. }
        | MidiValueSource::SelectedSceneOpacityLive
        | MidiValueSource::SelectedSceneInputDimmer
        | MidiValueSource::SelectedSceneBeatOffset
        | MidiValueSource::MainDimmer
        | MidiValueSource::SceneOpacity { .. }
        | MidiValueSource::SceneInputDimmer { .. }
        | MidiValueSource::SceneBeatOffset { .. }
        | MidiValueSource::SceneEffectSettingF32 { .. }
        | MidiValueSource::SceneEffectOpacity { .. }
        | MidiValueSource::SceneEffectColorShift { .. }
        | MidiValueSource::SceneEffectBeatProgression { .. }
        | MidiValueSource::SceneEffectBeatOffset { .. }
        | MidiValueSource::SceneEffectSpeedExponent { .. }
        | MidiValueSource::SceneEffectLayout { .. } => false,
    }
}