diff options
author | rabite <rabite@posteo.de> | 2019-03-09 23:40:13 +0100 |
---|---|---|
committer | rabite <rabite@posteo.de> | 2019-03-09 23:40:13 +0100 |
commit | 9ef59ba0501f7d29edc42c6861ff259ab1914b37 (patch) | |
tree | 3b13077b1d02f7ff11d95a95ba6cf8f84b136fe9 /src/textview.rs | |
parent | 67e1616efbaaf85d4990a3c89760324d48be7084 (diff) |
scrolling and following proc output
Diffstat (limited to 'src/textview.rs')
-rw-r--r-- | src/textview.rs | 77 |
1 files changed, 73 insertions, 4 deletions
diff --git a/src/textview.rs b/src/textview.rs index 2d7fafd..25dc63e 100644 --- a/src/textview.rs +++ b/src/textview.rs @@ -9,7 +9,9 @@ use crate::fail::HResult; pub struct TextView { pub lines: Vec<String>, pub buffer: String, - pub core: WidgetCore + pub core: WidgetCore, + pub follow: bool, + pub offset: usize, } impl TextView { @@ -17,7 +19,9 @@ impl TextView { TextView { lines: vec![], buffer: String::new(), - core: core.clone() + core: core.clone(), + follow: false, + offset: 0, } } pub fn new_from_file(core: &WidgetCore, file: &File) -> HResult<TextView> { @@ -32,7 +36,9 @@ impl TextView { Ok(TextView { lines: lines, buffer: String::new(), - core: core.clone() + core: core.clone(), + follow: false, + offset: 0, }) } pub fn new_from_file_limit_lines(core: &WidgetCore, @@ -51,7 +57,9 @@ impl TextView { Ok(TextView { lines: lines, buffer: String::new(), - core: core.clone() + core: core.clone(), + follow: false, + offset: 0, }) } @@ -60,6 +68,60 @@ impl TextView { self.lines = lines; self.refresh() } + + pub fn toggle_follow(&mut self) { + self.follow = !self.follow + } + + pub fn scroll(&mut self, amount: isize) { + let ysize = self.get_coordinates().unwrap().ysize() as isize; + let offset = self.offset as isize; + let len = self.lines.len() as isize; + + if len <= ysize + offset { return } + + if amount > 0 { + if ysize + amount + offset + 1 >= len { + // Too far down + self.offset = (len - ysize - 1) as usize; + } else { + self.offset = (offset as isize + amount) as usize; + } + } else if amount < 0 { + if offset + amount >= 0 { + self.offset = (offset + amount) as usize; + } else { + self.offset = 0; + } + } + } + + pub fn scroll_up(&mut self) { + self.scroll(-1); + } + + pub fn scroll_down(&mut self) { + self.scroll(1); + } + + pub fn page_up(&mut self) { + let ysize = self.get_coordinates().unwrap().ysize() as isize; + self.scroll(0 - ysize + 1); + } + + pub fn page_down(&mut self) { + let ysize = self.get_coordinates().unwrap().ysize() as isize; + self.scroll(ysize - 1); + } + + pub fn scroll_top(&mut self) { + self.offset = 0; + } + + pub fn scroll_bottom(&mut self) { + let len = self.lines.len() as isize; + self.scroll(len); + } } impl Widget for TextView { @@ -72,11 +134,18 @@ impl Widget for TextView { fn refresh(&mut self) -> HResult<()> { let (xsize, ysize) = self.get_coordinates()?.size().size(); let (xpos, ypos) = self.get_coordinates()?.position().position(); + let len = self.lines.len(); + + if self.follow { + self.scroll_bottom(); + } + self.buffer = self.get_clearlist()? + &self .lines .iter() + .skip(self.offset) .take(ysize as usize) .enumerate() .map(|(i, line)| { |