use std::sync::Arc;
use crate::action::{UiAction, apply_palette_action};
use crate::engine::Engine;
use crate::input::{artnet::set_artnet_control_config, event::InputEvent};
use super::ignore_without_project;
impl Engine {
pub(super) fn apply_project_action(&mut self, action: UiAction) {
match (self.project.as_mut().map(Arc::make_mut), action) {
(Some(project), UiAction::SetMainDimmer(dimmer)) => {
project.main_dimmer = dimmer;
}
(Some(project), UiAction::AddMainDimmer(delta)) => {
project.main_dimmer = (project.main_dimmer + delta).clamp(0.0, 1.0);
}
(Some(project), UiAction::SetProjectArtnetControlActive(active)) => {
set_artnet_control_config(project, |config| config.active = active);
}
(Some(project), UiAction::SetProjectArtnetControlUniverse(universe)) => {
set_artnet_control_config(project, |config| config.universe = universe);
}
(Some(project), UiAction::SetProjectOscActive(active)) => {
project.osc_config.active = active;
}
(Some(project), UiAction::SetProjectOscPort(port)) => {
project.osc_config.port = port;
}
(Some(project), UiAction::AddProjectTapInputArtnet(channel)) => {
project.tap_input_events.insert(InputEvent::Artnet(channel));
}
(Some(project), UiAction::RemoveProjectTapInputArtnet(channel)) => {
project
.tap_input_events
.remove(&InputEvent::Artnet(channel));
}
(Some(project), UiAction::ClearProjectTapInput) => {
project.tap_input_events.clear();
}
(Some(project), UiAction::AddProjectBlackoutInputArtnet(channel)) => {
project
.blackout_input_events
.insert(InputEvent::Artnet(channel));
}
(Some(project), UiAction::RemoveProjectBlackoutInputArtnet(channel)) => {
project
.blackout_input_events
.remove(&InputEvent::Artnet(channel));
}
(Some(project), UiAction::ClearProjectBlackoutInput) => {
project.blackout_input_events.clear();
}
(Some(project), UiAction::AddProjectBlackoutHoldInputArtnet(channel)) => {
project
.blackout_hold_input_events
.insert(InputEvent::Artnet(channel));
}
(Some(project), UiAction::RemoveProjectBlackoutHoldInputArtnet(channel)) => {
project
.blackout_hold_input_events
.remove(&InputEvent::Artnet(channel));
}
(Some(project), UiAction::ClearProjectBlackoutHoldInput) => {
project.blackout_hold_input_events.clear();
}
(Some(project), UiAction::AddProjectHalfInputArtnet(channel)) => {
project
.half_input_events
.insert(InputEvent::Artnet(channel));
}
(Some(project), UiAction::RemoveProjectHalfInputArtnet(channel)) => {
project
.half_input_events
.remove(&InputEvent::Artnet(channel));
}
(Some(project), UiAction::ClearProjectHalfInput) => {
project.half_input_events.clear();
}
(Some(project), UiAction::AddProjectDoubleInputArtnet(channel)) => {
project
.double_input_events
.insert(InputEvent::Artnet(channel));
}
(Some(project), UiAction::RemoveProjectDoubleInputArtnet(channel)) => {
project
.double_input_events
.remove(&InputEvent::Artnet(channel));
}
(Some(project), UiAction::ClearProjectDoubleInput) => {
project.double_input_events.clear();
}
(
Some(project),
action @ (UiAction::SetProjectPaletteFromAsset(_)
| UiAction::SetProjectPalettePrimary(_)
| UiAction::SetProjectPaletteSecondary(_)
| UiAction::SetProjectPaletteGradient(_, _)
| UiAction::SetScenePaletteOverwriteFromAsset(_, _)
| UiAction::SetScenePaletteOverwritePrimary(_, _)
| UiAction::SetScenePaletteOverwriteSecondary(_, _)
| UiAction::SetScenePaletteOverwriteGradient(_, _, _)),
) => {
apply_palette_action(
project,
self.selected_scene_instance,
&self.collections,
&action,
);
}
(Some(project), UiAction::SetProjectPalette(palette)) => {
project.palette = *palette;
}
(Some(_), UiAction::SetProjectPatch(patch)) => self.replace_patch(*patch),
(Some(project), UiAction::SetGridSize(width, height)) => {
project.set_grid_size(width, height);
let selected = &mut self.selected_scene_instance;
selected.col = selected.col.min(project.grid_width() - 1);
selected.row = selected.row.min(project.grid_height() - 1);
}
(Some(project), UiAction::SetGridHighlight(grid_highlight)) => {
project.grid_highlight = grid_highlight;
}
(Some(project), UiAction::SetProjectChannelOverwrites(overwrites)) => {
project.channel_overwrites = overwrites;
}
(Some(project), UiAction::SetProjectOutputRoutings(routings)) => {
project.output_routings = routings;
}
(Some(project), UiAction::SetProjectArtnetConfig(artnet_config)) => {
project.artnet_config = *artnet_config;
}
(Some(project), UiAction::SetProjectTriggerInputs(inputs)) => {
inputs.apply_to(project);
}
(Some(project), UiAction::SetMidiActiveMappings(mappings)) => {
project.midi_active_mappings = mappings;
}
(Some(project), UiAction::SetProjectArtnetControl(config)) => {
set_artnet_control_config(project, |current| *current = config);
}
(Some(project), UiAction::SetProjectOsc(osc_config)) => {
project.osc_config = osc_config;
}
(None, _) => ignore_without_project(),
(Some(_), _) => {}
}
}
}