diff --git a/crates/editor2/src/element.rs b/crates/editor2/src/element.rs index 4d9a516f2b..de1b6f0622 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 3ee829df52..221eb903fd 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 9736139619..773f9ec8aa 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( + fn layout( &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, - 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 1ce1c4d349..c6ae9240ab 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 9c19512871..2f223e8314 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); }); }