diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index db771b4ce1d6307c358b35fac3f906e1c8169e8d..541a3ea8d8bff5b3dce3e13de6c3a3c1c6c63e90 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -130,6 +130,7 @@ actions!( Copy, CopyPath, CopyRelativePath, + Duplicate, RevealInFinder, Cut, Paste, @@ -460,6 +461,7 @@ impl ProjectPanel { .separator() .action("Cut", Box::new(Cut)) .action("Copy", Box::new(Copy)) + .action("Duplicate", Box::new(Duplicate)) // TODO: Paste should always be visible, but disabled when clipboard is empty .when_some(self.clipboard_entry, |menu, entry| { menu.when(entry.worktree_id() == worktree_id, |menu| { @@ -1156,6 +1158,11 @@ impl ProjectPanel { }); } + fn duplicate(&mut self, _: &Duplicate, cx: &mut ViewContext) { + self.copy(&Copy {}, cx); + self.paste(&Paste {}, cx); + } + fn copy_path(&mut self, _: &CopyPath, cx: &mut ViewContext) { if let Some((worktree, entry)) = self.selected_entry(cx) { cx.write_to_clipboard(ClipboardItem::new( @@ -1831,6 +1838,7 @@ impl Render for ProjectPanel { .on_action(cx.listener(Self::cut)) .on_action(cx.listener(Self::copy)) .on_action(cx.listener(Self::paste)) + .on_action(cx.listener(Self::duplicate)) }) .when(project.is_local(), |el| { el.on_action(cx.listener(Self::reveal_in_finder))