diff --git a/assets/icons/forward_arrow.svg b/assets/icons/forward_arrow.svg new file mode 100644 index 0000000000..0a7b71993f --- /dev/null +++ b/assets/icons/forward_arrow.svg @@ -0,0 +1 @@ + diff --git a/crates/agent/src/agent_diff.rs b/crates/agent/src/agent_diff.rs index 69e770edc1..ccbe1b437b 100644 --- a/crates/agent/src/agent_diff.rs +++ b/crates/agent/src/agent_diff.rs @@ -1,4 +1,4 @@ -use crate::{Thread, ThreadEvent}; +use crate::{Keep, Reject, Thread, ThreadEvent}; use anyhow::Result; use buffer_diff::DiffHunkStatus; use collections::HashSet; @@ -26,6 +26,7 @@ use workspace::{ item::{BreadcrumbText, ItemEvent, TabContentParams}, searchable::SearchableItemHandle, }; +use zed_actions::assistant::ToggleFocus; pub struct AgentDiff { multibuffer: Entity, @@ -553,11 +554,12 @@ impl Item for AgentDiff { } impl Render for AgentDiff { - fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { + fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { let is_empty = self.multibuffer.read(cx).is_empty(); + let focus_handle = &self.focus_handle; div() - .track_focus(&self.focus_handle) + .track_focus(focus_handle) .key_context(if is_empty { "EmptyPane" } else { "AgentDiff" }) .on_action(cx.listener(Self::keep)) .on_action(cx.listener(Self::reject)) @@ -568,7 +570,32 @@ impl Render for AgentDiff { .items_center() .justify_center() .size_full() - .when(is_empty, |el| el.child("No changes to review")) + .when(is_empty, |el| { + el.child( + v_flex() + .items_center() + .gap_2() + .child("No changes to review") + .child( + Button::new("continue-iterating", "Continue Iterating") + .style(ButtonStyle::Filled) + .icon(IconName::ForwardArrow) + .icon_position(IconPosition::Start) + .icon_size(IconSize::Small) + .icon_color(Color::Muted) + .full_width() + .key_binding(KeyBinding::for_action_in( + &ToggleFocus, + &focus_handle.clone(), + window, + cx, + )) + .on_click(|_event, window, cx| { + window.dispatch_action(ToggleFocus.boxed_clone(), cx) + }), + ), + ) + }) .when(!is_empty, |el| el.child(self.editor.clone())) } } @@ -604,7 +631,7 @@ fn render_diff_hunk_controls( .disabled(is_created_file) .key_binding( KeyBinding::for_action_in( - &crate::Reject, + &Reject, &editor.read(cx).focus_handle(cx), window, cx, @@ -625,13 +652,8 @@ fn render_diff_hunk_controls( }), Button::new(("keep", row as u64), "Keep") .key_binding( - KeyBinding::for_action_in( - &crate::Keep, - &editor.read(cx).focus_handle(cx), - window, - cx, - ) - .map(|kb| kb.size(rems_from_px(12.))), + KeyBinding::for_action_in(&Keep, &editor.read(cx).focus_handle(cx), window, cx) + .map(|kb| kb.size(rems_from_px(12.))), ) .on_click({ let agent_diff = agent_diff.clone(); diff --git a/crates/icons/src/icons.rs b/crates/icons/src/icons.rs index 345a0d5ebf..f6ec393783 100644 --- a/crates/icons/src/icons.rs +++ b/crates/icons/src/icons.rs @@ -122,6 +122,7 @@ pub enum IconName { Font, FontSize, FontWeight, + ForwardArrow, GenericClose, GenericMaximize, GenericMinimize,