agent: Cancel pending in-edit user message upon new message submit (#29565)
Previously, if you clicked on a user message to edit it, and then, while the user message has the editor pending, sent a new message via the textarea, the whole thread would be grayed out because we hadn't dismissed the to-be-edited pending user message. That's now fixed. Release Notes: - agent: Fixed a bug that would make the whole thread be grayed out upon sending a new message while a user message had a pending edit.
This commit is contained in:
parent
bbc66748dd
commit
bbe8d6a654
4 changed files with 24 additions and 1 deletions
|
@ -903,6 +903,11 @@ impl ActiveThread {
|
||||||
cx: &mut Context<Self>,
|
cx: &mut Context<Self>,
|
||||||
) {
|
) {
|
||||||
match event {
|
match event {
|
||||||
|
ThreadEvent::CancelEditing => {
|
||||||
|
if self.editing_message.is_some() {
|
||||||
|
self.cancel_editing_message(&menu::Cancel, window, cx);
|
||||||
|
}
|
||||||
|
}
|
||||||
ThreadEvent::ShowError(error) => {
|
ThreadEvent::ShowError(error) => {
|
||||||
self.last_error = Some(error.clone());
|
self.last_error = Some(error.clone());
|
||||||
}
|
}
|
||||||
|
|
|
@ -244,6 +244,10 @@ impl MessageEditor {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.thread.update(cx, |thread, cx| {
|
||||||
|
thread.cancel_editing(cx);
|
||||||
|
});
|
||||||
|
|
||||||
if self.thread.read(cx).is_generating() {
|
if self.thread.read(cx).is_generating() {
|
||||||
self.stop_current_and_send_new_message(window, cx);
|
self.stop_current_and_send_new_message(window, cx);
|
||||||
return;
|
return;
|
||||||
|
@ -312,6 +316,10 @@ impl MessageEditor {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn stop_current_and_send_new_message(&mut self, window: &mut Window, cx: &mut Context<Self>) {
|
fn stop_current_and_send_new_message(&mut self, window: &mut Window, cx: &mut Context<Self>) {
|
||||||
|
self.thread.update(cx, |thread, cx| {
|
||||||
|
thread.cancel_editing(cx);
|
||||||
|
});
|
||||||
|
|
||||||
let cancelled = self.thread.update(cx, |thread, cx| {
|
let cancelled = self.thread.update(cx, |thread, cx| {
|
||||||
thread.cancel_last_completion(Some(window.window_handle()), cx)
|
thread.cancel_last_completion(Some(window.window_handle()), cx)
|
||||||
});
|
});
|
||||||
|
|
|
@ -1866,6 +1866,14 @@ impl Thread {
|
||||||
canceled
|
canceled
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Signals that any in-progress editing should be canceled.
|
||||||
|
///
|
||||||
|
/// This method is used to notify listeners (like ActiveThread) that
|
||||||
|
/// they should cancel any editing operations.
|
||||||
|
pub fn cancel_editing(&mut self, cx: &mut Context<Self>) {
|
||||||
|
cx.emit(ThreadEvent::CancelEditing);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn feedback(&self) -> Option<ThreadFeedback> {
|
pub fn feedback(&self) -> Option<ThreadFeedback> {
|
||||||
self.feedback
|
self.feedback
|
||||||
}
|
}
|
||||||
|
@ -2384,6 +2392,7 @@ pub enum ThreadEvent {
|
||||||
},
|
},
|
||||||
CheckpointChanged,
|
CheckpointChanged,
|
||||||
ToolConfirmationNeeded,
|
ToolConfirmationNeeded,
|
||||||
|
CancelEditing,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EventEmitter<ThreadEvent> for Thread {}
|
impl EventEmitter<ThreadEvent> for Thread {}
|
||||||
|
|
|
@ -276,7 +276,8 @@ impl ExampleContext {
|
||||||
| ThreadEvent::ReceivedTextChunk
|
| ThreadEvent::ReceivedTextChunk
|
||||||
| ThreadEvent::StreamedToolUse { .. }
|
| ThreadEvent::StreamedToolUse { .. }
|
||||||
| ThreadEvent::CheckpointChanged
|
| ThreadEvent::CheckpointChanged
|
||||||
| ThreadEvent::UsageUpdated(_) => {
|
| ThreadEvent::UsageUpdated(_)
|
||||||
|
| ThreadEvent::CancelEditing => {
|
||||||
tx.try_send(Ok(())).ok();
|
tx.try_send(Ok(())).ok();
|
||||||
if std::env::var("ZED_EVAL_DEBUG").is_ok() {
|
if std::env::var("ZED_EVAL_DEBUG").is_ok() {
|
||||||
println!("{}Event: {:#?}", log_prefix, event);
|
println!("{}Event: {:#?}", log_prefix, event);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue