diff --git a/assets/icons/load_circle.svg b/assets/icons/load_circle.svg new file mode 100644 index 0000000000..c4de36b1ff --- /dev/null +++ b/assets/icons/load_circle.svg @@ -0,0 +1 @@ + diff --git a/crates/agent/src/agent_diff.rs b/crates/agent/src/agent_diff.rs index e27315b022..54e4f1f9aa 100644 --- a/crates/agent/src/agent_diff.rs +++ b/crates/agent/src/agent_diff.rs @@ -1,6 +1,4 @@ -use crate::{ - Keep, KeepAll, OpenAgentDiff, Reject, RejectAll, Thread, ThreadEvent, ui::AnimatedLabel, -}; +use crate::{Keep, KeepAll, OpenAgentDiff, Reject, RejectAll, Thread, ThreadEvent}; use anyhow::Result; use assistant_settings::AssistantSettings; use buffer_diff::DiffHunkStatus; @@ -11,8 +9,9 @@ use editor::{ scroll::Autoscroll, }; use gpui::{ - Action, AnyElement, AnyView, App, AppContext, Empty, Entity, EventEmitter, FocusHandle, - Focusable, Global, SharedString, Subscription, Task, WeakEntity, Window, prelude::*, + Action, Animation, AnimationExt, AnyElement, AnyView, App, AppContext, Empty, Entity, + EventEmitter, FocusHandle, Focusable, Global, SharedString, Subscription, Task, Transformation, + WeakEntity, Window, percentage, prelude::*, }; use language::{Buffer, Capability, DiskState, OffsetRangeExt, Point}; @@ -25,6 +24,7 @@ use std::{ collections::hash_map::Entry, ops::Range, sync::Arc, + time::Duration, }; use ui::{IconButtonShape, KeyBinding, Tooltip, prelude::*, vertical_divider}; use util::ResultExt; @@ -978,9 +978,20 @@ impl ToolbarItemView for AgentDiffToolbar { impl Render for AgentDiffToolbar { fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - let generating_label = div() - .w(rems_from_px(110.)) // Arbitrary size so the label doesn't dance around - .child(AnimatedLabel::new("Generating")) + let spinner_icon = div() + .px_0p5() + .id("generating") + .tooltip(Tooltip::text("Generating Changes…")) + .child( + Icon::new(IconName::LoadCircle) + .size(IconSize::Small) + .color(Color::Accent) + .with_animation( + "load_circle", + Animation::new(Duration::from_secs(3)).repeat(), + |icon, delta| icon.transform(Transformation::rotate(percentage(delta))), + ), + ) .into_any(); let Some(active_item) = self.active_item.as_ref() else { @@ -997,7 +1008,7 @@ impl Render for AgentDiffToolbar { let content = match state { EditorState::Idle => return Empty.into_any(), - EditorState::Generating => vec![generating_label], + EditorState::Generating => vec![spinner_icon], EditorState::Reviewing => vec![ h_flex() .child( @@ -1115,7 +1126,7 @@ impl Render for AgentDiffToolbar { let is_generating = agent_diff.read(cx).thread.read(cx).is_generating(); if is_generating { - return div().px_2().child(generating_label).into_any(); + return div().px_2().child(spinner_icon).into_any(); } let is_empty = agent_diff.read(cx).multibuffer.read(cx).is_empty(); diff --git a/crates/icons/src/icons.rs b/crates/icons/src/icons.rs index 48ab648900..fc6d46c68e 100644 --- a/crates/icons/src/icons.rs +++ b/crates/icons/src/icons.rs @@ -155,6 +155,7 @@ pub enum IconName { ListCollapse, ListTree, ListX, + LoadCircle, LockOutlined, MagnifyingGlass, MailOpen,