use scene::{ElementRef, Project}; use thiserror::Error; #[derive(Debug, Error)] pub enum CommandError { #[error("source track or element not found")] SourceNotFound, #[error("target track not found")] TargetTrackNotFound, #[error("{0}")] IncompatiblePlacement(String), } #[derive(Clone, Debug, Default, PartialEq)] pub struct SelectionPatch { pub selected_elements: Vec, } #[derive(Clone, Debug, Default, PartialEq)] pub struct CommandResult { pub selection: Option, } impl CommandResult { pub fn element_selection(selected_elements: Vec) -> Self { Self { selection: Some(SelectionPatch { selected_elements }), } } } pub trait Command { fn execute( &mut self, project: &mut Project, ) -> Result, CommandError>; fn undo(&mut self, project: &mut Project); fn redo( &mut self, project: &mut Project, ) -> Result, CommandError> { self.execute(project) } }