diff --git a/crates/assistant2/src/assistant_panel.rs b/crates/assistant2/src/assistant_panel.rs index 7b15619758679b5e9246780813de63f0f1371261..2c1493cdfe93fdd5b392acd91390079bae9e378e 100644 --- a/crates/assistant2/src/assistant_panel.rs +++ b/crates/assistant2/src/assistant_panel.rs @@ -29,12 +29,12 @@ use editor::{ use fs::Fs; use futures::StreamExt; use gpui::{ - div, point, relative, rems, uniform_list, Action, AnyElement, AppContext, AsyncWindowContext, - ClipboardItem, Context, Div, EventEmitter, FocusHandle, Focusable, FocusableView, FontStyle, - FontWeight, HighlightStyle, InteractiveElement, IntoElement, Model, ModelContext, - ParentElement, Pixels, PromptLevel, Render, SharedString, StatefulInteractiveElement, Styled, - Subscription, Task, TextStyle, UniformListScrollHandle, View, ViewContext, VisualContext, - WeakModel, WeakView, WhiteSpace, WindowContext, + canvas, div, point, relative, rems, uniform_list, Action, AnyElement, AppContext, + AsyncWindowContext, AvailableSpace, ClipboardItem, Context, Div, EventEmitter, FocusHandle, + Focusable, FocusableView, FontStyle, FontWeight, HighlightStyle, InteractiveElement, + IntoElement, Model, ModelContext, ParentElement, Pixels, PromptLevel, Render, SharedString, + StatefulInteractiveElement, Styled, Subscription, Task, TextStyle, UniformListScrollHandle, + View, ViewContext, VisualContext, WeakModel, WeakView, WhiteSpace, WindowContext, }; use language::{language_settings::SoftWrap, Buffer, LanguageRegistry, ToOffset as _}; use project::Project; @@ -1184,17 +1184,28 @@ impl Render for AssistantPanel { .child(if let Some(editor) = self.active_editor() { editor.clone().into_any_element() } else { - uniform_list( - cx.view().clone(), - "saved_conversations", - self.saved_conversations.len(), - |this, range, cx| { - range - .map(|ix| this.render_saved_conversation(ix, cx)) - .collect() - }, - ) - .track_scroll(self.saved_conversations_scroll_handle.clone()) + let view = cx.view().clone(); + let scroll_handle = self.saved_conversations_scroll_handle.clone(); + let conversation_count = self.saved_conversations.len(); + canvas(move |bounds, cx| { + uniform_list( + view, + "saved_conversations", + conversation_count, + |this, range, cx| { + range + .map(|ix| this.render_saved_conversation(ix, cx)) + .collect() + }, + ) + .track_scroll(scroll_handle) + .draw( + bounds.origin, + bounds.size, + cx, + ); + }) + .size_full() .into_any_element() }), ) diff --git a/crates/gpui2/src/element.rs b/crates/gpui2/src/element.rs index 4201123a10110f540258b8afc462aeab63b3fb1a..3901db73e05c6148b813dc3937dd42843b7bc6b7 100644 --- a/crates/gpui2/src/element.rs +++ b/crates/gpui2/src/element.rs @@ -23,6 +23,17 @@ pub trait IntoElement: Sized { self.into_element().into_any() } + fn draw(self, origin: Point, available_space: Size, cx: &mut WindowContext) + where + T: Clone + Default + Debug + Into, + { + let element = DrawableElement { + element: Some(self.into_element()), + phase: ElementDrawPhase::Start, + }; + DrawableElement::draw(element, origin, available_space.map(Into::into), cx); + } + fn draw_and_update_state( self, origin: Point,