From ba66e880b667b43505fe500f8ba743d4326bb142 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Fri, 29 Dec 2023 18:14:01 +0000 Subject: [PATCH] Scrolling downward, too. --- src/file.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/file.rs b/src/file.rs index b61dc27..c98ca97 100644 --- a/src/file.rs +++ b/src/file.rs @@ -169,6 +169,36 @@ impl FeedFile { 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 { @@ -254,6 +284,23 @@ 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, } } -- 2.30.2