diff --git a/crates/assistant2/src/active_thread.rs b/crates/assistant2/src/active_thread.rs index 05e75d2c76..2d9dbf5364 100644 --- a/crates/assistant2/src/active_thread.rs +++ b/crates/assistant2/src/active_thread.rs @@ -1,11 +1,13 @@ use std::sync::Arc; +use std::time::Duration; use collections::HashMap; use editor::{Editor, MultiBuffer}; use gpui::{ - list, AbsoluteLength, AnyElement, App, ClickEvent, DefiniteLength, EdgesRefinement, Empty, - Entity, Focusable, Length, ListAlignment, ListOffset, ListState, StyleRefinement, Subscription, - Task, TextStyleRefinement, UnderlineStyle, + list, percentage, AbsoluteLength, Animation, AnimationExt, AnyElement, App, ClickEvent, + DefiniteLength, EdgesRefinement, Empty, Entity, Focusable, Length, ListAlignment, ListOffset, + ListState, StyleRefinement, Subscription, Task, TextStyleRefinement, Transformation, + UnderlineStyle, }; use language::{Buffer, LanguageRegistry}; use language_model::{LanguageModelRegistry, LanguageModelToolUseId, Role}; @@ -701,13 +703,13 @@ impl ActiveThread { .child( h_flex() .justify_between() - .py_0p5() + .py_1() .pl_1() .pr_2() - .bg(cx.theme().colors().editor_foreground.opacity(0.02)) + .bg(cx.theme().colors().editor_foreground.opacity(0.025)) .map(|element| { if is_open { - element.border_b_1().rounded_t(px(6.)) + element.border_b_1().rounded_t_md() } else { element.rounded_md() } @@ -731,16 +733,35 @@ impl ActiveThread { )) .child(Label::new(tool_use.name)), ) - .child( - Label::new(match tool_use.status { - ToolUseStatus::Pending => "Pending", - ToolUseStatus::Running => "Running", - ToolUseStatus::Finished(_) => "Finished", - ToolUseStatus::Error(_) => "Error", - }) - .size(LabelSize::XSmall) - .buffer_font(cx), - ), + .child({ + let (icon_name, color, animated) = match &tool_use.status { + ToolUseStatus::Pending => { + (IconName::Warning, Color::Warning, false) + } + ToolUseStatus::Running => { + (IconName::ArrowCircle, Color::Accent, true) + } + ToolUseStatus::Finished(_) => { + (IconName::Check, Color::Success, false) + } + ToolUseStatus::Error(_) => (IconName::Close, Color::Error, false), + }; + + let icon = Icon::new(icon_name).color(color).size(IconSize::Small); + + if animated { + icon.with_animation( + "arrow-circle", + Animation::new(Duration::from_secs(2)).repeat(), + |icon, delta| { + icon.transform(Transformation::rotate(percentage(delta))) + }, + ) + .into_any_element() + } else { + icon.into_any_element() + } + }), ) .map(|parent| { if !is_open { @@ -812,7 +833,7 @@ impl ActiveThread { .bg(cx.theme().colors().editor_foreground.opacity(0.02)) .map(|element| { if is_open { - element.border_b_1().rounded_t(px(6.)) + element.border_b_1().rounded_t_md() } else { element.rounded_md() }