From c6b374ebc9ba9efe852bd2111da2cb0aaca9bbaf Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 15 Nov 2023 14:11:19 -0700 Subject: [PATCH] Remove initialize method from Element trait --- crates/editor2/src/element.rs | 14 ++-- crates/gpui2/src/element.rs | 2 +- crates/gpui2/src/elements/uniform_list.rs | 84 ++++++++++------------- crates/gpui2/src/view.rs | 4 +- crates/gpui2/src/window.rs | 20 +++--- 5 files changed, 53 insertions(+), 71 deletions(-) diff --git a/crates/editor2/src/element.rs b/crates/editor2/src/element.rs index 4d9a516f2b175f30ba0d968e82091aee7d76220a..de1b6f062244445960479710aeccddcfcd8e2bc6 100644 --- a/crates/editor2/src/element.rs +++ b/crates/editor2/src/element.rs @@ -2398,21 +2398,14 @@ impl Element for EditorElement { Some(self.editor_id.into()) } - fn initialize( + fn layout( &mut self, editor: &mut Editor, element_state: Option, cx: &mut gpui::ViewContext, - ) -> Self::ElementState { + ) -> (gpui::LayoutId, Self::ElementState) { editor.style = Some(self.style.clone()); // Long-term, we'd like to eliminate this. - } - fn layout( - &mut self, - editor: &mut Editor, - element_state: &mut Self::ElementState, - cx: &mut gpui::ViewContext, - ) -> gpui::LayoutId { let rem_size = cx.rem_size(); let mut style = Style::default(); style.size.width = relative(1.).into(); @@ -2421,7 +2414,8 @@ impl Element for EditorElement { EditorMode::AutoHeight { .. } => todo!(), EditorMode::Full => relative(1.).into(), }; - cx.request_layout(&style, None) + let layout_id = cx.request_layout(&style, None); + (layout_id, ()) } fn paint( diff --git a/crates/gpui2/src/element.rs b/crates/gpui2/src/element.rs index 3ee829df523aee8c84c78cd470d1e158fd3ee42a..221eb903fd4f7ef93df32558bbafef51d0518426 100644 --- a/crates/gpui2/src/element.rs +++ b/crates/gpui2/src/element.rs @@ -244,7 +244,7 @@ where fn draw( &mut self, - mut origin: Point, + origin: Point, available_space: Size, view_state: &mut V, cx: &mut ViewContext, diff --git a/crates/gpui2/src/elements/uniform_list.rs b/crates/gpui2/src/elements/uniform_list.rs index 97361396199f69c1875800e4bb2f6a201b502ee4..773f9ec8aacfb2ce0ac77cc96b4c30311a406ba5 100644 --- a/crates/gpui2/src/elements/uniform_list.rs +++ b/crates/gpui2/src/elements/uniform_list.rs @@ -108,62 +108,54 @@ impl Element for UniformList { Some(self.id.clone()) } - fn initialize( - &mut self, - view_state: &mut V, - element_state: Option, - cx: &mut ViewContext, - ) -> Self::ElementState { - if let Some(mut element_state) = element_state { - element_state.interactive = self - .interactivity - .initialize(Some(element_state.interactive), cx); - element_state - } else { - let item_size = self.measure_item(view_state, None, cx); - UniformListState { - interactive: self.interactivity.initialize(None, cx), - item_size, - } - } - } - fn layout( &mut self, - _view_state: &mut V, + view_state: &mut V, element_state: Option, cx: &mut ViewContext, ) -> (LayoutId, Self::ElementState) { let max_items = self.item_count; - let item_size = element_state.item_size; let rem_size = cx.rem_size(); + let item_size = element_state + .as_ref() + .map(|s| s.item_size) + .unwrap_or_else(|| self.measure_item(view_state, None, cx)); - self.interactivity - .layout(&mut element_state.interactive, cx, |style, cx| { - cx.request_measured_layout( - style, - rem_size, - move |known_dimensions: Size>, - available_space: Size| { - let desired_height = item_size.height * max_items; - let width = known_dimensions - .width - .unwrap_or(match available_space.width { - AvailableSpace::Definite(x) => x, + let (layout_id, interactive) = + self.interactivity + .layout(element_state.map(|s| s.interactive), cx, |style, cx| { + cx.request_measured_layout( + style, + rem_size, + move |known_dimensions: Size>, + available_space: Size| { + let desired_height = item_size.height * max_items; + let width = + known_dimensions + .width + .unwrap_or(match available_space.width { + AvailableSpace::Definite(x) => x, + AvailableSpace::MinContent | AvailableSpace::MaxContent => { + item_size.width + } + }); + let height = match available_space.height { + AvailableSpace::Definite(x) => desired_height.min(x), AvailableSpace::MinContent | AvailableSpace::MaxContent => { - item_size.width + desired_height } - }); - let height = match available_space.height { - AvailableSpace::Definite(x) => desired_height.min(x), - AvailableSpace::MinContent | AvailableSpace::MaxContent => { - desired_height - } - }; - size(width, height) - }, - ) - }) + }; + size(width, height) + }, + ) + }); + + let element_state = UniformListState { + interactive, + item_size, + }; + + (layout_id, element_state) } fn paint( diff --git a/crates/gpui2/src/view.rs b/crates/gpui2/src/view.rs index 1ce1c4d34916b41202e8ff407c3f6993b25b67c7..c6ae9240abc130ce48884f50ceff1f19fdd19c94 100644 --- a/crates/gpui2/src/view.rs +++ b/crates/gpui2/src/view.rs @@ -225,10 +225,10 @@ impl Element for AnyView { fn layout( &mut self, _view_state: &mut ParentViewState, - rendered_element: Option, + _element_state: Option, cx: &mut ViewContext, ) -> (LayoutId, Self::ElementState) { - (self.layout)(self, rendered_element, cx) + (self.layout)(self, cx) } fn paint( diff --git a/crates/gpui2/src/window.rs b/crates/gpui2/src/window.rs index 9c1951287124113c4b3934b314a5838dc2df2613..2f223e8314897e4fb92a38d8b02c4835fe84e4d0 100644 --- a/crates/gpui2/src/window.rs +++ b/crates/gpui2/src/window.rs @@ -1076,26 +1076,22 @@ impl<'a> WindowContext<'a> { self.with_z_index(0, |cx| { let available_space = cx.window.viewport_size.map(Into::into); - root_view.draw(available_space, cx); + root_view.draw(Point::zero(), available_space, cx); }); if let Some(active_drag) = self.app.active_drag.take() { self.with_z_index(1, |cx| { let offset = cx.mouse_position() - active_drag.cursor_offset; - cx.with_element_offset(offset, |cx| { - let available_space = - size(AvailableSpace::MinContent, AvailableSpace::MinContent); - active_drag.view.draw(available_space, cx); - cx.active_drag = Some(active_drag); - }); + let available_space = size(AvailableSpace::MinContent, AvailableSpace::MinContent); + active_drag.view.draw(offset, available_space, cx); + cx.active_drag = Some(active_drag); }); } else if let Some(active_tooltip) = self.app.active_tooltip.take() { self.with_z_index(1, |cx| { - cx.with_element_offset(active_tooltip.cursor_offset, |cx| { - let available_space = - size(AvailableSpace::MinContent, AvailableSpace::MinContent); - active_tooltip.view.draw(available_space, cx); - }); + let available_space = size(AvailableSpace::MinContent, AvailableSpace::MinContent); + active_tooltip + .view + .draw(active_tooltip.cursor_offset, available_space, cx); }); }