Allow scrolling saved conversations

Antonio Scandurra created

Change summary

crates/assistant2/src/assistant_panel.rs | 45 ++++++++++++++++---------
crates/gpui2/src/element.rs              | 11 ++++++
2 files changed, 39 insertions(+), 17 deletions(-)

Detailed changes

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()
                         }),
                 )

crates/gpui2/src/element.rs 🔗

@@ -23,6 +23,17 @@ pub trait IntoElement: Sized {
         self.into_element().into_any()
     }
 
+    fn draw<T>(self, origin: Point<Pixels>, available_space: Size<T>, cx: &mut WindowContext)
+    where
+        T: Clone + Default + Debug + Into<AvailableSpace>,
+    {
+        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<T, R>(
         self,
         origin: Point<Pixels>,