Fix file history for sizes <= 1200 entries

This commit is contained in:
Christoph Rüßler 2023-04-12 12:14:21 +02:00 committed by extrawurst
parent 9b09617f85
commit 49cd7ea2db

View file

@ -226,16 +226,40 @@ impl FileRevlogComponent {
if let Some(git_log) = &mut self.git_log {
let table_state = self.table_state.take();
let start = table_state.selected().unwrap_or(0);
let commits = get_commits_info(
&self.repo_path.borrow(),
&git_log.get_slice(start, SLICE_SIZE)?,
&git_log.get_slice(0, SLICE_SIZE)?,
self.current_width.get(),
);
if let Ok(commits) = commits {
self.items.set_items(start, commits);
// 2023-04-12
//
// There is an issue with how windowing works in `self.items` and
// `self.table_state`. Because of that issue, we currently have to pass
// `0` as the first argument to `set_items`. If we did not do that, the
// offset that is kept separately in `self.items` and `self.table_state`
// would get out of sync, resulting in the table showing the wrong rows.
//
// The offset determines the number of rows `render_stateful_widget`
// skips when rendering a table. When `set_items` is called, it clears
// its internal `Vec` of items and sets `index_offset` based on the
// parameter passed. Unfortunately, there is no way for us to pass this
// information, `index_offset`, to `render_stateful_widget`. Because of
// that, `render_stateful_widget` assumes that the rows provided by
// `Table` are 0-indexed while in reality they are
// `index_offset`-indexed.
//
// This fix makes the `FileRevlog` unable to show histories that have
// more than `SLICE_SIZE` items, but since it is broken for larger
// histories anyway, this seems acceptable for the time being.
//
// This issue can only properly be fixed upstream, in `tui-rs`. See
// [tui-issue].
//
// [gitui-issue]: https://github.com/extrawurst/gitui/issues/1560
// [tui-issue]: https://github.com/fdehau/tui-rs/issues/626
self.items.set_items(0, commits);
}
self.table_state.set(table_state);