Support overflow scroll

This commit is contained in:
Nathan Sobo 2023-09-08 10:20:45 -06:00
parent 713d72942d
commit 21d390fa4a
5 changed files with 237 additions and 76 deletions

View file

@ -1,6 +1,6 @@
use crate::theme::{theme, Theme};
use gpui2::{
elements::{div, img, svg},
elements::{div, div::ScrollState, img, svg},
style::{StyleHelpers, Styleable},
ArcCow, Element, IntoElement, ParentElement, ViewContext,
};
@ -9,11 +9,15 @@ use std::marker::PhantomData;
#[derive(Element)]
pub struct CollabPanelElement<V: 'static> {
view_type: PhantomData<V>,
scroll_state: ScrollState,
}
pub fn collab_panel<V: 'static>() -> CollabPanelElement<V> {
// When I improve child view rendering, I'd like to have V implement a trait that
// provides the scroll state, among other things.
pub fn collab_panel<V: 'static>(scroll_state: ScrollState) -> CollabPanelElement<V> {
CollabPanelElement {
view_type: PhantomData,
scroll_state,
}
}
@ -24,6 +28,7 @@ impl<V: 'static> CollabPanelElement<V> {
// Panel
div()
.w_64()
.h_full()
.flex()
.flex_col()
.font("Zed Sans Extended")
@ -36,6 +41,7 @@ impl<V: 'static> CollabPanelElement<V> {
.w_full()
.flex()
.flex_col()
.overflow_y_scroll(self.scroll_state.clone())
// List Container
.child(
div()
@ -67,21 +73,29 @@ impl<V: 'static> CollabPanelElement<V> {
.flex()
.flex_col()
.child(self.list_section_header("CONTACTS", true, theme))
.child(self.list_item(
"http://github.com/as-cii.png?s=50",
"as-cii",
theme,
))
.child(self.list_item(
"http://github.com/nathansobo.png?s=50",
"nathansobo",
theme,
))
.child(self.list_item(
"http://github.com/maxbrunsfeld.png?s=50",
"maxbrunsfeld",
theme,
)),
.children(
std::iter::repeat_with(|| {
vec![
self.list_item(
"http://github.com/as-cii.png?s=50",
"as-cii",
theme,
),
self.list_item(
"http://github.com/nathansobo.png?s=50",
"nathansobo",
theme,
),
self.list_item(
"http://github.com/maxbrunsfeld.png?s=50",
"maxbrunsfeld",
theme,
),
]
})
.take(10)
.flatten(),
),
),
)
.child(

View file

@ -1,10 +1,50 @@
use crate::{collab_panel::collab_panel, theme::theme};
use gpui2::{
elements::{div, img, svg},
elements::{div, div::ScrollState, img, svg},
style::{StyleHelpers, Styleable},
Element, IntoElement, ParentElement, ViewContext,
};
#[derive(Element, Default)]
struct WorkspaceElement {
left_scroll_state: ScrollState,
right_scroll_state: ScrollState,
}
pub fn workspace<V: 'static>() -> impl Element<V> {
WorkspaceElement::default()
}
impl WorkspaceElement {
fn render<V: 'static>(&mut self, _: &mut V, cx: &mut ViewContext<V>) -> impl IntoElement<V> {
let theme = theme(cx);
div()
.size_full()
.flex()
.flex_col()
.font("Zed Sans Extended")
.gap_0()
.justify_start()
.items_start()
.text_color(theme.lowest.base.default.foreground)
.fill(theme.middle.base.default.background)
.child(titlebar())
.child(
div()
.flex_1()
.w_full()
.flex()
.flex_row()
.overflow_hidden()
.child(collab_panel(self.left_scroll_state.clone()))
.child(div().h_full().flex_1())
.child(collab_panel(self.right_scroll_state.clone())),
)
.child(statusbar())
}
}
#[derive(Element)]
struct TitleBar;
@ -393,50 +433,3 @@ impl StatusBar {
)
}
}
// ================================================================================ //
#[derive(Element)]
struct WorkspaceElement;
pub fn workspace<V: 'static>() -> impl Element<V> {
WorkspaceElement
}
impl WorkspaceElement {
fn render<V: 'static>(&mut self, _: &mut V, cx: &mut ViewContext<V>) -> impl IntoElement<V> {
let theme = theme(cx);
div()
.size_full()
.flex()
.flex_col()
.font("Zed Sans Extended")
.gap_0()
.justify_start()
.items_start()
.text_color(theme.lowest.base.default.foreground)
// .fill(theme.middle.warning.default.background)
.child(titlebar())
.child(
div()
.flex_1()
.flex()
.flex_row()
.w_full()
.child(collab_panel())
.child(div().h_full().flex_1())
.child(collab_panel()),
)
.child(statusbar())
}
}
// Hover over things
// Paint its space... padding, margin, border, content
/*
* h_8, grow_0/flex_grow_0, shrink_0/flex_shrink_0
* flex_grow
* h_8, grow_0/flex_grow_0, shrink_0/flex_shrink_0
*/