Fix scroll

This commit is contained in:
daa 2017-03-18 13:21:20 +03:00
parent 700c8cd522
commit ff4aa6c848
2 changed files with 17 additions and 11 deletions

View File

@ -526,7 +526,7 @@ impl RedrawEvents for Shell {
} }
fn on_scroll(&mut self, count: i64) -> RepaintMode { fn on_scroll(&mut self, count: i64) -> RepaintMode {
RepaintMode::Area(self.model.scroll(count as usize)) RepaintMode::Area(self.model.scroll(count))
} }
fn on_highlight_set(&mut self, attrs: &Vec<(Value, Value)>) -> RepaintMode { fn on_highlight_set(&mut self, attrs: &Vec<(Value, Value)>) -> RepaintMode {

View File

@ -141,13 +141,18 @@ impl UiModel {
} }
pub fn put(&mut self, text: &str, attrs: Option<&Attrs>) -> ModelRect { pub fn put(&mut self, text: &str, attrs: Option<&Attrs>) -> ModelRect {
let changed_region = self.cur_point(); let mut changed_region = self.cur_point();
let mut cell = &mut self.model[self.cur_row][self.cur_col]; let mut cell = &mut self.model[self.cur_row][self.cur_col];
cell.ch = text.chars().last().unwrap_or(' '); cell.ch = text.chars().last().unwrap_or(' ');
cell.attrs = attrs.map(Attrs::clone).unwrap_or_else(|| Attrs::new()); cell.attrs = attrs.map(Attrs::clone).unwrap_or_else(|| Attrs::new());
cell.attrs.double_width = text.len() == 0; cell.attrs.double_width = text.len() == 0;
self.cur_col += 1; self.cur_col += 1;
if self.cur_col >= self.columns {
self.cur_col -= 1;
}
changed_region.join(&ModelRect::point(self.cur_row, self.cur_col));
changed_region changed_region
} }
@ -160,16 +165,17 @@ impl UiModel {
} }
#[inline] #[inline]
fn copy_row(&mut self, row: usize, offset: usize, left: usize, right: usize) { fn copy_row(&mut self, row: i64, offset: i64, left: usize, right: usize) {
for col in left..right + 1 { for col in left..right + 1 {
let from_row = row + offset; let from_row = (row + offset) as usize;
let from_cell = self.model[from_row][col].clone(); let from_cell = self.model[from_row][col].clone();
self.model[row][col] = from_cell; self.model[row as usize][col] = from_cell;
} }
} }
pub fn scroll(&mut self, count: usize) -> ModelRect { pub fn scroll(&mut self, count: i64) -> ModelRect {
let (top, bot, left, right) = (self.top, self.bot, self.left, self.right); let (top, bot, left, right) = (self.top as i64, self.bot as i64, self.left, self.right);
println!("{}, {}, {}, {}", top, bot, left, right);
if count > 0 { if count > 0 {
for row in top..(bot - count + 1) { for row in top..(bot - count + 1) {
@ -182,12 +188,12 @@ impl UiModel {
} }
if count > 0 { if count > 0 {
self.clear_region((bot - count + 1), bot, left, right); self.clear_region((bot - count + 1) as usize, bot as usize, left, right);
} else { } else {
self.clear_region(top, (top - count - 1), left, right); self.clear_region(top as usize, (top - count - 1) as usize, left, right);
} }
ModelRect::new(top, bot, left, right) ModelRect::new(top as usize, bot as usize, left, right)
} }
pub fn clear(&mut self) { pub fn clear(&mut self) {
@ -324,7 +330,7 @@ mod tests {
assert_eq!(1, rect.top); assert_eq!(1, rect.top);
assert_eq!(1, rect.left); assert_eq!(1, rect.left);
assert_eq!(1, rect.bot); assert_eq!(1, rect.bot);
assert_eq!(1, rect.right); assert_eq!(2, rect.right);
} }
#[test] #[test]