Checkpoint
This commit is contained in:
@@ -167,6 +167,15 @@ pub struct Size<T: Clone + Default + Debug> {
|
||||
pub height: T,
|
||||
}
|
||||
|
||||
impl Size<Length> {
|
||||
pub fn full() -> Self {
|
||||
Self {
|
||||
width: relative(1.),
|
||||
height: relative(1.),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<S, T: Clone + Default + Debug> From<taffy::geometry::Size<S>> for Size<T>
|
||||
where
|
||||
S: Into<T>,
|
||||
|
||||
@@ -12,11 +12,21 @@ use parking_lot::Mutex;
|
||||
use std::sync::Arc;
|
||||
use util::arc_cow::ArcCow;
|
||||
|
||||
impl<V: 'static, S: Into<ArcCow<'static, str>>> IntoElement<V> for S {
|
||||
impl<V: 'static> IntoElement<V> for ArcCow<'static, str> {
|
||||
type Element = Text;
|
||||
|
||||
fn into_element(self) -> Self::Element {
|
||||
Text { text: self.into() }
|
||||
Text { text: self }
|
||||
}
|
||||
}
|
||||
|
||||
impl<V: 'static> IntoElement<V> for &'static str {
|
||||
type Element = Text;
|
||||
|
||||
fn into_element(self) -> Self::Element {
|
||||
Text {
|
||||
text: ArcCow::from(self),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ pub mod interactive;
|
||||
pub mod style;
|
||||
pub mod view;
|
||||
pub mod view_context;
|
||||
pub mod view_handle;
|
||||
|
||||
pub use color::*;
|
||||
pub use element::{AnyElement, Element, IntoElement, Layout, ParentElement};
|
||||
|
||||
@@ -3,7 +3,10 @@ use std::{any::TypeId, rc::Rc};
|
||||
use crate::{element::LayoutId, style::Style};
|
||||
use anyhow::{anyhow, Result};
|
||||
use derive_more::{Deref, DerefMut};
|
||||
use gpui::{geometry::Size, scene::EventHandler, EventContext, Layout, MeasureParams};
|
||||
use gpui::{
|
||||
geometry::Size, scene::EventHandler, AnyWindowHandle, BorrowWindowContext, EventContext,
|
||||
Layout, MeasureParams, WindowContext,
|
||||
};
|
||||
pub use gpui::{taffy::tree::NodeId, ViewContext as LegacyViewContext};
|
||||
|
||||
#[derive(Deref, DerefMut)]
|
||||
@@ -77,3 +80,35 @@ impl<'a, 'b, 'c, V: 'static> ViewContext<'a, 'b, 'c, V> {
|
||||
.computed_layout(layout_id)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'b, 'c, V: 'static> BorrowWindowContext for ViewContext<'a, 'b, 'c, V> {
|
||||
type Result<T> = T;
|
||||
|
||||
fn read_window<T, F>(&self, window: AnyWindowHandle, f: F) -> Self::Result<T>
|
||||
where
|
||||
F: FnOnce(&WindowContext) -> T,
|
||||
{
|
||||
self.legacy_cx.read_window(window, f)
|
||||
}
|
||||
|
||||
fn read_window_optional<T, F>(&self, window: AnyWindowHandle, f: F) -> Option<T>
|
||||
where
|
||||
F: FnOnce(&WindowContext) -> Option<T>,
|
||||
{
|
||||
self.legacy_cx.read_window_optional(window, f)
|
||||
}
|
||||
|
||||
fn update_window<T, F>(&mut self, window: AnyWindowHandle, f: F) -> Self::Result<T>
|
||||
where
|
||||
F: FnOnce(&mut WindowContext) -> T,
|
||||
{
|
||||
self.legacy_cx.update_window(window, f)
|
||||
}
|
||||
|
||||
fn update_window_optional<T, F>(&mut self, window: AnyWindowHandle, f: F) -> Option<T>
|
||||
where
|
||||
F: FnOnce(&mut WindowContext) -> Option<T>,
|
||||
{
|
||||
self.legacy_cx.update_window_optional(window, f)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
use crate::{style::Style, Element, IntoElement, ViewContext};
|
||||
use gpui::{
|
||||
geometry::{Point, Size},
|
||||
taffy::style::Overflow,
|
||||
AnyElement, View, ViewHandle,
|
||||
};
|
||||
|
||||
impl<ParentView: 'static, ChildView: View> Element<ParentView> for ViewHandle<ChildView> {
|
||||
type PaintState = AnyElement<ChildView>;
|
||||
|
||||
fn layout(
|
||||
&mut self,
|
||||
_: &mut ParentView,
|
||||
cx: &mut ViewContext<ParentView>,
|
||||
) -> anyhow::Result<(gpui::LayoutId, Self::PaintState)>
|
||||
where
|
||||
Self: Sized,
|
||||
{
|
||||
let layout_id = cx.add_layout_node(
|
||||
Style {
|
||||
overflow: Point {
|
||||
x: Overflow::Hidden,
|
||||
y: Overflow::Hidden,
|
||||
},
|
||||
size: Size::full(),
|
||||
..Default::default()
|
||||
},
|
||||
None,
|
||||
)?;
|
||||
let element = self.update(cx, |view, cx| view.render(cx));
|
||||
Ok((layout_id, element))
|
||||
}
|
||||
|
||||
fn paint(
|
||||
&mut self,
|
||||
_: &mut ParentView,
|
||||
parent_origin: gpui::geometry::vector::Vector2F,
|
||||
layout: &gpui::Layout,
|
||||
element: &mut AnyElement<ChildView>,
|
||||
cx: &mut ViewContext<ParentView>,
|
||||
) where
|
||||
Self: Sized,
|
||||
{
|
||||
self.update(cx, |view, cx| {
|
||||
let bounds = layout.bounds + parent_origin;
|
||||
element.layout(gpui::SizeConstraint::strict(bounds.size()), view, cx);
|
||||
cx.paint_layer(Some(layout.bounds), |cx| {
|
||||
element.paint(bounds.origin(), bounds, view, cx);
|
||||
});
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<ParentView: 'static, ChildView: View> IntoElement<ParentView> for ViewHandle<ChildView> {
|
||||
type Element = Self;
|
||||
|
||||
fn into_element(self) -> Self::Element {
|
||||
self
|
||||
}
|
||||
}
|
||||
@@ -117,7 +117,7 @@ impl<V: 'static> CollabPanelElement<V> {
|
||||
|
||||
fn list_section_header(
|
||||
&self,
|
||||
label: impl Into<ArcCow<'static, str>>,
|
||||
label: impl IntoElement<V>,
|
||||
expanded: bool,
|
||||
theme: &Theme,
|
||||
) -> impl Element<V> {
|
||||
@@ -146,7 +146,7 @@ impl<V: 'static> CollabPanelElement<V> {
|
||||
fn list_item(
|
||||
&self,
|
||||
avatar_uri: impl Into<ArcCow<'static, str>>,
|
||||
label: impl Into<ArcCow<'static, str>>,
|
||||
label: impl IntoElement<V>,
|
||||
theme: &Theme,
|
||||
) -> impl Element<V> {
|
||||
div()
|
||||
|
||||
Reference in New Issue
Block a user