From 9986a21970fafcc5b0562c0a8fbe1f6e7836ffbd Mon Sep 17 00:00:00 2001 From: Danilo Leal <67129314+danilo-leal@users.noreply.github.com> Date: Thu, 3 Apr 2025 12:32:02 -0300 Subject: [PATCH] agent: Add button to continue iterating once all reviews are done (#28027) This PR adds a button on the review tab empty state that toggles the focus back to the agent panel so that users can keep iterating on the thread that's active in the panel. Release Notes: - N/A --- assets/icons/forward_arrow.svg | 1 + crates/agent/src/agent_diff.rs | 46 +++++++++++++++++++++++++--------- crates/icons/src/icons.rs | 1 + 3 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 assets/icons/forward_arrow.svg 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,