diff --git a/crates/agent/src/active_thread.rs b/crates/agent/src/active_thread.rs index d04d0cbcb9..a983d43690 100644 --- a/crates/agent/src/active_thread.rs +++ b/crates/agent/src/active_thread.rs @@ -1518,31 +1518,7 @@ impl ActiveThread { } fn paste(&mut self, _: &Paste, _window: &mut Window, cx: &mut Context) { - let images = cx - .read_from_clipboard() - .map(|item| { - item.into_entries() - .filter_map(|entry| { - if let ClipboardEntry::Image(image) = entry { - Some(image) - } else { - None - } - }) - .collect::>() - }) - .unwrap_or_default(); - - if images.is_empty() { - return; - } - cx.stop_propagation(); - - self.context_store.update(cx, |store, cx| { - for image in images { - store.add_image_instance(Arc::new(image), cx); - } - }); + attach_pasted_images_as_context(&self.context_store, cx); } fn cancel_editing_message( @@ -3653,6 +3629,38 @@ pub(crate) fn open_context( } } +pub(crate) fn attach_pasted_images_as_context( + context_store: &Entity, + cx: &mut App, +) -> bool { + let images = cx + .read_from_clipboard() + .map(|item| { + item.into_entries() + .filter_map(|entry| { + if let ClipboardEntry::Image(image) = entry { + Some(image) + } else { + None + } + }) + .collect::>() + }) + .unwrap_or_default(); + + if images.is_empty() { + return false; + } + cx.stop_propagation(); + + context_store.update(cx, |store, cx| { + for image in images { + store.add_image_instance(Arc::new(image), cx); + } + }); + true +} + fn open_editor_at_position( project_path: project::ProjectPath, target_position: Point, diff --git a/crates/agent/src/inline_prompt_editor.rs b/crates/agent/src/inline_prompt_editor.rs index 6aca18ceb8..af83b3ad76 100644 --- a/crates/agent/src/inline_prompt_editor.rs +++ b/crates/agent/src/inline_prompt_editor.rs @@ -13,6 +13,7 @@ use assistant_context_editor::language_model_selector::ToggleModelSelector; use client::ErrorExt; use collections::VecDeque; use db::kvp::Dismissable; +use editor::actions::Paste; use editor::display_map::EditorMargins; use editor::{ ContextMenuOptions, Editor, EditorElement, EditorEvent, EditorMode, EditorStyle, MultiBuffer, @@ -99,6 +100,7 @@ impl Render for PromptEditor { v_flex() .key_context("PromptEditor") + .capture_action(cx.listener(Self::paste)) .bg(cx.theme().colors().editor_background) .block_mouse_except_scroll() .gap_0p5() @@ -303,6 +305,10 @@ impl PromptEditor { self.editor.read(cx).text(cx) } + fn paste(&mut self, _: &Paste, _window: &mut Window, cx: &mut Context) { + crate::active_thread::attach_pasted_images_as_context(&self.context_store, cx); + } + fn toggle_rate_limit_notice( &mut self, _: &ClickEvent, diff --git a/crates/agent/src/message_editor.rs b/crates/agent/src/message_editor.rs index b9037e3e74..0ae326bd44 100644 --- a/crates/agent/src/message_editor.rs +++ b/crates/agent/src/message_editor.rs @@ -24,8 +24,8 @@ use fs::Fs; use futures::future::Shared; use futures::{FutureExt as _, future}; use gpui::{ - Animation, AnimationExt, App, ClipboardEntry, Entity, EventEmitter, Focusable, Subscription, - Task, TextStyle, WeakEntity, linear_color_stop, linear_gradient, point, pulsating_between, + Animation, AnimationExt, App, Entity, EventEmitter, Focusable, Subscription, Task, TextStyle, + WeakEntity, linear_color_stop, linear_gradient, point, pulsating_between, }; use language::{Buffer, Language, Point}; use language_model::{ @@ -432,31 +432,7 @@ impl MessageEditor { } fn paste(&mut self, _: &Paste, _: &mut Window, cx: &mut Context) { - let images = cx - .read_from_clipboard() - .map(|item| { - item.into_entries() - .filter_map(|entry| { - if let ClipboardEntry::Image(image) = entry { - Some(image) - } else { - None - } - }) - .collect::>() - }) - .unwrap_or_default(); - - if images.is_empty() { - return; - } - cx.stop_propagation(); - - self.context_store.update(cx, |store, cx| { - for image in images { - store.add_image_instance(Arc::new(image), cx); - } - }); + crate::active_thread::attach_pasted_images_as_context(&self.context_store, cx); } fn handle_review_click(&mut self, window: &mut Window, cx: &mut Context) {