aboutsummaryrefslogtreecommitdiff
path: root/src/grid.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/grid.rs')
-rw-r--r--src/grid.rs76
1 files changed, 57 insertions, 19 deletions
diff --git a/src/grid.rs b/src/grid.rs
index e094867d..7a1fedb8 100644
--- a/src/grid.rs
+++ b/src/grid.rs
@@ -1,10 +1,11 @@
//! Functions for computing properties of the terminal grid
-use std::collections::{vec_deque, VecDeque};
-use std::ops::{Index, IndexMut, Deref, DerefMut};
+use std::ops::{Index, IndexMut, Deref, DerefMut, Range, RangeTo, RangeFrom};
use std::slice::{Iter, IterMut};
-use term::Cursor;
+use util::Rotate;
+
+use term::{Cursor, DEFAULT_FG, DEFAULT_BG};
use ::Rgb;
/// Calculate the number of cells for an axis
@@ -40,13 +41,22 @@ impl Cell {
flags: CellFlags::empty(),
}
}
+
+ pub fn reset(&mut self) {
+ self.c = ' ';
+ self.flags = CellFlags::empty();
+
+ // FIXME shouldn't know about term
+ self.bg = DEFAULT_BG;
+ self.fg = DEFAULT_FG;
+ }
}
/// Represents the terminal display contents
#[derive(Clone)]
pub struct Grid {
/// Rows in the grid. Each row holds a list of cells corresponding to the columns in that row.
- raw: VecDeque<Row>,
+ raw: Vec<Row>,
/// Number of columns
cols: usize,
@@ -59,9 +69,9 @@ pub struct Grid {
impl Grid {
pub fn new(rows: usize, cols: usize) -> Grid {
- let mut raw = VecDeque::with_capacity(rows);
+ let mut raw = Vec::with_capacity(rows);
for _ in 0..rows {
- raw.push_back(Row::new(cols));
+ raw.push(Row::new(cols));
}
Grid {
@@ -72,12 +82,12 @@ impl Grid {
}
#[inline]
- pub fn rows(&self) -> vec_deque::Iter<Row> {
+ pub fn rows(&self) -> Iter<Row> {
self.raw.iter()
}
#[inline]
- pub fn rows_mut(&mut self) -> vec_deque::IterMut<Row> {
+ pub fn rows_mut(&mut self) -> IterMut<Row> {
self.raw.iter_mut()
}
@@ -91,22 +101,20 @@ impl Grid {
self.raw[0].len()
}
- pub fn feed(&mut self) {
- // do the borrowck dance
- let row = self.raw.pop_front().unwrap();
- self.raw.push_back(row);
+ pub fn scroll(&mut self, region: Range<usize>, positions: isize) {
+ self.raw[region].rotate(positions)
}
- pub fn unfeed(&mut self) {
- // do the borrowck dance
- let row = self.raw.pop_back().unwrap();
- self.raw.push_front(row);
+ #[inline]
+ pub fn clear(&mut self) {
+ let region = 0..self.num_rows();
+ self.clear_region(region);
}
- pub fn clear(&mut self) {
- for row in self.raw.iter_mut() {
+ pub fn clear_region(&mut self, region: Range<usize>) {
+ for row in self.raw[region].iter_mut() {
for cell in row.iter_mut() {
- cell.c = ' ';
+ cell.reset();
}
}
}
@@ -190,3 +198,33 @@ impl IndexMut<usize> for Row {
&mut self.0[index]
}
}
+
+impl Index<RangeFrom<usize>> for Row {
+ type Output = [Cell];
+ #[inline]
+ fn index<'a>(&'a self, index: RangeFrom<usize>) -> &'a [Cell] {
+ &self.0[index]
+ }
+}
+
+impl IndexMut<RangeFrom<usize>> for Row {
+ #[inline]
+ fn index_mut<'a>(&'a mut self, index: RangeFrom<usize>) -> &'a mut [Cell] {
+ &mut self.0[index]
+ }
+}
+
+impl Index<RangeTo<usize>> for Row {
+ type Output = [Cell];
+ #[inline]
+ fn index<'a>(&'a self, index: RangeTo<usize>) -> &'a [Cell] {
+ &self.0[index]
+ }
+}
+
+impl IndexMut<RangeTo<usize>> for Row {
+ #[inline]
+ fn index_mut<'a>(&'a mut self, index: RangeTo<usize>) -> &'a mut [Cell] {
+ &mut self.0[index]
+ }
+}