project_panel: Improve last sticky item drifting logic (#34119)

Smit Barmase created

- Now instead of drifting directory along with last item of that
directory, it waits till last item is completely consumed.

Release Notes:

- N/A

Change summary

crates/ui/src/components/sticky_items.rs | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)

Detailed changes

crates/ui/src/components/sticky_items.rs 🔗

@@ -159,10 +159,9 @@ where
 
         let mut iter = entries.iter().enumerate().peekable();
         while let Some((ix, current_entry)) = iter.next() {
-            let current_depth = current_entry.depth();
-            let index_in_range = ix;
+            let depth = current_entry.depth();
 
-            if current_depth < index_in_range {
+            if depth < ix {
                 sticky_anchor = Some(StickyAnchor {
                     entry: current_entry.clone(),
                     index: visible_range.start + ix,
@@ -172,9 +171,15 @@ where
 
             if let Some(&(_next_ix, next_entry)) = iter.peek() {
                 let next_depth = next_entry.depth();
+                let next_item_outdented = next_depth + 1 == depth;
 
-                if next_depth < current_depth && next_depth < index_in_range {
-                    last_item_is_drifting = true;
+                let depth_same_as_index = depth == ix;
+                let depth_greater_than_index = depth == ix + 1;
+
+                if next_item_outdented && (depth_same_as_index || depth_greater_than_index) {
+                    if depth_greater_than_index {
+                        last_item_is_drifting = true;
+                    }
                     sticky_anchor = Some(StickyAnchor {
                         entry: current_entry.clone(),
                         index: visible_range.start + ix,
@@ -216,7 +221,7 @@ where
 
         let drifting_y_offset = if last_item_is_drifting {
             let scroll_top = -scroll_offset.y;
-            let anchor_top = item_height * sticky_anchor.index;
+            let anchor_top = item_height * (sticky_anchor.index + 1);
             let sticky_area_height = item_height * items_count;
             (anchor_top - scroll_top - sticky_area_height).min(Pixels::ZERO)
         } else {