agent2: Allow to interrupt and send a new message (#36185)
Release Notes: - N/A
This commit is contained in:
parent
6f56ac50fe
commit
6bf666958c
1 changed files with 58 additions and 19 deletions
|
@ -474,12 +474,41 @@ impl AcpThreadView {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send(&mut self, window: &mut Window, cx: &mut Context<Self>) {
|
fn send(&mut self, window: &mut Window, cx: &mut Context<Self>) {
|
||||||
|
if let Some(thread) = self.thread() {
|
||||||
|
if thread.read(cx).status() != ThreadStatus::Idle {
|
||||||
|
self.stop_current_and_send_new_message(window, cx);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let contents = self
|
let contents = self
|
||||||
.message_editor
|
.message_editor
|
||||||
.update(cx, |message_editor, cx| message_editor.contents(window, cx));
|
.update(cx, |message_editor, cx| message_editor.contents(window, cx));
|
||||||
self.send_impl(contents, window, cx)
|
self.send_impl(contents, window, cx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn stop_current_and_send_new_message(&mut self, window: &mut Window, cx: &mut Context<Self>) {
|
||||||
|
let Some(thread) = self.thread().cloned() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
let cancelled = thread.update(cx, |thread, cx| thread.cancel(cx));
|
||||||
|
|
||||||
|
let contents = self
|
||||||
|
.message_editor
|
||||||
|
.update(cx, |message_editor, cx| message_editor.contents(window, cx));
|
||||||
|
|
||||||
|
cx.spawn_in(window, async move |this, cx| {
|
||||||
|
cancelled.await;
|
||||||
|
|
||||||
|
this.update_in(cx, |this, window, cx| {
|
||||||
|
this.send_impl(contents, window, cx);
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
})
|
||||||
|
.detach();
|
||||||
|
}
|
||||||
|
|
||||||
fn send_impl(
|
fn send_impl(
|
||||||
&mut self,
|
&mut self,
|
||||||
contents: Task<anyhow::Result<Vec<acp::ContentBlock>>>,
|
contents: Task<anyhow::Result<Vec<acp::ContentBlock>>>,
|
||||||
|
@ -2562,25 +2591,12 @@ impl AcpThreadView {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_send_button(&self, cx: &mut Context<Self>) -> AnyElement {
|
fn render_send_button(&self, cx: &mut Context<Self>) -> AnyElement {
|
||||||
if self.thread().map_or(true, |thread| {
|
let is_editor_empty = self.message_editor.read(cx).is_empty(cx);
|
||||||
thread.read(cx).status() == ThreadStatus::Idle
|
let is_generating = self.thread().map_or(false, |thread| {
|
||||||
}) {
|
thread.read(cx).status() != ThreadStatus::Idle
|
||||||
let is_editor_empty = self.message_editor.read(cx).is_empty(cx);
|
});
|
||||||
IconButton::new("send-message", IconName::Send)
|
|
||||||
.icon_color(Color::Accent)
|
if is_generating && is_editor_empty {
|
||||||
.style(ButtonStyle::Filled)
|
|
||||||
.disabled(self.thread().is_none() || is_editor_empty)
|
|
||||||
.when(!is_editor_empty, |button| {
|
|
||||||
button.tooltip(move |window, cx| Tooltip::for_action("Send", &Chat, window, cx))
|
|
||||||
})
|
|
||||||
.when(is_editor_empty, |button| {
|
|
||||||
button.tooltip(Tooltip::text("Type a message to submit"))
|
|
||||||
})
|
|
||||||
.on_click(cx.listener(|this, _, window, cx| {
|
|
||||||
this.send(window, cx);
|
|
||||||
}))
|
|
||||||
.into_any_element()
|
|
||||||
} else {
|
|
||||||
IconButton::new("stop-generation", IconName::Stop)
|
IconButton::new("stop-generation", IconName::Stop)
|
||||||
.icon_color(Color::Error)
|
.icon_color(Color::Error)
|
||||||
.style(ButtonStyle::Tinted(ui::TintColor::Error))
|
.style(ButtonStyle::Tinted(ui::TintColor::Error))
|
||||||
|
@ -2589,6 +2605,29 @@ impl AcpThreadView {
|
||||||
})
|
})
|
||||||
.on_click(cx.listener(|this, _event, _, cx| this.cancel_generation(cx)))
|
.on_click(cx.listener(|this, _event, _, cx| this.cancel_generation(cx)))
|
||||||
.into_any_element()
|
.into_any_element()
|
||||||
|
} else {
|
||||||
|
let send_btn_tooltip = if is_editor_empty && !is_generating {
|
||||||
|
"Type to Send"
|
||||||
|
} else if is_generating {
|
||||||
|
"Stop and Send Message"
|
||||||
|
} else {
|
||||||
|
"Send"
|
||||||
|
};
|
||||||
|
|
||||||
|
IconButton::new("send-message", IconName::Send)
|
||||||
|
.style(ButtonStyle::Filled)
|
||||||
|
.map(|this| {
|
||||||
|
if is_editor_empty && !is_generating {
|
||||||
|
this.disabled(true).icon_color(Color::Muted)
|
||||||
|
} else {
|
||||||
|
this.icon_color(Color::Accent)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.tooltip(move |window, cx| Tooltip::for_action(send_btn_tooltip, &Chat, window, cx))
|
||||||
|
.on_click(cx.listener(|this, _, window, cx| {
|
||||||
|
this.send(window, cx);
|
||||||
|
}))
|
||||||
|
.into_any_element()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue