Use new children approach for Panes and Toasts

This commit is contained in:
Marshall Bowers
2023-10-12 15:37:50 -04:00
parent ce8533f83b
commit 30979caf25
4 changed files with 64 additions and 75 deletions
+14 -12
View File
@@ -1,6 +1,7 @@
use std::marker::PhantomData;
use gpui3::{hsla, Hsla, Length, Size};
use gpui3::{hsla, AnyElement, Hsla, Length, Size};
use smallvec::SmallVec;
use crate::prelude::*;
use crate::theme;
@@ -18,17 +19,11 @@ pub struct Pane<S: 'static + Send + Sync> {
scroll_state: ScrollState,
size: Size<Length>,
fill: Hsla,
children: HackyChildren<S>,
payload: HackyChildrenPayload,
children: SmallVec<[AnyElement<S>; 2]>,
}
impl<S: 'static + Send + Sync> Pane<S> {
pub fn new(
scroll_state: ScrollState,
size: Size<Length>,
children: HackyChildren<S>,
payload: HackyChildrenPayload,
) -> Self {
pub fn new(scroll_state: ScrollState, size: Size<Length>) -> Self {
// Fill is only here for debugging purposes, remove before release
let system_color = SystemColor::new();
@@ -38,8 +33,7 @@ impl<S: 'static + Send + Sync> Pane<S> {
size,
fill: hsla(0.3, 0.3, 0.3, 1.),
// fill: system_color.transparent,
children,
payload,
children: SmallVec::new(),
}
}
@@ -58,7 +52,15 @@ impl<S: 'static + Send + Sync> Pane<S> {
.w(self.size.width)
.h(self.size.height)
.overflow_y_scroll(self.scroll_state.clone())
.children_any((self.children)(cx, self.payload.as_ref()))
.children(self.children.drain(..))
}
}
impl<S: 'static + Send + Sync> ParentElement for Pane<S> {
type State = S;
fn children_mut(&mut self) -> &mut SmallVec<[AnyElement<Self::State>; 2]> {
&mut self.children
}
}
+15 -14
View File
@@ -72,19 +72,16 @@ impl<S: 'static + Send + Sync + Clone> Terminal<S> {
),
)
// Terminal Pane.
.child(Pane::new(
ScrollState::default(),
Size {
width: relative(1.).into(),
height: rems(36.).into(),
},
|_, payload| {
let theme = payload.downcast_ref::<Arc<Theme>>().unwrap();
vec![crate::static_data::terminal_buffer(&theme).into_any()]
},
Box::new(theme),
))
.child(
Pane::new(
ScrollState::default(),
Size {
width: relative(1.).into(),
height: rems(36.).into(),
},
)
.child(crate::static_data::terminal_buffer(&theme)),
)
}
}
@@ -109,7 +106,11 @@ mod stories {
}
}
fn render(&mut self, _view: &mut S, cx: &mut ViewContext<S>) -> impl Element<ViewState = S> {
fn render(
&mut self,
_view: &mut S,
cx: &mut ViewContext<S>,
) -> impl Element<ViewState = S> {
Story::container(cx)
.child(Story::title_for::<_, Terminal<S>>(cx))
.child(Story::label(cx, "Default"))
+23 -16
View File
@@ -1,3 +1,8 @@
use std::marker::PhantomData;
use gpui3::AnyElement;
use smallvec::SmallVec;
use crate::prelude::*;
#[derive(Default, Debug, PartialEq, Eq, Clone, Copy)]
@@ -24,20 +29,14 @@ pub enum ToastVariant {
#[derive(Element)]
pub struct Toast<S: 'static + Send + Sync> {
origin: ToastOrigin,
children: HackyChildren<S>,
payload: HackyChildrenPayload,
children: SmallVec<[AnyElement<S>; 2]>,
}
impl<S: 'static + Send + Sync> Toast<S> {
pub fn new(
origin: ToastOrigin,
children: HackyChildren<S>,
payload: HackyChildrenPayload,
) -> Self {
pub fn new(origin: ToastOrigin) -> Self {
Self {
origin,
children,
payload,
children: SmallVec::new(),
}
}
@@ -62,7 +61,15 @@ impl<S: 'static + Send + Sync> Toast<S> {
.rounded_md()
.fill(color.elevated_surface)
.max_w_64()
.children_any((self.children)(cx, self.payload.as_ref()))
.children(self.children.drain(..))
}
}
impl<S: 'static + Send + Sync> ParentElement for Toast<S> {
type State = S;
fn children_mut(&mut self) -> &mut SmallVec<[AnyElement<Self::State>; 2]> {
&mut self.children
}
}
@@ -89,15 +96,15 @@ mod stories {
}
}
fn render(&mut self, _view: &mut S, cx: &mut ViewContext<S>) -> impl Element<ViewState = S> {
fn render(
&mut self,
_view: &mut S,
cx: &mut ViewContext<S>,
) -> impl Element<ViewState = S> {
Story::container(cx)
.child(Story::title_for::<_, Toast<S>>(cx))
.child(Story::label(cx, "Default"))
.child(Toast::new(
ToastOrigin::Bottom,
|_, _| vec![Label::new("label").into_any()],
Box::new(()),
))
.child(Toast::new(ToastOrigin::Bottom).child(Label::new("label")))
}
}
}
+12 -33
View File
@@ -172,25 +172,18 @@ impl Workspace {
width: relative(1.).into(),
height: temp_size,
},
|_, payload| {
let theme = payload.downcast_ref::<Arc<Theme>>().unwrap();
vec![EditorPane::new(hello_world_rust_editor_with_status_example(
&theme,
))
.into_any()]
},
Box::new(theme.clone()),
),
)
.child(EditorPane::new(
hello_world_rust_editor_with_status_example(&theme),
)),
Pane::new(
ScrollState::default(),
Size {
width: relative(1.).into(),
height: temp_size,
},
|_, _| vec![Terminal::new().into_any()],
Box::new(()),
),
)
.child(Terminal::new()),
],
SplitDirection::Vertical,
),
@@ -201,16 +194,10 @@ impl Workspace {
width: relative(1.).into(),
height: relative(1.).into(),
},
|_, payload| {
let theme = payload.downcast_ref::<Arc<Theme>>().unwrap();
vec![EditorPane::new(hello_world_rust_editor_with_status_example(
&theme,
))
.into_any()]
},
Box::new(theme.clone()),
)],
)
.child(EditorPane::new(
hello_world_rust_editor_with_status_example(&theme),
))],
SplitDirection::Vertical,
),
],
@@ -326,16 +313,8 @@ impl Workspace {
)
.filter(|_| workspace_state.is_language_selector_open()),
)
.child(Toast::new(
ToastOrigin::Bottom,
|_, _| vec![Label::new("A toast").into_any()],
Box::new(()),
))
.child(Toast::new(
ToastOrigin::BottomRight,
|_, _| vec![Label::new("Another toast").into_any()],
Box::new(()),
))
.child(Toast::new(ToastOrigin::Bottom).child(Label::new("A toast")))
.child(Toast::new(ToastOrigin::BottomRight).child(Label::new("Another toast")))
}
}