self.pos = FilePosition::Fine(item, line);
self.ensure_enough_rendered();
}
+
+ fn move_down(&mut self, distance: usize) {
+ let (w, _h) = self.last_size.expect("move_down before resize");
+ let (item, line) = match self.pos {
+ FilePosition::Fine(item, line) => (item, line),
+ _ => panic!("coarse position reached move_down()"),
+ };
+
+ let mut item = item;
+ let mut line = line;
+ let mut remaining = distance;
+ while remaining > 0 {
+ let mut len = self.ensure_item_rendered(item, w).len();
+ if line == len {
+ if item >= self.contents.last_index() {
+ break;
+ }
+ item += 1;
+ line = 0;
+ len = self.ensure_item_rendered(item, w).len();
+ }
+
+ let this = min(remaining, len - line);
+ remaining -= this;
+ line += this;
+ }
+
+ self.pos = FilePosition::Fine(item, line);
+ self.ensure_enough_rendered();
+ }
}
impl ActivityState for FeedFile {
self.move_up(max(1, h - min(h, 3)));
LogicalAction::Nothing
},
+ Down => {
+ self.move_down(1);
+ LogicalAction::Nothing
+ },
+ Return => {
+ let oldpos = self.pos;
+ self.move_down(1);
+ if oldpos == self.pos {
+ LogicalAction::Pop
+ } else {
+ LogicalAction::Nothing
+ }
+ },
+ Space | PgDn | Right => {
+ self.move_down(max(1, h - min(h, 3)));
+ LogicalAction::Nothing
+ },
_ => LogicalAction::Nothing,
}
}