summaryrefslogtreecommitdiffstats
path: root/src/textview.rs
diff options
context:
space:
mode:
authorrabite <rabite@posteo.de>2019-03-09 23:40:13 +0100
committerrabite <rabite@posteo.de>2019-03-09 23:40:13 +0100
commit9ef59ba0501f7d29edc42c6861ff259ab1914b37 (patch)
tree3b13077b1d02f7ff11d95a95ba6cf8f84b136fe9 /src/textview.rs
parent67e1616efbaaf85d4990a3c89760324d48be7084 (diff)
scrolling and following proc output
Diffstat (limited to 'src/textview.rs')
-rw-r--r--src/textview.rs77
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)| {