Autoscroll to filename editor when creating or renaming entry

Antonio Scandurra created

Also, autoscroll when a filename editor goes off-screen and the user
types or changes selections.

Change summary

crates/project_panel/src/project_panel.rs | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)

Detailed changes

crates/project_panel/src/project_panel.rs 🔗

@@ -161,7 +161,7 @@ impl ProjectPanel {
                     {
                         this.expand_entry(worktree_id, *entry_id, cx);
                         this.update_visible_entries(Some((worktree_id, *entry_id)), cx);
-                        this.autoscroll();
+                        this.autoscroll(cx);
                         cx.notify();
                     }
                 }
@@ -185,6 +185,13 @@ impl ProjectPanel {
                 )
             });
 
+            cx.subscribe(&filename_editor, |this, _, event, cx| match event {
+                editor::Event::BufferEdited | editor::Event::SelectionsChanged { .. } => {
+                    this.autoscroll(cx);
+                }
+                _ => {}
+            })
+            .detach();
             cx.observe_focus(&filename_editor, |this, _, is_focused, cx| {
                 if !is_focused
                     && this
@@ -391,7 +398,7 @@ impl ProjectPanel {
                 worktree_id: *worktree_id,
                 entry_id: worktree_entries[entry_ix].id,
             });
-            self.autoscroll();
+            self.autoscroll(cx);
             cx.notify();
         } else {
             self.select_first(cx);
@@ -559,6 +566,7 @@ impl ProjectPanel {
                 .update(cx, |editor, cx| editor.clear(cx));
             cx.focus(&self.filename_editor);
             self.update_visible_entries(Some((worktree_id, NEW_ENTRY_ID)), cx);
+            self.autoscroll(cx);
             cx.notify();
         }
     }
@@ -588,6 +596,7 @@ impl ProjectPanel {
                     });
                     cx.focus(&self.filename_editor);
                     self.update_visible_entries(None, cx);
+                    self.autoscroll(cx);
                     cx.notify();
                 }
             }
@@ -636,7 +645,7 @@ impl ProjectPanel {
                         worktree_id: *worktree_id,
                         entry_id: entry.id,
                     });
-                    self.autoscroll();
+                    self.autoscroll(cx);
                     cx.notify();
                 }
             }
@@ -658,15 +667,16 @@ impl ProjectPanel {
                     worktree_id,
                     entry_id: root_entry.id,
                 });
-                self.autoscroll();
+                self.autoscroll(cx);
                 cx.notify();
             }
         }
     }
 
-    fn autoscroll(&mut self) {
+    fn autoscroll(&mut self, cx: &mut ViewContext<Self>) {
         if let Some((_, _, index)) = self.selection.and_then(|s| self.index_for_selection(s)) {
             self.list.scroll_to(ScrollTarget::Show(index));
+            cx.notify();
         }
     }