@@ -1518,31 +1518,7 @@ impl ActiveThread {
}
fn paste(&mut self, _: &Paste, _window: &mut Window, cx: &mut Context<Self>) {
- 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::<Vec<_>>()
- })
- .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<ContextStore>,
+ 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::<Vec<_>>()
+ })
+ .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,
@@ -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<T: 'static> Render for PromptEditor<T> {
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<T: 'static> PromptEditor<T> {
self.editor.read(cx).text(cx)
}
+ fn paste(&mut self, _: &Paste, _window: &mut Window, cx: &mut Context<Self>) {
+ crate::active_thread::attach_pasted_images_as_context(&self.context_store, cx);
+ }
+
fn toggle_rate_limit_notice(
&mut self,
_: &ClickEvent,
@@ -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<Self>) {
- 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::<Vec<_>>()
- })
- .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<Self>) {