From 3ec47ced67d4d643b393d256f418d46d205837f2 Mon Sep 17 00:00:00 2001 From: Agung Baptiso Sorlawan Date: Tue, 30 Jun 2020 14:45:18 +0700 Subject: [PATCH] Fix scrolling issues in staged/unstaged section (fixes #144) (#162) --- src/components/filetree.rs | 20 ++++++++++++++++++-- src/ui/scrolllist.rs | 15 +-------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/components/filetree.rs b/src/components/filetree.rs index d07ab220..ff9efb64 100644 --- a/src/components/filetree.rs +++ b/src/components/filetree.rs @@ -16,6 +16,7 @@ use crate::{ use anyhow::Result; use asyncgit::{hash, StatusItem, StatusItemType}; use crossterm::event::Event; +use std::cell::Cell; use std::{borrow::Cow, convert::From, path::Path}; use tui::{backend::Backend, layout::Rect, widgets::Text, Frame}; @@ -28,6 +29,7 @@ pub struct FileTreeComponent { show_selection: bool, queue: Option, theme: SharedTheme, + scroll_top: Cell, } impl FileTreeComponent { @@ -46,6 +48,7 @@ impl FileTreeComponent { show_selection: focus, queue, theme, + scroll_top: Cell::new(0), } } @@ -247,12 +250,25 @@ impl DrawableComponent for FileTreeComponent { }, ); + let select = self + .tree + .selection + .map(|idx| idx - selection_offset) + .unwrap_or_default(); + let tree_height = r.height.saturating_sub(2) as usize; + + self.scroll_top.set(ui::calc_scroll_top( + self.scroll_top.get(), + tree_height, + select, + )); + ui::draw_list( f, r, self.title.as_str(), - items, - self.tree.selection.map(|idx| idx - selection_offset), + items.skip(self.scroll_top.get()), + Some(select), self.focused, &self.theme, ); diff --git a/src/ui/scrolllist.rs b/src/ui/scrolllist.rs index 36027879..ea2a5703 100644 --- a/src/ui/scrolllist.rs +++ b/src/ui/scrolllist.rs @@ -49,21 +49,8 @@ where L: Iterator>, { fn render(self, area: Rect, buf: &mut Buffer) { - let list_area = match self.block { - Some(b) => b.inner(area), - None => area, - }; - - let list_height = list_area.height as usize; - - let offset = if self.scroll >= list_height { - self.scroll - list_height + 1 - } else { - 0 - }; - // Render items - List::new(self.items.skip(offset as usize)) + List::new(self.items) .block(self.block.unwrap_or_default()) .style(self.style) .render(area, buf);