1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
use scene::{ElementRef, Project, SceneTracks, Track};
use crate::command::{Command, CommandError, CommandResult};
use crate::project_ext::active_scene_mut;
fn remove_track_elements(track: &mut Track, elements: &[ElementRef]) {
let track_id = track.id().to_string();
if !elements.iter().any(|target| target.track_id == track_id) {
return;
}
track.elements_mut().retain(|element| {
!elements
.iter()
.any(|target| target.track_id == track_id && target.element_id == element.base().id)
});
}
fn remove_elements_from_tracks(tracks: &mut SceneTracks, elements: &[ElementRef]) {
for track in &mut tracks.overlay {
remove_track_elements(track, elements);
}
remove_track_elements(&mut tracks.main, elements);
for track in &mut tracks.audio {
remove_track_elements(track, elements);
}
}
pub struct DeleteElementsCommand {
elements: Vec<ElementRef>,
saved_state: Option<SceneTracks>,
}
impl DeleteElementsCommand {
pub fn new(elements: Vec<ElementRef>) -> Self {
Self {
elements,
saved_state: None,
}
}
}
impl Command for DeleteElementsCommand {
fn execute(
&mut self,
project: &mut Project,
) -> Result<Option<CommandResult>, CommandError> {
let Some(scene) = active_scene_mut(project) else {
return Ok(None);
};
self.saved_state = Some(scene.tracks.clone());
remove_elements_from_tracks(&mut scene.tracks, &self.elements);
Ok(Some(CommandResult::element_selection(Vec::new())))
}
fn undo(&mut self, project: &mut Project) {
let Some(saved) = &self.saved_state else {
return;
};
if let Some(scene) = active_scene_mut(project) {
scene.tracks = saved.clone();
}
}
}
|