aboutsummaryrefslogtreecommitdiffstats
path: root/src/grid.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/grid.rs')
-rw-r--r--src/grid.rs23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/grid.rs b/src/grid.rs
index 287e5e4..5a53c6e 100644
--- a/src/grid.rs
+++ b/src/grid.rs
@@ -12,10 +12,12 @@ pub struct Grid {
scroll_bottom: u16,
origin_mode: bool,
saved_origin_mode: bool,
+ scrollback: std::collections::VecDeque<(usize, crate::row::Row)>,
+ scrollback_len: usize,
}
impl Grid {
- pub fn new(size: Size) -> Self {
+ pub fn new(size: Size, scrollback_len: usize) -> Self {
Self {
size,
pos: Pos::default(),
@@ -25,6 +27,8 @@ impl Grid {
scroll_bottom: size.rows - 1,
origin_mode: false,
saved_origin_mode: false,
+ scrollback: std::collections::VecDeque::new(),
+ scrollback_len,
}
}
@@ -127,6 +131,10 @@ impl Grid {
.expect("cursor not pointing to a cell")
}
+ pub fn scrollback_len(&self) -> usize {
+ self.scrollback_len
+ }
+
pub fn write_contents(&self, contents: &mut String) {
for row in self.rows() {
row.write_contents(contents, 0, self.size.cols);
@@ -309,7 +317,14 @@ impl Grid {
for _ in 0..(count.min(self.size.rows - self.scroll_top)) {
self.rows
.insert(self.scroll_bottom as usize + 1, self.new_row());
- self.rows.remove(self.scroll_top as usize);
+ let removed = self.rows.remove(self.scroll_top as usize);
+ if self.scrollback_len > 0 && !self.scroll_region_active() {
+ let idx = self.scrollback.back().map_or(0, |r| r.0 + 1);
+ self.scrollback.push_back((idx, removed));
+ while self.scrollback.len() > self.scrollback_len {
+ self.scrollback.pop_front();
+ }
+ }
}
}
@@ -337,6 +352,10 @@ impl Grid {
self.pos.row >= self.scroll_top && self.pos.row <= self.scroll_bottom
}
+ fn scroll_region_active(&self) -> bool {
+ self.scroll_top != 0 || self.scroll_bottom != self.size.rows - 1
+ }
+
pub fn set_origin_mode(&mut self, mode: bool) {
self.origin_mode = mode;
self.set_pos(Pos { row: 0, col: 0 })