summaryrefslogtreecommitdiff
path: root/rust/crates/commands/src/timeline/element/shift_split_remainder.rs
blob: be2f78e46df227ff1dd7abe07230d2e159aa9f0b (plain) (blame)
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
use std::cell::RefCell;
use std::rc::Rc;

use scene::{ElementRef, Project};
use time::MediaTime;

use crate::command::{Command, CommandError, CommandResult};
use crate::timeline::element::move_elements::{MoveElementCommand, PlannedElementMove};

pub struct ShiftSplitRemainderCommand {
    right_side: Rc<RefCell<Vec<ElementRef>>>,
    new_start_time: MediaTime,
    inner: Option<MoveElementCommand>,
}

impl ShiftSplitRemainderCommand {
    pub fn new(right_side: Rc<RefCell<Vec<ElementRef>>>, new_start_time: MediaTime) -> Self {
        Self {
            right_side,
            new_start_time,
            inner: None,
        }
    }
}

impl Command for ShiftSplitRemainderCommand {
    fn execute(
        &mut self,
        project: &mut Project,
    ) -> Result<Option<CommandResult>, CommandError> {
        let right_side = self.right_side.borrow().clone();
        if right_side.is_empty() {
            return Ok(None);
        }

        let mut inner = MoveElementCommand::new(
            right_side
                .iter()
                .map(|element| PlannedElementMove {
                    source_track_id: element.track_id.clone(),
                    target_track_id: element.track_id.clone(),
                    element_id: element.element_id.clone(),
                    new_start_time: self.new_start_time,
                })
                .collect(),
            Vec::new(),
        );
        let result = inner.execute(project)?;
        self.inner = Some(inner);
        Ok(result)
    }

    fn undo(&mut self, project: &mut Project) {
        if let Some(inner) = &mut self.inner {
            inner.undo(project);
        }
    }
}