From 1d98b33ae07a72e9e26dc9b0b54a8baa4fd5f8c1 Mon Sep 17 00:00:00 2001 From: Ben Kunkle Date: Tue, 15 Apr 2025 21:02:53 -0400 Subject: [PATCH] git_panel: Pad end of list to avoid obscuring final entry with horizontal scrollbar (#28823) Closes #27406 Release Notes: - N/A *or* Added/Fixed/Improved ... --- crates/git_ui/src/git_panel.rs | 57 ++++++++++------------------------ 1 file changed, 16 insertions(+), 41 deletions(-) diff --git a/crates/git_ui/src/git_panel.rs b/crates/git_ui/src/git_panel.rs index 0f0aed8268..80120d41f4 100644 --- a/crates/git_ui/src/git_panel.rs +++ b/crates/git_ui/src/git_panel.rs @@ -599,33 +599,11 @@ impl GitPanel { } pub fn entry_by_path(&self, path: &RepoPath) -> Option { - fn binary_search(mut low: usize, mut high: usize, is_target: F) -> Option - where - F: Fn(usize) -> std::cmp::Ordering, - { - while low < high { - let mid = low + (high - low) / 2; - match is_target(mid) { - std::cmp::Ordering::Equal => return Some(mid), - std::cmp::Ordering::Less => low = mid + 1, - std::cmp::Ordering::Greater => high = mid, - } - } - None - } if self.conflicted_count > 0 { let conflicted_start = 1; - if let Some(ix) = binary_search( - conflicted_start, - conflicted_start + self.conflicted_count, - |ix| { - self.entries[ix] - .status_entry() - .unwrap() - .repo_path - .cmp(&path) - }, - ) { + if let Ok(ix) = self.entries[conflicted_start..conflicted_start + self.conflicted_count] + .binary_search_by(|entry| entry.status_entry().unwrap().repo_path.cmp(&path)) + { return Some(ix); } } @@ -635,14 +613,8 @@ impl GitPanel { } else { 0 } + 1; - if let Some(ix) = - binary_search(tracked_start, tracked_start + self.tracked_count, |ix| { - self.entries[ix] - .status_entry() - .unwrap() - .repo_path - .cmp(&path) - }) + if let Ok(ix) = self.entries[tracked_start..tracked_start + self.tracked_count] + .binary_search_by(|entry| entry.status_entry().unwrap().repo_path.cmp(&path)) { return Some(ix); } @@ -657,14 +629,8 @@ impl GitPanel { } else { 0 } + 1; - if let Some(ix) = - binary_search(untracked_start, untracked_start + self.new_count, |ix| { - self.entries[ix] - .status_entry() - .unwrap() - .repo_path - .cmp(&path) - }) + if let Ok(ix) = self.entries[untracked_start..untracked_start + self.new_count] + .binary_search_by(|entry| entry.status_entry().unwrap().repo_path.cmp(&path)) { return Some(ix); } @@ -3611,6 +3577,15 @@ impl GitPanel { items } }) + .when( + !self.horizontal_scrollbar.show_track + && self.horizontal_scrollbar.show_scrollbar, + |this| { + // when not showing the horizontal scrollbar track, make sure we don't + // obscure the last entry + this.pb(scroll_track_size) + }, + ) .size_full() .flex_grow() .with_sizing_behavior(ListSizingBehavior::Auto)