From d96a50b029c6640f32f6595417760943decb71e7 Mon Sep 17 00:00:00 2001 From: Smit Barmase Date: Sat, 22 Mar 2025 17:56:36 +0530 Subject: [PATCH] extensions_ui: Add scrollbar (#27303) This PR adds scrollbar to extensions page. For now haven't added setting to hide or configure this scrollbar, can be handled later. image Release Notes: - Added scrollbar to extensions page. --- crates/extensions_ui/src/extensions_ui.rs | 66 ++++++++++++++++------- 1 file changed, 47 insertions(+), 19 deletions(-) diff --git a/crates/extensions_ui/src/extensions_ui.rs b/crates/extensions_ui/src/extensions_ui.rs index 74173460e9..72100387cc 100644 --- a/crates/extensions_ui/src/extensions_ui.rs +++ b/crates/extensions_ui/src/extensions_ui.rs @@ -22,7 +22,10 @@ use release_channel::ReleaseChannel; use settings::Settings; use strum::IntoEnumIterator as _; use theme::ThemeSettings; -use ui::{prelude::*, CheckboxWithLabel, ContextMenu, PopoverMenu, ToggleButton, Tooltip}; +use ui::{ + prelude::*, CheckboxWithLabel, ContextMenu, PopoverMenu, Scrollbar, ScrollbarState, + ToggleButton, Tooltip, +}; use vim_mode_setting::VimModeSetting; use workspace::{ item::{Item, ItemEvent}, @@ -257,6 +260,7 @@ pub struct ExtensionsPage { _subscriptions: [gpui::Subscription; 2], extension_fetch_task: Option>, upsells: BTreeSet, + scrollbar_state: ScrollbarState, } impl ExtensionsPage { @@ -297,9 +301,11 @@ impl ExtensionsPage { }); cx.subscribe(&query_editor, Self::on_query_change).detach(); + let scroll_handle = UniformListScrollHandle::new(); + let mut this = Self { workspace: workspace.weak_handle(), - list: UniformListScrollHandle::new(), + list: scroll_handle.clone(), is_fetching_extensions: false, filter: ExtensionFilter::All, dev_extension_entries: Vec::new(), @@ -311,6 +317,7 @@ impl ExtensionsPage { _subscriptions: subscriptions, query_editor, upsells: BTreeSet::default(), + scrollbar_state: ScrollbarState::new(scroll_handle), }; this.fetch_extensions(None, Some(BTreeSet::from_iter(this.provides_filter)), cx); this @@ -1336,25 +1343,46 @@ impl Render for ExtensionsPage { ), ) .child(self.render_feature_upsells(cx)) - .child(v_flex().px_4().size_full().overflow_y_hidden().map(|this| { - let mut count = self.filtered_remote_extension_indices.len(); - if self.filter.include_dev_extensions() { - count += self.dev_extension_entries.len(); - } + .child( + v_flex() + .pl_4() + .pr_6() + .size_full() + .overflow_y_hidden() + .map(|this| { + let mut count = self.filtered_remote_extension_indices.len(); + if self.filter.include_dev_extensions() { + count += self.dev_extension_entries.len(); + } - if count == 0 { - return this.py_4().child(self.render_empty_state(cx)); - } + if count == 0 { + return this.py_4().child(self.render_empty_state(cx)); + } - let extensions_page = cx.entity().clone(); - let scroll_handle = self.list.clone(); - this.child( - uniform_list(extensions_page, "entries", count, Self::render_extensions) - .flex_grow() - .pb_4() - .track_scroll(scroll_handle), - ) - })) + let extensions_page = cx.entity().clone(); + let scroll_handle = self.list.clone(); + this.child( + uniform_list( + extensions_page, + "entries", + count, + Self::render_extensions, + ) + .flex_grow() + .pb_4() + .track_scroll(scroll_handle), + ) + .child( + div() + .absolute() + .right_1() + .top_0() + .bottom_0() + .w(px(12.)) + .children(Scrollbar::vertical(self.scrollbar_state.clone())), + ) + }), + ) } }