From 2c00c97e76d22d8fde31fb4269ae386a37ad1f5f Mon Sep 17 00:00:00 2001 From: Danilo Leal <67129314+danilo-leal@users.noreply.github.com> Date: Fri, 17 Apr 2026 10:01:25 -0300 Subject: [PATCH] agent_ui: Fix UI issues with activity bar (#54178) - Ensures the activity bar properly reacts to the shrinking of the agent panel's width - Removes horizontal scroll from plan entries and instead add a tooltip to display the full content when not fully visible Release Notes: - N/A --- .../src/conversation_view/thread_view.rs | 106 ++++++++++-------- 1 file changed, 60 insertions(+), 46 deletions(-) diff --git a/crates/agent_ui/src/conversation_view/thread_view.rs b/crates/agent_ui/src/conversation_view/thread_view.rs index 3c06316c8003c94b17642b8955038fbd5fde2e31..d0d3ee37447e57d6c6cb440bff5df70714d6d346 100644 --- a/crates/agent_ui/src/conversation_view/thread_view.rs +++ b/crates/agent_ui/src/conversation_view/thread_view.rs @@ -2285,13 +2285,14 @@ impl ThreadView { h_flex() .w_full() + .px_2() .justify_center() .child( v_flex() .flex_basis(max_content_width) .flex_shrink() .flex_grow_0() - .mx_2() + .max_w_full() .bg(self.activity_bar_bg(cx)) .border_1() .border_b_0() @@ -2844,7 +2845,7 @@ impl ThreadView { IconButton::new("dismiss-plan", IconName::Close) .icon_size(IconSize::XSmall) .shape(ui::IconButtonShape::Square) - .tooltip(Tooltip::text("Clear plan")) + .tooltip(Tooltip::text("Clear Plan")) .on_click(cx.listener(|this, _, _, cx| { this.thread.update(cx, |thread, cx| thread.clear_plan(cx)); cx.stop_propagation(); @@ -2868,51 +2869,64 @@ impl ThreadView { .max_h_40() .overflow_y_scroll() .children(plan.entries.iter().enumerate().flat_map(|(index, entry)| { - let element = h_flex() - .py_1() - .px_2() - .gap_2() - .justify_between() - .bg(cx.theme().colors().editor_background) - .when(index < plan.entries.len() - 1, |parent| { - parent.border_color(cx.theme().colors().border).border_b_1() - }) - .child( - h_flex() - .id(("plan_entry", index)) - .gap_1p5() - .max_w_full() - .overflow_x_scroll() - .text_xs() - .text_color(cx.theme().colors().text_muted) - .child(match entry.status { - acp::PlanEntryStatus::InProgress => { - Icon::new(IconName::TodoProgress) - .size(IconSize::Small) - .color(Color::Accent) - .with_rotate_animation(2) - .into_any_element() - } - acp::PlanEntryStatus::Completed => { - Icon::new(IconName::TodoComplete) - .size(IconSize::Small) - .color(Color::Success) - .into_any_element() - } - acp::PlanEntryStatus::Pending | _ => { - Icon::new(IconName::TodoPending) - .size(IconSize::Small) - .color(Color::Muted) - .into_any_element() - } - }) - .child(MarkdownElement::new( - entry.content.clone(), - plan_label_markdown_style(&entry.status, window, cx), - )), - ); + let entry_bg = cx.theme().colors().editor_background; + let tooltip_text: SharedString = entry.content.read(cx).source().to_string().into(); - Some(element) + Some( + h_flex() + .id(("plan_entry_row", index)) + .py_1() + .px_2() + .gap_2() + .justify_between() + .relative() + .bg(entry_bg) + .when(index < plan.entries.len() - 1, |parent| { + parent.border_color(cx.theme().colors().border).border_b_1() + }) + .overflow_hidden() + .child( + h_flex() + .id(("plan_entry", index)) + .gap_1p5() + .min_w_0() + .text_xs() + .text_color(cx.theme().colors().text_muted) + .child(match entry.status { + acp::PlanEntryStatus::InProgress => { + Icon::new(IconName::TodoProgress) + .size(IconSize::Small) + .color(Color::Accent) + .with_rotate_animation(2) + .into_any_element() + } + acp::PlanEntryStatus::Completed => { + Icon::new(IconName::TodoComplete) + .size(IconSize::Small) + .color(Color::Success) + .into_any_element() + } + acp::PlanEntryStatus::Pending | _ => { + Icon::new(IconName::TodoPending) + .size(IconSize::Small) + .color(Color::Muted) + .into_any_element() + } + }) + .child(MarkdownElement::new( + entry.content.clone(), + plan_label_markdown_style(&entry.status, window, cx), + )), + ) + .child(div().absolute().top_0().right_0().h_full().w_8().bg( + linear_gradient( + 90., + linear_color_stop(entry_bg, 1.), + linear_color_stop(entry_bg.opacity(0.), 0.), + ), + )) + .tooltip(Tooltip::text(tooltip_text)), + ) })) .into_any_element() }