use crate::Adjustments;
use image::DynamicImage;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct HistoryState {
pub data: Arc<DynamicImage>,
pub adjustments: Adjustments,
}
#[derive(Debug, Clone)]
pub struct History {
states: Vec<HistoryState>,
current_index: usize,
}
impl History {
pub fn new(initial_image: Arc<DynamicImage>, initial_adjustments: Adjustments) -> Self {
History {
states: vec![HistoryState {
data: initial_image,
adjustments: initial_adjustments,
}],
current_index: 0,
}
}
pub fn record_state(&mut self, image: Arc<DynamicImage>, adjustments: Adjustments) {
if self.current_index < self.states.len() - 1 {
self.states.truncate(self.current_index + 1);
}
self.states.push(HistoryState {
data: image,
adjustments,
});
self.current_index = self.states.len() - 1;
}
pub fn undo(&mut self) -> Option<HistoryState> {
if self.current_index > 0 {
self.current_index -= 1;
Some(self.states[self.current_index].clone())
} else {
None
}
}
pub fn redo(&mut self) -> Option<HistoryState> {
if self.current_index < self.states.len() - 1 {
self.current_index += 1;
Some(self.states[self.current_index].clone())
} else {
None
}
}
pub fn current_state(&self) -> HistoryState {
self.states[self.current_index].clone()
}
pub fn current_index(&self) -> usize {
self.current_index
}
}