diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index 48901043f2..5996abb5d5 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -289,14 +289,14 @@ impl ProjectPanel { fn expand_selected_entry(&mut self, _: &ExpandSelectedEntry, cx: &mut ViewContext) { if let Some((worktree, entry)) = self.selected_entry(cx) { - let expanded_dir_ids = - if let Some(expanded_dir_ids) = self.expanded_dir_ids.get_mut(&worktree.id()) { - expanded_dir_ids - } else { - return; - }; - if entry.is_dir() { + let expanded_dir_ids = + if let Some(expanded_dir_ids) = self.expanded_dir_ids.get_mut(&worktree.id()) { + expanded_dir_ids + } else { + return; + }; + match expanded_dir_ids.binary_search(&entry.id) { Ok(_) => self.select_next(&SelectNext, cx), Err(ix) => { @@ -305,12 +305,6 @@ impl ProjectPanel { cx.notify(); } } - } else { - let event = Event::OpenedEntry { - entry_id: entry.id, - focus_opened_item: true, - }; - cx.emit(event); } } } @@ -392,10 +386,31 @@ impl ProjectPanel { } fn confirm(&mut self, _: &Confirm, cx: &mut ViewContext) -> Option>> { + if let Some(task) = self.confirm_edit(cx) { + Some(task) + } else if let Some((_, entry)) = self.selected_entry(cx) { + if entry.is_file() { + self.open_entry( + &Open { + entry_id: entry.id, + change_focus: true, + }, + cx, + ); + } + None + } else { + None + } + } + + fn confirm_edit(&mut self, cx: &mut ViewContext) -> Option>> { let edit_state = self.edit_state.as_mut()?; cx.focus_self(); let worktree_id = edit_state.worktree_id; + let is_new_entry = edit_state.is_new_entry; + let is_dir = edit_state.is_dir; let worktree = self.project.read(cx).worktree_for_id(worktree_id, cx)?; let entry = worktree.read(cx).entry_for_id(edit_state.entry_id)?.clone(); let filename = self.filename_editor.read(cx).text(cx); @@ -403,7 +418,7 @@ impl ProjectPanel { let edit_task; let edited_entry_id; - if edit_state.is_new_entry { + if is_new_entry { self.selection = Some(Selection { worktree_id, entry_id: NEW_ENTRY_ID, @@ -411,7 +426,7 @@ impl ProjectPanel { let new_path = entry.path.join(&filename); edited_entry_id = NEW_ENTRY_ID; edit_task = self.project.update(cx, |project, cx| { - project.create_entry((edit_state.worktree_id, new_path), edit_state.is_dir, cx) + project.create_entry((worktree_id, new_path), is_dir, cx) })?; } else { let new_path = if let Some(parent) = entry.path.clone().parent() { @@ -444,6 +459,15 @@ impl ProjectPanel { } } this.update_visible_entries(None, cx); + if is_new_entry && !is_dir { + this.open_entry( + &Open { + entry_id: new_entry.id, + change_focus: true, + }, + cx, + ); + } cx.notify(); }); Ok(())