use crate::term::{Term, TrackedId, TrackedPoint};
impl Term {
fn tracked_mut(&mut self) -> &mut Vec<TrackedPoint> {
if self.on_alt {
&mut self.alt_tracked
} else {
&mut self.normal_tracked
}
}
fn tracked(&self) -> &Vec<TrackedPoint> {
if self.on_alt {
&self.alt_tracked
} else {
&self.normal_tracked
}
}
pub fn track_point(&mut self, line: usize, col: usize) -> TrackedId {
let id = TrackedId(self.next_tracked_id);
self.next_tracked_id += 1;
self.tracked_mut().push(TrackedPoint { id, line, col });
id
}
pub fn tracked_point(&self, id: TrackedId) -> Option<(usize, usize)> {
let p = self.tracked().iter().find(|p| p.id == id)?;
let floor = self.abs_floor();
let last = (self.scrollback.len() + self.grid.rows()).saturating_sub(1);
Some((
p.line.clamp(floor, last.max(floor)),
p.col.min(self.grid.cols()),
))
}
pub fn untrack_point(&mut self, id: TrackedId) {
self.normal_tracked.retain(|p| p.id != id);
self.alt_tracked.retain(|p| p.id != id);
}
pub(super) fn tracked_shift_below_margin(&mut self, from: usize) {
for p in &mut self.normal_tracked {
if p.line >= from {
p.line += 1;
}
}
}
pub(super) fn tracked_rotate_region(&mut self, top: usize, bottom: usize, up: bool) {
self.tracked_mut().retain_mut(|p| {
if p.line < top || p.line > bottom {
return true; }
let dropped_edge = if up { top } else { bottom };
if p.line == dropped_edge {
false
} else {
p.line = if up { p.line - 1 } else { p.line + 1 };
true
}
});
}
pub(super) fn tracked_evict_oldest(&mut self) {
self.normal_tracked.retain_mut(|p| {
if p.line == 0 {
false
} else {
p.line -= 1;
true
}
});
}
}