history.rs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. use lib_ot::text_delta::DeltaTextOperations;
  2. const MAX_UNDOES: usize = 20;
  3. #[derive(Debug, Clone)]
  4. pub struct UndoResult {
  5. pub operations: DeltaTextOperations,
  6. }
  7. #[derive(Debug, Clone)]
  8. pub struct History {
  9. #[allow(dead_code)]
  10. cur_undo: usize,
  11. undoes: Vec<DeltaTextOperations>,
  12. redoes: Vec<DeltaTextOperations>,
  13. capacity: usize,
  14. }
  15. impl std::default::Default for History {
  16. fn default() -> Self {
  17. History {
  18. cur_undo: 1,
  19. undoes: Vec::new(),
  20. redoes: Vec::new(),
  21. capacity: MAX_UNDOES,
  22. }
  23. }
  24. }
  25. impl History {
  26. pub fn new() -> Self {
  27. History::default()
  28. }
  29. pub fn can_undo(&self) -> bool {
  30. !self.undoes.is_empty()
  31. }
  32. pub fn can_redo(&self) -> bool {
  33. !self.redoes.is_empty()
  34. }
  35. pub fn add_undo(&mut self, delta: DeltaTextOperations) {
  36. self.undoes.push(delta);
  37. }
  38. pub fn add_redo(&mut self, delta: DeltaTextOperations) {
  39. self.redoes.push(delta);
  40. }
  41. pub fn record(&mut self, delta: DeltaTextOperations) {
  42. if delta.ops.is_empty() {
  43. return;
  44. }
  45. self.redoes.clear();
  46. self.add_undo(delta);
  47. if self.undoes.len() > self.capacity {
  48. self.undoes.remove(0);
  49. }
  50. }
  51. pub fn undo(&mut self) -> Option<DeltaTextOperations> {
  52. if !self.can_undo() {
  53. return None;
  54. }
  55. let delta = self.undoes.pop().unwrap();
  56. Some(delta)
  57. }
  58. pub fn redo(&mut self) -> Option<DeltaTextOperations> {
  59. if !self.can_redo() {
  60. return None;
  61. }
  62. let delta = self.redoes.pop().unwrap();
  63. Some(delta)
  64. }
  65. }