gled-core 2.33.0

The engine of gled without a user interface: inputs, timing, rendering, Art-Net/DMX output and storage
Documentation
//! Applying actions from the user interfaces, OSC and MIDI to the engine.

mod animation;
mod effect;
mod project;
mod scene;
mod show;

use super::Engine;
use crate::action::UiAction;

impl Engine {
    #[cfg_attr(feature = "profiling", profiling::function)]
    pub(super) fn handle_actions(&mut self) {
        while let Ok(Some(action)) = self.actions.try_recv() {
            self.apply_action(action);
        }
    }

    pub(super) fn apply_action(&mut self, action: UiAction) {
        tracing::trace!("Handling ui action: {action:?}");

        // Only the handlers of actions that change the project take it
        // mutably: that copies it while the render thread or an interface
        // still holds the version published last.
        match action {
            UiAction::AddScene(..)
            | UiAction::DeleteSceneInstance { .. }
            | UiAction::DeleteSceneInstancePath(..)
            | UiAction::CloneSceneInstance(..)
            | UiAction::CloneSceneInstancePath(..)
            | UiAction::SetSceneOpacity(..)
            | UiAction::ToggleSceneActive(..)
            | UiAction::SetSceneActive(..)
            | UiAction::SetSceneFlash(..)
            | UiAction::SelectScene(..)
            | UiAction::SelectSceneByLocation(..)
            | UiAction::SwapScenes(..)
            | UiAction::SetSceneName(..)
            | UiAction::SetSceneColor(..)
            | UiAction::SetSceneInputDimmer(..)
            | UiAction::SetSceneIgnoreMainDimmer(..)
            | UiAction::SetSceneBeatOffset(..)
            | UiAction::SetSceneOpacityMultiplier(..)
            | UiAction::SetSceneOpacityCurve(..)
            | UiAction::SetSceneBeatOffsetMultiplier(..)
            | UiAction::SetSceneBeatOffsetCurve(..)
            | UiAction::SetSceneSetOffsetOnFlash(..)
            | UiAction::SetSceneActivationInput(..)
            | UiAction::SetSceneFlashInput(..)
            | UiAction::SetSceneDimmerInput(..)
            | UiAction::ReplaceSceneInstance(..) => self.apply_scene_action(action),
            UiAction::SelectSceneRelative(..)
            | UiAction::SelectSceneRowRelative(..)
            | UiAction::SelectSceneColumnRelative(..)
            | UiAction::SetMidiMode { .. }
            | UiAction::SetTouchedControl { .. }
            | UiAction::SelectSceneEffect(..)
            | UiAction::SelectSceneEffectRelative(..) => self.apply_selection_action(action),
            UiAction::SetSceneEffectOpacity(..)
            | UiAction::SetSceneEffectOpacityMultiplier(..)
            | UiAction::SetSceneEffectOpacityCurve(..)
            | UiAction::SetSceneEffectColorShift(..)
            | UiAction::SetSceneEffectColorShiftMultiplier(..)
            | UiAction::SetSceneEffectColorShiftCurve(..)
            | UiAction::SetSceneEffectBeatProgression(..)
            | UiAction::SetSceneEffectBeatProgressionMultiplier(..)
            | UiAction::SetSceneEffectBeatProgressionCurve(..)
            | UiAction::SetSceneEffectBeatOffset(..)
            | UiAction::SetSceneEffectBeatOffsetMultiplier(..)
            | UiAction::SetSceneEffectBeatOffsetCurve(..)
            | UiAction::SetSceneEffectSpeedExponent(..)
            | UiAction::SetSceneEffectLayout(..)
            | UiAction::SetSceneEffectAnimation(..)
            | UiAction::SetSceneEffectAnimationConfigU32(..)
            | UiAction::SetSceneEffectAnimationConfigF32(..)
            | UiAction::SetSceneEffectAnimationConfigF32Multiplier(..)
            | UiAction::AddSceneEffect(..)
            | UiAction::RemoveSceneEffect(..)
            | UiAction::CloneSceneEffect(..) => self.apply_effect_action(action),
            UiAction::SetMainDimmer(..)
            | UiAction::AddMainDimmer(..)
            | UiAction::SetProjectArtnetControlActive(..)
            | UiAction::SetProjectArtnetControlUniverse(..)
            | UiAction::SetProjectOscActive(..)
            | UiAction::SetProjectOscPort(..)
            | UiAction::AddProjectTapInputArtnet(..)
            | UiAction::RemoveProjectTapInputArtnet(..)
            | UiAction::ClearProjectTapInput
            | UiAction::AddProjectBlackoutInputArtnet(..)
            | UiAction::RemoveProjectBlackoutInputArtnet(..)
            | UiAction::ClearProjectBlackoutInput
            | UiAction::AddProjectBlackoutHoldInputArtnet(..)
            | UiAction::RemoveProjectBlackoutHoldInputArtnet(..)
            | UiAction::ClearProjectBlackoutHoldInput
            | UiAction::AddProjectHalfInputArtnet(..)
            | UiAction::RemoveProjectHalfInputArtnet(..)
            | UiAction::ClearProjectHalfInput
            | UiAction::AddProjectDoubleInputArtnet(..)
            | UiAction::RemoveProjectDoubleInputArtnet(..)
            | UiAction::ClearProjectDoubleInput
            | UiAction::SetProjectPaletteFromAsset(..)
            | UiAction::SetProjectPalettePrimary(..)
            | UiAction::SetProjectPaletteSecondary(..)
            | UiAction::SetProjectPaletteGradient(..)
            | UiAction::SetScenePaletteOverwriteFromAsset(..)
            | UiAction::SetScenePaletteOverwritePrimary(..)
            | UiAction::SetScenePaletteOverwriteSecondary(..)
            | UiAction::SetScenePaletteOverwriteGradient(..)
            | UiAction::SetProjectPalette(..)
            | UiAction::SetProjectPatch(..)
            | UiAction::SetGridSize(..)
            | UiAction::SetGridHighlight(..)
            | UiAction::SetProjectChannelOverwrites(..)
            | UiAction::SetProjectOutputRoutings(..)
            | UiAction::SetProjectArtnetConfig(..)
            | UiAction::SetProjectTriggerInputs(..)
            | UiAction::SetMidiActiveMappings(..)
            | UiAction::SetProjectArtnetControl(..)
            | UiAction::SetProjectOsc(..) => self.apply_project_action(action),
            UiAction::ReloadShaderCode(..)
            | UiAction::SetAnimationShaderCode(..)
            | UiAction::AddAnimationArgument(..)
            | UiAction::RemoveAnimationArgument(..)
            | UiAction::SetAnimationArgumentName(..)
            | UiAction::SetAnimationArgumentKind(..) => self.apply_animation_action(action),
            UiAction::SetAudioDevice(..)
            | UiAction::Tap
            | UiAction::SpeedAdd(..)
            | UiAction::SpeedMultiply(..)
            | UiAction::SetBlackout(..)
            | UiAction::ToggleBlackout
            | UiAction::SetProject(..)
            | UiAction::MidiOutputActive(..)
            | UiAction::Error(..)
            | UiAction::CloseProject
            | UiAction::SetOutputRoutings(..) => self.apply_show_action(action),
        }
    }
}

/// An action that needs a loaded project arrived while none is loaded.
fn ignore_without_project() {
    tracing::trace!("Ingoring ui action which needs a loaded project");
}