diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index 0c3e39fa5c5aa29720e64a0fa65ec2b5ca1d87c9..406aff23c7e6fa554bcd32f071412472143db3ae 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -761,10 +761,7 @@ impl ProjectPanel { task.detach_and_notify_err(window, cx); } None => { - project_panel.state.edit_state = None; - project_panel - .update_visible_entries(None, false, false, window, cx); - cx.notify(); + project_panel.discard_edit_state(window, cx); } } } @@ -1935,26 +1932,32 @@ impl ProjectPanel { })) } + fn discard_edit_state(&mut self, window: &mut Window, cx: &mut Context) { + let previously_focused = self + .state + .edit_state + .take() + .and_then(|edit_state| edit_state.previously_focused) + .map(|entry| (entry.worktree_id, entry.entry_id)); + self.marked_entries.clear(); + cx.notify(); + window.focus(&self.focus_handle, cx); + self.update_visible_entries( + previously_focused, + false, + previously_focused.is_some(), + window, + cx, + ); + } + fn cancel(&mut self, _: &menu::Cancel, window: &mut Window, cx: &mut Context) { if cx.stop_active_drag(window) { self.drag_target_entry.take(); self.hover_expand_task.take(); return; } - - let previous_edit_state = self.state.edit_state.take(); - self.update_visible_entries(None, false, false, window, cx); - self.marked_entries.clear(); - - if let Some(previously_focused) = - previous_edit_state.and_then(|edit_state| edit_state.previously_focused) - { - self.state.selection = Some(previously_focused); - self.autoscroll(cx); - } - - window.focus(&self.focus_handle, cx); - cx.notify(); + self.discard_edit_state(window, cx); } fn open_entry( diff --git a/crates/project_panel/src/project_panel_tests.rs b/crates/project_panel/src/project_panel_tests.rs index 5cc4d0b6a16ff9426888a3dbe494a919d4197e65..3501f952413aca096abeefbbc81bf14648f430de 100644 --- a/crates/project_panel/src/project_panel_tests.rs +++ b/crates/project_panel/src/project_panel_tests.rs @@ -875,7 +875,6 @@ async fn test_editing_files(cx: &mut gpui::TestAppContext) { }); assert!(panel.confirm_edit(true, window, cx).is_none()); panel.cancel(&menu::Cancel, window, cx); - panel.update_visible_entries(None, false, false, window, cx); }); cx.run_until_parked(); assert_eq!( @@ -2325,7 +2324,6 @@ async fn test_create_duplicate_items(cx: &mut gpui::TestAppContext) { "Edit state should not be None after conflicting new directory name" ); panel.cancel(&menu::Cancel, window, cx); - panel.update_visible_entries(None, false, false, window, cx); }); cx.run_until_parked(); assert_eq!( @@ -2381,7 +2379,6 @@ async fn test_create_duplicate_items(cx: &mut gpui::TestAppContext) { "Edit state should not be None after conflicting new file name" ); panel.cancel(&menu::Cancel, window, cx); - panel.update_visible_entries(None, false, false, window, cx); }); cx.run_until_parked(); assert_eq!( @@ -2441,6 +2438,7 @@ async fn test_create_duplicate_items(cx: &mut gpui::TestAppContext) { ); panel.cancel(&menu::Cancel, window, cx); }); + cx.executor().run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -2531,7 +2529,6 @@ async fn test_create_duplicate_items_and_check_history(cx: &mut gpui::TestAppCon "Edit state should not be None after conflicting new directory name" ); panel.cancel(&menu::Cancel, window, cx); - panel.update_visible_entries(None, false, false, window, cx); }); cx.run_until_parked(); assert_eq!( @@ -2587,7 +2584,6 @@ async fn test_create_duplicate_items_and_check_history(cx: &mut gpui::TestAppCon "Edit state should not be None after conflicting new file name" ); panel.cancel(&menu::Cancel, window, cx); - panel.update_visible_entries(None, false, false, window, cx); }); cx.run_until_parked(); assert_eq!( @@ -2647,6 +2643,7 @@ async fn test_create_duplicate_items_and_check_history(cx: &mut gpui::TestAppCon ); panel.cancel(&menu::Cancel, window, cx); }); + cx.executor().run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -4005,6 +4002,7 @@ async fn test_multiple_marked_entries(cx: &mut gpui::TestAppContext) { this.cancel(&menu::Cancel, window, cx); }) }); + cx.executor().run_until_parked(); assert_eq!( visible_entries_as_strings(&panel, 0..10, cx), &[ @@ -5326,7 +5324,6 @@ async fn test_selection_restored_when_creation_cancelled(cx: &mut gpui::TestAppC panel.update_in(cx, |panel, window, cx| { panel.cancel(&menu::Cancel, window, cx); - panel.update_visible_entries(None, false, false, window, cx); }); cx.executor().run_until_parked(); assert_eq!( @@ -5337,6 +5334,33 @@ async fn test_selection_restored_when_creation_cancelled(cx: &mut gpui::TestAppC " > test" ] ); + + panel.update_in(cx, |panel, window, cx| { + panel.new_directory(&NewDirectory, window, cx) + }); + cx.executor().run_until_parked(); + panel.update_in(cx, |panel, window, cx| { + assert!(panel.filename_editor.read(cx).is_focused(window)); + }); + assert_eq!( + visible_entries_as_strings(&panel, 0..10, cx), + &[ + // + "v src", + " > [EDITOR: ''] <== selected", + " > test" + ] + ); + workspace.update(cx, |_, window, _| window.blur()).unwrap(); + cx.executor().run_until_parked(); + assert_eq!( + visible_entries_as_strings(&panel, 0..10, cx), + &[ + // + "v src <== selected", + " > test" + ] + ); } #[gpui::test]