diff options
-rw-r--r-- | src/main.rs | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/src/main.rs b/src/main.rs index 8f4545c..406b422 100644 --- a/src/main.rs +++ b/src/main.rs @@ -187,6 +187,7 @@ struct Bk { chapter: Vec<String>, chapter_idx: usize, nav_idx: usize, + nav_top: usize, pos: usize, rows: usize, toc: Vec<(String, String)>, @@ -205,6 +206,7 @@ impl Bk { chapter: Vec::new(), chapter_idx: 0, nav_idx: 0, + nav_top: 0, toc: epub.get_toc(), epub, pos: pos.2, @@ -354,27 +356,37 @@ impl Bk { } fn match_nav(&mut self, kc: KeyCode) { match kc { - KeyCode::Esc | KeyCode::Tab | KeyCode::Char('q') => { + KeyCode::Esc | KeyCode::Char('h') | KeyCode::Char('q') => { self.mode = Mode::Read } + KeyCode::Enter | KeyCode::Tab | KeyCode::Char('l') => { + self.get_chapter(self.nav_idx); + self.pos = 0; + self.mode = Mode::Read; + } KeyCode::Down | KeyCode::Char('j') => { if self.nav_idx < self.toc.len() - 1 { self.nav_idx += 1; + if self.nav_idx == self.nav_top + self.rows { + self.nav_top += 1; + } } } KeyCode::Up | KeyCode::Char('k') => { if self.nav_idx > 0 { + if self.nav_idx == self.nav_top { + self.nav_top -= 1; + } self.nav_idx -= 1; } } - KeyCode::Enter => { - self.get_chapter(self.nav_idx); - self.pos = 0; - self.mode = Mode::Read; + KeyCode::Home | KeyCode::Char('g') => { + self.nav_idx = 0; + self.nav_top = 0; } - KeyCode::Home | KeyCode::Char('g') => self.nav_idx = 0, KeyCode::End | KeyCode::Char('G') => { - self.nav_idx = self.toc.len() - 1 + self.nav_idx = self.toc.len() - 1; + self.nav_top = self.toc.len().saturating_sub(self.rows); } _ => (), } @@ -448,29 +460,26 @@ impl Bk { } fn start_nav(&mut self) { self.nav_idx = self.chapter_idx; + self.nav_top = self.nav_idx.saturating_sub(self.rows - 1); self.mode = Mode::Nav; } fn render_nav(&self) { let mut stdout = stdout(); queue!(stdout, terminal::Clear(ClearType::All),).unwrap(); - let end = std::cmp::min(self.rows, self.toc.len()); - for i in 0..end { - queue!(stdout, cursor::MoveTo(0, i as u16)).unwrap(); - if i == self.nav_idx { - queue!( - stdout, - Print(format!( - "{}{}{}", - Attribute::Reverse, - &self.toc[i].0, - Attribute::Reset - )) + let end = std::cmp::min(self.nav_top + self.rows, self.toc.len()); + for (i, line) in self.toc[self.nav_top..end].iter().enumerate() { + let s = if self.nav_idx == self.nav_top + i { + format!( + "{}{}{}", + Attribute::Reverse, + line.0, + Attribute::Reset ) - .unwrap(); } else { - queue!(stdout, Print(&self.toc[i].0)).unwrap(); - } + line.0.to_string() + }; + queue!(stdout, cursor::MoveTo(0, i as u16), Print(s)).unwrap(); } stdout.flush().unwrap(); @@ -507,7 +516,7 @@ PageDown Right Space f l Page Down let end = std::cmp::min(self.pos + self.rows, self.chapter.len()); for (y, line) in self.chapter[self.pos..end].iter().enumerate() { - queue!(stdout, cursor::MoveTo(self.pad, y as u16), Print(line),) + queue!(stdout, cursor::MoveTo(self.pad, y as u16), Print(line)) .unwrap(); } stdout.flush().unwrap(); |