gled-ui 2.31.0

gled's egui interface, shared by the desktop app and the browser
Documentation
use gled_model::asset::midi_controller::{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::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 => {
            let (effect_index, setting_index) = current_effect_setting_from_value_source(&current);
            MidiValueSource::SceneEffectSettingF32 {
                target: current_target_from_value_source(&current),
                effect_index,
                setting_index,
            }
        }
        MidiValueSourceKind::SceneEffectOpacity => MidiValueSource::SceneEffectOpacity {
            target: current_target_from_value_source(&current),
            effect_index: current_effect_index_from_value_source(&current),
        },
        MidiValueSourceKind::SceneEffectColorShift => MidiValueSource::SceneEffectColorShift {
            target: current_target_from_value_source(&current),
            effect_index: current_effect_index_from_value_source(&current),
        },
        MidiValueSourceKind::SceneEffectBeatProgression => {
            MidiValueSource::SceneEffectBeatProgression {
                target: current_target_from_value_source(&current),
                effect_index: current_effect_index_from_value_source(&current),
            }
        }
        MidiValueSourceKind::SceneEffectBeatOffset => MidiValueSource::SceneEffectBeatOffset {
            target: current_target_from_value_source(&current),
            effect_index: current_effect_index_from_value_source(&current),
        },
        MidiValueSourceKind::SceneEffectSpeedExponent => {
            MidiValueSource::SceneEffectSpeedExponent {
                target: current_target_from_value_source(&current),
                effect_index: current_effect_index_from_value_source(&current),
            }
        }
        MidiValueSourceKind::SceneEffectLayout => MidiValueSource::SceneEffectLayout {
            target: current_target_from_value_source(&current),
            effect_index: current_effect_index_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_index_from_value_source(source: &MidiValueSource) -> u8 {
    match source {
        MidiValueSource::SceneEffectSettingF32 { effect_index, .. }
        | MidiValueSource::SceneEffectOpacity { effect_index, .. }
        | MidiValueSource::SceneEffectColorShift { effect_index, .. }
        | MidiValueSource::SceneEffectBeatProgression { effect_index, .. }
        | MidiValueSource::SceneEffectBeatOffset { effect_index, .. }
        | MidiValueSource::SceneEffectSpeedExponent { effect_index, .. }
        | MidiValueSource::SceneEffectLayout { effect_index, .. } => *effect_index,
        _ => 0,
    }
}

fn current_effect_setting_from_value_source(source: &MidiValueSource) -> (u8, u8) {
    match source {
        MidiValueSource::SceneEffectSettingF32 {
            effect_index,
            setting_index,
            ..
        } => (*effect_index, *setting_index),
        _ => (0, 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 { .. } => true,
        MidiValueSource::SelectedSceneOpacity
        | MidiValueSource::SelectedSceneDistributed
        | 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,
    }
}