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(¤t),
},
MidiValueSourceKind::SceneInputDimmer => MidiValueSource::SceneInputDimmer {
target: current_target_from_value_source(¤t),
},
MidiValueSourceKind::SceneBeatOffset => MidiValueSource::SceneBeatOffset {
target: current_target_from_value_source(¤t),
},
MidiValueSourceKind::SceneIgnoreMainDimmer => MidiValueSource::SceneIgnoreMainDimmer {
target: current_target_from_value_source(¤t),
},
MidiValueSourceKind::SceneSetOffsetOnFlash => MidiValueSource::SceneSetOffsetOnFlash {
target: current_target_from_value_source(¤t),
},
MidiValueSourceKind::SceneActive => MidiValueSource::SceneActive {
target: current_target_from_value_source(¤t),
},
MidiValueSourceKind::SceneFlashed => MidiValueSource::SceneFlashed {
target: current_target_from_value_source(¤t),
},
MidiValueSourceKind::SceneEffectSettingF32 => {
let (effect_index, setting_index) = current_effect_setting_from_value_source(¤t);
MidiValueSource::SceneEffectSettingF32 {
target: current_target_from_value_source(¤t),
effect_index,
setting_index,
}
}
MidiValueSourceKind::SceneEffectOpacity => MidiValueSource::SceneEffectOpacity {
target: current_target_from_value_source(¤t),
effect_index: current_effect_index_from_value_source(¤t),
},
MidiValueSourceKind::SceneEffectColorShift => MidiValueSource::SceneEffectColorShift {
target: current_target_from_value_source(¤t),
effect_index: current_effect_index_from_value_source(¤t),
},
MidiValueSourceKind::SceneEffectBeatProgression => {
MidiValueSource::SceneEffectBeatProgression {
target: current_target_from_value_source(¤t),
effect_index: current_effect_index_from_value_source(¤t),
}
}
MidiValueSourceKind::SceneEffectBeatOffset => MidiValueSource::SceneEffectBeatOffset {
target: current_target_from_value_source(¤t),
effect_index: current_effect_index_from_value_source(¤t),
},
MidiValueSourceKind::SceneEffectSpeedExponent => {
MidiValueSource::SceneEffectSpeedExponent {
target: current_target_from_value_source(¤t),
effect_index: current_effect_index_from_value_source(¤t),
}
}
MidiValueSourceKind::SceneEffectLayout => MidiValueSource::SceneEffectLayout {
target: current_target_from_value_source(¤t),
effect_index: current_effect_index_from_value_source(¤t),
},
}
}
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,
}
}