Allow scrolling of saved conversations (#3756)

Antonio Scandurra created

Release Notes:

- N/A

Change summary

crates/assistant2/src/assistant_panel.rs      | 46 +++++++++++++-------
crates/gpui2/src/elements/div.rs              |  2 
crates/terminal_view2/src/terminal_element.rs |  8 +--
3 files changed, 33 insertions(+), 23 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,29 @@ 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)
+                                .into_any_element()
+                                .draw(
+                                    bounds.origin,
+                                    bounds.size.map(AvailableSpace::Definite),
+                                    cx,
+                                );
+                            })
+                            .size_full()
                             .into_any_element()
                         }),
                 )

crates/gpui2/src/elements/div.rs 🔗

@@ -1472,7 +1472,7 @@ impl Interactivity {
                             {
                                 let mut scroll_offset = scroll_offset.borrow_mut();
                                 scroll_offset.x = scroll_offset.x.clamp(-scroll_max.width, px(0.));
-                                scroll_offset.y = scroll_offset.x.clamp(-scroll_max.height, px(0.));
+                                scroll_offset.y = scroll_offset.y.clamp(-scroll_max.height, px(0.));
                             }
 
                             let interactive_bounds = interactive_bounds.clone();

crates/terminal_view2/src/terminal_element.rs 🔗

@@ -4,8 +4,8 @@ use gpui::{
     BorrowWindow, Bounds, DispatchPhase, Element, ElementId, ExternalPaths, FocusHandle, Font,
     FontStyle, FontWeight, HighlightStyle, Hsla, InteractiveElement, InteractiveElementState,
     Interactivity, IntoElement, LayoutId, Model, ModelContext, ModifiersChangedEvent, MouseButton,
-    Pixels, PlatformInputHandler, Point, Rgba, ShapedLine, Size, StatefulInteractiveElement,
-    Styled, TextRun, TextStyle, TextSystem, UnderlineStyle, WhiteSpace, WindowContext,
+    Pixels, PlatformInputHandler, Point, Rgba, ShapedLine, StatefulInteractiveElement, Styled,
+    TextRun, TextStyle, TextSystem, UnderlineStyle, WhiteSpace, WindowContext,
 };
 use itertools::Itertools;
 use language::CursorShape;
@@ -855,9 +855,7 @@ impl Element for TerminalElement {
             }
 
             if let Some(mut element) = layout.hyperlink_tooltip.take() {
-                let width: AvailableSpace = bounds.size.width.into();
-                let height: AvailableSpace = bounds.size.height.into();
-                element.draw(origin, Size { width, height }, cx)
+                element.draw(origin, bounds.size.map(AvailableSpace::Definite), cx)
             }
         });
     }