From 03619dfa55a10b061230ddda449a86b7e6744e90 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 21 Apr 2023 18:36:21 +0200 Subject: [PATCH] Rename Drawable::boxed to into_element and make containers generic Multi-element are now generic over any drawable child, which can be converted into an element. Co-Authored-By: Nathan Sobo Co-Authored-By: Max Brunsfeld --- .../src/activity_indicator.rs | 8 +- crates/auto_update/src/update_notification.rs | 14 +- crates/breadcrumbs/src/breadcrumbs.rs | 23 +- crates/collab_ui/src/collab_titlebar_item.rs | 100 ++--- .../src/collaborator_list_popover.rs | 16 +- crates/collab_ui/src/contact_finder.rs | 7 +- crates/collab_ui/src/contact_list.rs | 224 ++++------ crates/collab_ui/src/contacts_popover.rs | 5 +- .../src/incoming_call_notification.rs | 27 +- crates/collab_ui/src/notifications.rs | 18 +- .../src/project_shared_notification.rs | 27 +- .../collab_ui/src/sharing_status_indicator.rs | 3 +- crates/command_palette/src/command_palette.rs | 12 +- crates/context_menu/src/context_menu.rs | 101 ++--- crates/copilot/src/sign_in.rs | 226 +++++----- crates/copilot_button/src/copilot_button.rs | 34 +- crates/diagnostics/src/diagnostics.rs | 39 +- crates/diagnostics/src/items.rs | 38 +- crates/drag_and_drop/src/drag_and_drop.rs | 13 +- crates/editor/src/display_map.rs | 2 +- crates/editor/src/display_map/block_map.rs | 12 +- crates/editor/src/editor.rs | 29 +- crates/editor/src/editor_tests.rs | 8 +- crates/editor/src/element.rs | 14 +- crates/editor/src/hover_popover.rs | 13 +- crates/editor/src/items.rs | 15 +- crates/feedback/src/deploy_feedback_button.rs | 6 +- crates/feedback/src/feedback_editor.rs | 10 +- crates/feedback/src/feedback_info_text.rs | 12 +- crates/feedback/src/submit_feedback_button.rs | 3 +- crates/file_finder/src/file_finder.rs | 10 +- crates/go_to_line/src/go_to_line.rs | 32 +- crates/gpui/examples/text.rs | 2 +- crates/gpui/src/app.rs | 38 +- crates/gpui/src/elements.rs | 121 ++++-- crates/gpui/src/elements/canvas.rs | 2 +- crates/gpui/src/elements/constrained_box.rs | 4 +- crates/gpui/src/elements/expanded.rs | 4 +- crates/gpui/src/elements/flex.rs | 4 +- crates/gpui/src/elements/hook.rs | 4 +- crates/gpui/src/elements/keystroke_label.rs | 5 +- crates/gpui/src/elements/list.rs | 16 +- .../gpui/src/elements/mouse_event_handler.rs | 14 +- crates/gpui/src/elements/overlay.rs | 4 +- crates/gpui/src/elements/resizable.rs | 3 +- crates/gpui/src/elements/text.rs | 2 +- crates/gpui/src/elements/tooltip.rs | 20 +- crates/gpui/src/test.rs | 2 +- crates/gpui/src/views/select.rs | 91 ++-- .../src/active_buffer_language.rs | 5 +- .../src/language_selector.rs | 2 +- crates/outline/src/outline.rs | 2 +- crates/picker/src/picker.rs | 11 +- crates/project_panel/src/project_panel.rs | 44 +- crates/project_symbols/src/project_symbols.rs | 7 +- .../src/highlighted_workspace_location.rs | 2 +- crates/recent_projects/src/recent_projects.rs | 2 +- crates/search/src/buffer_search.rs | 29 +- crates/search/src/project_search.rs | 37 +- crates/settings/src/settings_file.rs | 2 +- crates/terminal_view/src/terminal_button.rs | 19 +- crates/terminal_view/src/terminal_element.rs | 5 +- crates/terminal_view/src/terminal_view.rs | 14 +- crates/theme/src/ui.rs | 99 ++--- crates/theme_selector/src/theme_selector.rs | 2 +- crates/theme_testbench/src/theme_testbench.rs | 57 +-- crates/welcome/src/base_keymap_picker.rs | 2 +- crates/welcome/src/welcome.rs | 109 +++-- crates/workspace/src/dock.rs | 47 +- .../workspace/src/dock/toggle_dock_button.rs | 5 +- crates/workspace/src/item.rs | 4 +- crates/workspace/src/notifications.rs | 26 +- crates/workspace/src/pane.rs | 405 ++++++++---------- .../src/pane/dragged_item_receiver.rs | 10 +- crates/workspace/src/pane_group.rs | 26 +- crates/workspace/src/shared_screen.rs | 11 +- crates/workspace/src/sidebar.rs | 13 +- crates/workspace/src/status_bar.rs | 8 +- crates/workspace/src/toolbar.rs | 18 +- crates/workspace/src/workspace.rs | 106 ++--- 80 files changed, 1132 insertions(+), 1434 deletions(-) diff --git a/crates/activity_indicator/src/activity_indicator.rs b/crates/activity_indicator/src/activity_indicator.rs index c49348b832..11a8945d61 100644 --- a/crates/activity_indicator/src/activity_indicator.rs +++ b/crates/activity_indicator/src/activity_indicator.rs @@ -343,20 +343,18 @@ impl View for ActivityIndicator { .contained() .with_margin_right(style.icon_spacing) .aligned() - .named("activity-icon") + .into_named_element("activity-icon") })) .with_child( Text::new(message, style.message.clone()) .with_soft_wrap(false) - .aligned() - .boxed(), + .aligned(), ) .constrained() .with_height(style.height) .contained() .with_style(style.container) .aligned() - .boxed() }); if let Some(action) = action { @@ -367,7 +365,7 @@ impl View for ActivityIndicator { }); } - element.boxed() + element.into_element() } } diff --git a/crates/auto_update/src/update_notification.rs b/crates/auto_update/src/update_notification.rs index 6ba87a68b9..173406f645 100644 --- a/crates/auto_update/src/update_notification.rs +++ b/crates/auto_update/src/update_notification.rs @@ -46,8 +46,7 @@ impl View for UpdateNotification { .aligned() .top() .left() - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_child( MouseEventHandler::::new(0, cx, |state, _| { @@ -62,7 +61,6 @@ impl View for UpdateNotification { .constrained() .with_width(style.button_width) .with_height(style.button_width) - .boxed() }) .with_padding(Padding::uniform(5.)) .on_click(MouseButton::Left, move |_, _, cx| { @@ -73,26 +71,22 @@ impl View for UpdateNotification { .with_height(cx.font_cache().line_height(theme.message.text.font_size)) .aligned() .top() - .flex_float() - .boxed(), - ) - .boxed(), + .flex_float(), + ), ) .with_child({ let style = theme.action_message.style_for(state, false); Text::new("View the release notes", style.text.clone()) .contained() .with_style(style.container) - .boxed() }) .contained() - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, |_, _, cx| { cx.dispatch_action(ViewReleaseNotes) }) - .boxed() + .into_named_element("update notification") } } diff --git a/crates/breadcrumbs/src/breadcrumbs.rs b/crates/breadcrumbs/src/breadcrumbs.rs index ff4443a570..8f03914c3d 100644 --- a/crates/breadcrumbs/src/breadcrumbs.rs +++ b/crates/breadcrumbs/src/breadcrumbs.rs @@ -44,7 +44,7 @@ impl View for Breadcrumbs { fn render(&mut self, cx: &mut ViewContext) -> Element { let active_item = match &self.active_item { Some(active_item) => active_item, - None => return Empty::new().boxed(), + None => return Empty::new().into_element(), }; let not_editor = active_item.downcast::().is_none(); @@ -53,24 +53,21 @@ impl View for Breadcrumbs { let breadcrumbs = match active_item.breadcrumbs(&theme, cx) { Some(breadcrumbs) => breadcrumbs, - None => return Empty::new().boxed(), + None => return Empty::new().into_element(), } .into_iter() .map(|breadcrumb| { - let text = Text::new( + Text::new( breadcrumb.text, theme.workspace.breadcrumbs.default.text.clone(), - ); - if let Some(highlights) = breadcrumb.highlights { - text.with_highlights(highlights).boxed() - } else { - text.boxed() - } + ) + .with_highlights(breadcrumb.highlights.unwrap_or_default()) + .into_element() }); let crumbs = Flex::row() .with_children(Itertools::intersperse_with(breadcrumbs, || { - Label::new(" 〉 ", style.default.text.clone()).boxed() + Label::new(" 〉 ", style.default.text.clone()).into_element() })) .constrained() .with_height(theme.workspace.breadcrumb_height) @@ -81,12 +78,12 @@ impl View for Breadcrumbs { .with_style(style.default.container) .aligned() .left() - .boxed(); + .into_element(); } MouseEventHandler::::new(0, cx, |state, _| { let style = style.style_for(state, false); - crumbs.with_style(style.container).boxed() + crumbs.with_style(style.container) }) .on_click(MouseButton::Left, |_, _, cx| { cx.dispatch_action(outline::Toggle); @@ -100,7 +97,7 @@ impl View for Breadcrumbs { ) .aligned() .left() - .boxed() + .into_element() } } diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 4c177f0f00..577415ffea 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -72,7 +72,7 @@ impl View for CollabTitlebarItem { let workspace = if let Some(workspace) = self.workspace.upgrade(cx) { workspace } else { - return Empty::new().boxed(); + return Empty::new().into_element(); }; let project = workspace.read(cx).project().read(cx); @@ -97,8 +97,7 @@ impl View for CollabTitlebarItem { .contained() .with_margin_right(theme.workspace.titlebar.item_spacing) .aligned() - .left() - .boxed(), + .left(), ); let user = workspace.read(cx).user_store().read(cx).current_user(); @@ -128,9 +127,9 @@ impl View for CollabTitlebarItem { } Stack::new() - .with_child(left_container.boxed()) - .with_child(right_container.aligned().right().boxed()) - .boxed() + .with_child(left_container) + .with_child(right_container.aligned().right()) + .into_element() } } @@ -294,13 +293,13 @@ impl CollabTitlebarItem { Color::transparent_black(), ) })) - .with_child( - Label::new(user.github_login.clone(), item_style.label.clone()) - .boxed(), - ) + .with_child(Label::new( + user.github_login.clone(), + item_style.label.clone(), + )) .contained() .with_style(item_style.container) - .boxed() + .into_element() })), ContextMenuItem::item("Sign out", SignOut), ContextMenuItem::item("Send Feedback", feedback::feedback_editor::GiveFeedback), @@ -345,8 +344,7 @@ impl CollabTitlebarItem { .contained() .with_margin_left(titlebar.toggle_contacts_button.default.icon_width) .with_margin_top(titlebar.toggle_contacts_button.default.icon_width) - .aligned() - .boxed(), + .aligned(), ) }; @@ -366,7 +364,6 @@ impl CollabTitlebarItem { .with_height(style.button_width) .contained() .with_style(style.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { @@ -378,12 +375,11 @@ impl CollabTitlebarItem { Some(Box::new(ToggleContactsMenu)), theme.tooltip.clone(), cx, - ) - .boxed(), + ), ) .with_children(badge) .with_children(self.render_contacts_popover_host(titlebar, cx)) - .boxed() + .into_element() } fn render_toggle_screen_sharing_button( @@ -415,7 +411,6 @@ impl CollabTitlebarItem { .with_height(style.button_width) .contained() .with_style(style.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { @@ -429,7 +424,7 @@ impl CollabTitlebarItem { cx, ) .aligned() - .boxed() + .into_element() } fn render_in_call_share_unshare_button( @@ -463,7 +458,6 @@ impl CollabTitlebarItem { Label::new(label, style.text.clone()) .contained() .with_style(style.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { @@ -479,13 +473,12 @@ impl CollabTitlebarItem { None, theme.tooltip.clone(), cx, - ) - .boxed(), + ), ) .aligned() .contained() .with_margin_left(theme.workspace.titlebar.item_spacing) - .boxed(), + .into_element(), ) } @@ -506,7 +499,6 @@ impl CollabTitlebarItem { .with_height(style.button_width) .contained() .with_style(style.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { @@ -520,17 +512,15 @@ impl CollabTitlebarItem { cx, ) .contained() - .with_margin_left(theme.workspace.titlebar.item_spacing) - .boxed(), + .with_margin_left(theme.workspace.titlebar.item_spacing), ) .with_child( ChildView::new(&self.user_menu, cx) .aligned() .bottom() - .right() - .boxed(), + .right(), ) - .boxed() + .into_element() } fn render_sign_in_button(&self, theme: &Theme, cx: &mut ViewContext) -> Element { @@ -540,13 +530,12 @@ impl CollabTitlebarItem { Label::new("Sign In", style.text.clone()) .contained() .with_style(style.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { cx.dispatch_action(SignIn); }) - .boxed() + .into_element() } fn render_contacts_popover_host<'a>( @@ -555,14 +544,14 @@ impl CollabTitlebarItem { cx: &'a ViewContext, ) -> Option> { self.contacts_popover.as_ref().map(|popover| { - Overlay::new(ChildView::new(popover, cx).boxed()) + Overlay::new(ChildView::new(popover, cx)) .with_fit_mode(OverlayFitMode::SwitchAnchor) .with_anchor_corner(AnchorCorner::TopRight) .with_z_index(999) .aligned() .bottom() .right() - .boxed() + .into_element() }) } @@ -572,7 +561,7 @@ impl CollabTitlebarItem { theme: &Theme, room: &ModelHandle, cx: &mut ViewContext, - ) -> Vec> { + ) -> Vec> { let mut participants = room .read(cx) .remote_participants() @@ -600,8 +589,7 @@ impl CollabTitlebarItem { theme, cx, )) - .with_margin_right(theme.workspace.titlebar.face_pile_spacing) - .boxed(), + .with_margin_right(theme.workspace.titlebar.face_pile_spacing), ) }) .collect() @@ -626,7 +614,7 @@ impl CollabTitlebarItem { cx, )) .with_margin_right(theme.workspace.titlebar.item_spacing) - .boxed() + .into_element() } fn render_face_pile( @@ -730,7 +718,7 @@ impl CollabTitlebarItem { } } - container.boxed() + container })) .with_children((|| { let replica_id = replica_id?; @@ -741,11 +729,10 @@ impl CollabTitlebarItem { .with_width(theme.workspace.titlebar.avatar_ribbon.width) .with_height(theme.workspace.titlebar.avatar_ribbon.height) .aligned() - .bottom() - .boxed(), + .bottom(), ) })()) - .boxed(); + .into_element(); if let Some(location) = location { if let Some(replica_id) = replica_id { @@ -769,7 +756,7 @@ impl CollabTitlebarItem { theme.tooltip.clone(), cx, ) - .boxed(); + .into_element(); } else if let ParticipantLocation::SharedProject { project_id } = location { let user_id = user.id; content = MouseEventHandler::::new( @@ -791,7 +778,7 @@ impl CollabTitlebarItem { theme.tooltip.clone(), cx, ) - .boxed(); + .into_element(); } } content @@ -831,7 +818,7 @@ impl CollabTitlebarItem { .with_width(avatar_style.outer_width) .with_height(avatar_style.outer_width) .aligned() - .boxed() + .into_element() } fn render_connection_status( @@ -848,20 +835,14 @@ impl CollabTitlebarItem { | client::Status::Reauthenticating { .. } | client::Status::Reconnecting { .. } | client::Status::ReconnectionError { .. } => Some( - Container::new( - Align::new( - ConstrainedBox::new( - Svg::new("icons/cloud_slash_12.svg") - .with_color(theme.workspace.titlebar.offline_icon.color) - .boxed(), - ) - .with_width(theme.workspace.titlebar.offline_icon.width) - .boxed(), - ) - .boxed(), - ) - .with_style(theme.workspace.titlebar.offline_icon.container) - .boxed(), + Svg::new("icons/cloud_slash_12.svg") + .with_color(theme.workspace.titlebar.offline_icon.color) + .constrained() + .with_width(theme.workspace.titlebar.offline_icon.width) + .aligned() + .contained() + .with_style(theme.workspace.titlebar.offline_icon.container) + .into_element(), ), client::Status::UpgradeRequired => Some( MouseEventHandler::::new(0, cx, |_, _| { @@ -872,13 +853,12 @@ impl CollabTitlebarItem { .contained() .with_style(theme.workspace.titlebar.outdated_warning.container) .aligned() - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, |_, _, cx| { cx.dispatch_action(auto_update::Check); }) - .boxed(), + .into_element(), ), _ => None, } diff --git a/crates/collab_ui/src/collaborator_list_popover.rs b/crates/collab_ui/src/collaborator_list_popover.rs index 32df35c1fa..5cd935b9f5 100644 --- a/crates/collab_ui/src/collaborator_list_popover.rs +++ b/crates/collab_ui/src/collaborator_list_popover.rs @@ -40,12 +40,11 @@ impl View for CollaboratorListPopover { .constrained() .with_width(theme.contacts_popover.width) .with_height(theme.contacts_popover.height) - .boxed() }) .on_down_out(MouseButton::Left, move |_, _, cx| { cx.dispatch_action(ToggleCollaboratorList); }) - .boxed() + .into_element() } fn focus_out(&mut self, _: gpui::AnyViewHandle, cx: &mut ViewContext) { @@ -129,7 +128,7 @@ fn render_collaborator_list_entry( let username = MouseEventHandler::::new(index, cx, |_, _| { - Label::new(username.to_owned(), username_theme.clone()).boxed() + Label::new(username.to_owned(), username_theme.clone()) }) .on_click(MouseButton::Left, move |_, _, cx| { if let Some(username_action) = username_action.clone() { @@ -147,17 +146,16 @@ fn render_collaborator_list_entry( tooltip_theme.clone(), cx, ) - .boxed() + .into_element() } else { - username.boxed() + username.into_element() }) .with_child( - MouseEventHandler::::new(index, cx, |_, _| icon.boxed()) + MouseEventHandler::::new(index, cx, |_, _| icon) .on_click(MouseButton::Left, move |_, _, cx| { cx.dispatch_action(icon_action.clone()) }) - .with_tooltip::(index, icon_tooltip, None, tooltip_theme, cx) - .boxed(), + .with_tooltip::(index, icon_tooltip, None, tooltip_theme, cx), ) - .boxed() + .into_element() } diff --git a/crates/collab_ui/src/contact_finder.rs b/crates/collab_ui/src/contact_finder.rs index 0d4e3aff3d..5545770560 100644 --- a/crates/collab_ui/src/contact_finder.rs +++ b/crates/collab_ui/src/contact_finder.rs @@ -124,15 +124,13 @@ impl PickerDelegate for ContactFinderDelegate { .with_style(theme.contact_finder.contact_avatar) .aligned() .left() - .boxed() })) .with_child( Label::new(user.github_login.clone(), style.label.clone()) .contained() .with_style(theme.contact_finder.contact_username) .aligned() - .left() - .boxed(), + .left(), ) .with_children(icon_path.map(|icon_path| { Svg::new(icon_path) @@ -147,12 +145,11 @@ impl PickerDelegate for ContactFinderDelegate { .with_height(button_style.button_width) .aligned() .flex_float() - .boxed() })) .contained() .with_style(style.container) .constrained() .with_height(theme.contact_finder.row_height) - .boxed() + .into_element() } } diff --git a/crates/collab_ui/src/contact_list.rs b/crates/collab_ui/src/contact_list.rs index 76538b6a7e..8f32abcc74 100644 --- a/crates/collab_ui/src/contact_list.rs +++ b/crates/collab_ui/src/contact_list.rs @@ -755,7 +755,6 @@ impl ContactList { .with_style(theme.contact_avatar) .aligned() .left() - .boxed() })) .with_child( Label::new( @@ -766,16 +765,14 @@ impl ContactList { .with_style(theme.contact_username.container) .aligned() .left() - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_children(if is_pending { Some( Label::new("Calling", theme.calling_indicator.text.clone()) .contained() .with_style(theme.calling_indicator.container) - .aligned() - .boxed(), + .aligned(), ) } else { None @@ -788,7 +785,7 @@ impl ContactList { .contact_row .style_for(&mut Default::default(), is_selected), ) - .boxed() + .into_element() } fn render_participant_project( @@ -826,41 +823,37 @@ impl ContactList { Flex::row() .with_child( Stack::new() - .with_child( - Canvas::new(move |scene, bounds, _, _, _| { - let start_x = bounds.min_x() + (bounds.width() / 2.) - - (tree_branch.width / 2.); - let end_x = bounds.max_x(); - let start_y = bounds.min_y(); - let end_y = bounds.min_y() + baseline_offset - (cap_height / 2.); + .with_child(Canvas::new(move |scene, bounds, _, _, _| { + let start_x = + bounds.min_x() + (bounds.width() / 2.) - (tree_branch.width / 2.); + let end_x = bounds.max_x(); + let start_y = bounds.min_y(); + let end_y = bounds.min_y() + baseline_offset - (cap_height / 2.); - scene.push_quad(gpui::Quad { - bounds: RectF::from_points( - vec2f(start_x, start_y), - vec2f( - start_x + tree_branch.width, - if is_last { end_y } else { bounds.max_y() }, - ), + scene.push_quad(gpui::Quad { + bounds: RectF::from_points( + vec2f(start_x, start_y), + vec2f( + start_x + tree_branch.width, + if is_last { end_y } else { bounds.max_y() }, ), - background: Some(tree_branch.color), - border: gpui::Border::default(), - corner_radius: 0., - }); - scene.push_quad(gpui::Quad { - bounds: RectF::from_points( - vec2f(start_x, end_y), - vec2f(end_x, end_y + tree_branch.width), - ), - background: Some(tree_branch.color), - border: gpui::Border::default(), - corner_radius: 0., - }); - }) - .boxed(), - ) + ), + background: Some(tree_branch.color), + border: gpui::Border::default(), + corner_radius: 0., + }); + scene.push_quad(gpui::Quad { + bounds: RectF::from_points( + vec2f(start_x, end_y), + vec2f(end_x, end_y + tree_branch.width), + ), + background: Some(tree_branch.color), + border: gpui::Border::default(), + corner_radius: 0., + }); + })) .constrained() - .with_width(host_avatar_height) - .boxed(), + .with_width(host_avatar_height), ) .with_child( Label::new(project_name, row.name.text.clone()) @@ -868,14 +861,12 @@ impl ContactList { .left() .contained() .with_style(row.name.container) - .flex(1., false) - .boxed(), + .flex(1., false), ) .constrained() .with_height(theme.row_height) .contained() .with_style(row.container) - .boxed() }) .with_cursor_style(if !is_current { CursorStyle::PointingHand @@ -890,7 +881,7 @@ impl ContactList { }); } }) - .boxed() + .into_element() } fn render_participant_screen( @@ -923,42 +914,37 @@ impl ContactList { Flex::row() .with_child( Stack::new() - .with_child( - Canvas::new(move |scene, bounds, _, _, _| { - let start_x = bounds.min_x() + (bounds.width() / 2.) - - (tree_branch.width / 2.); - let end_x = bounds.max_x(); - let start_y = bounds.min_y(); - let end_y = - bounds.min_y() + baseline_offset - (cap_height / 2.); + .with_child(Canvas::new(move |scene, bounds, _, _, _| { + let start_x = bounds.min_x() + (bounds.width() / 2.) + - (tree_branch.width / 2.); + let end_x = bounds.max_x(); + let start_y = bounds.min_y(); + let end_y = bounds.min_y() + baseline_offset - (cap_height / 2.); - scene.push_quad(gpui::Quad { - bounds: RectF::from_points( - vec2f(start_x, start_y), - vec2f( - start_x + tree_branch.width, - if is_last { end_y } else { bounds.max_y() }, - ), + scene.push_quad(gpui::Quad { + bounds: RectF::from_points( + vec2f(start_x, start_y), + vec2f( + start_x + tree_branch.width, + if is_last { end_y } else { bounds.max_y() }, ), - background: Some(tree_branch.color), - border: gpui::Border::default(), - corner_radius: 0., - }); - scene.push_quad(gpui::Quad { - bounds: RectF::from_points( - vec2f(start_x, end_y), - vec2f(end_x, end_y + tree_branch.width), - ), - background: Some(tree_branch.color), - border: gpui::Border::default(), - corner_radius: 0., - }); - }) - .boxed(), - ) + ), + background: Some(tree_branch.color), + border: gpui::Border::default(), + corner_radius: 0., + }); + scene.push_quad(gpui::Quad { + bounds: RectF::from_points( + vec2f(start_x, end_y), + vec2f(end_x, end_y + tree_branch.width), + ), + background: Some(tree_branch.color), + border: gpui::Border::default(), + corner_radius: 0., + }); + })) .constrained() - .with_width(host_avatar_height) - .boxed(), + .with_width(host_avatar_height), ) .with_child( Svg::new("icons/disable_screen_sharing_12.svg") @@ -968,8 +954,7 @@ impl ContactList { .aligned() .left() .contained() - .with_style(row.icon.container) - .boxed(), + .with_style(row.icon.container), ) .with_child( Label::new("Screen", row.name.text.clone()) @@ -977,21 +962,19 @@ impl ContactList { .left() .contained() .with_style(row.name.container) - .flex(1., false) - .boxed(), + .flex(1., false), ) .constrained() .with_height(theme.row_height) .contained() .with_style(row.container) - .boxed() }, ) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { cx.dispatch_action(OpenSharedScreen { peer_id }); }) - .boxed() + .into_element() } fn render_header( @@ -1020,11 +1003,9 @@ impl ContactList { Label::new("Leave Call", style.text.clone()) .contained() .with_style(style.container) - .boxed() }) .on_click(MouseButton::Left, |_, _, cx| cx.dispatch_action(LeaveCall)) - .aligned() - .boxed(), + .aligned(), ) } else { None @@ -1045,8 +1026,7 @@ impl ContactList { .with_max_height(icon_size) .aligned() .constrained() - .with_width(icon_size) - .boxed(), + .with_width(icon_size), ) .with_child( Label::new(text, header_style.text.clone()) @@ -1054,21 +1034,19 @@ impl ContactList { .left() .contained() .with_margin_left(theme.contact_username.container.margin.left) - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_children(leave_call) .constrained() .with_height(theme.row_height) .contained() .with_style(header_style.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { cx.dispatch_action(ToggleExpanded(section)) }) - .boxed() + .into_element() } fn render_contact( @@ -1084,7 +1062,7 @@ impl ContactList { let user_id = contact.user.id; let github_login = contact.user.github_login.clone(); let initial_project = project.clone(); - let mut element = + let mut event_handler = MouseEventHandler::::new(contact.user.id as usize, cx, |_, cx| { Flex::row() .with_children(contact.user.avatar.clone().map(|avatar| { @@ -1098,8 +1076,7 @@ impl ContactList { } else { theme.contact_status_free }) - .aligned() - .boxed(), + .aligned(), ) } else { None @@ -1109,11 +1086,9 @@ impl ContactList { Image::from_data(avatar) .with_style(theme.contact_avatar) .aligned() - .left() - .boxed(), + .left(), ) .with_children(status_badge) - .boxed() })) .with_child( Label::new( @@ -1124,8 +1099,7 @@ impl ContactList { .with_style(theme.contact_username.container) .aligned() .left() - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_child( MouseEventHandler::::new( @@ -1137,7 +1111,6 @@ impl ContactList { render_icon_button(button_style, "icons/x_mark_8.svg") .aligned() .flex_float() - .boxed() }, ) .with_padding(Padding::uniform(2.)) @@ -1148,16 +1121,14 @@ impl ContactList { github_login: github_login.clone(), }) }) - .flex_float() - .boxed(), + .flex_float(), ) .with_children(if calling { Some( Label::new("Calling", theme.calling_indicator.text.clone()) .contained() .with_style(theme.calling_indicator.container) - .aligned() - .boxed(), + .aligned(), ) } else { None @@ -1170,7 +1141,6 @@ impl ContactList { .contact_row .style_for(&mut Default::default(), is_selected), ) - .boxed() }) .on_click(MouseButton::Left, move |_, _, cx| { if online && !busy { @@ -1182,10 +1152,10 @@ impl ContactList { }); if online { - element = element.with_cursor_style(CursorStyle::PointingHand); + event_handler = event_handler.with_cursor_style(CursorStyle::PointingHand); } - element.boxed() + event_handler.into_element() } fn render_contact_request( @@ -1206,7 +1176,6 @@ impl ContactList { .with_style(theme.contact_avatar) .aligned() .left() - .boxed() })) .with_child( Label::new( @@ -1217,8 +1186,7 @@ impl ContactList { .with_style(theme.contact_username.container) .aligned() .left() - .flex(1., true) - .boxed(), + .flex(1., true), ); let user_id = user.id; @@ -1227,16 +1195,14 @@ impl ContactList { let button_spacing = theme.contact_button_spacing; if is_incoming { - row.add_children([ + row.add_child( MouseEventHandler::::new(user.id as usize, cx, |mouse_state, _| { let button_style = if is_contact_request_pending { &theme.disabled_button } else { theme.contact_button.style_for(mouse_state, false) }; - render_icon_button(button_style, "icons/x_mark_8.svg") - .aligned() - .boxed() + render_icon_button(button_style, "icons/x_mark_8.svg").aligned() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { @@ -1246,8 +1212,10 @@ impl ContactList { }) }) .contained() - .with_margin_right(button_spacing) - .boxed(), + .with_margin_right(button_spacing), + ); + + row.add_child( MouseEventHandler::::new(user.id as usize, cx, |mouse_state, _| { let button_style = if is_contact_request_pending { &theme.disabled_button @@ -1257,7 +1225,6 @@ impl ContactList { render_icon_button(button_style, "icons/check_8.svg") .aligned() .flex_float() - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { @@ -1265,9 +1232,8 @@ impl ContactList { user_id, accept: true, }) - }) - .boxed(), - ]); + }), + ); } else { row.add_child( MouseEventHandler::::new(user.id as usize, cx, |mouse_state, _| { @@ -1279,7 +1245,6 @@ impl ContactList { render_icon_button(button_style, "icons/x_mark_8.svg") .aligned() .flex_float() - .boxed() }) .with_padding(Padding::uniform(2.)) .with_cursor_style(CursorStyle::PointingHand) @@ -1289,8 +1254,7 @@ impl ContactList { github_login: github_login.clone(), }) }) - .flex_float() - .boxed(), + .flex_float(), ); } @@ -1302,7 +1266,7 @@ impl ContactList { .contact_row .style_for(&mut Default::default(), is_selected), ) - .boxed() + .into_element() } fn call(&mut self, action: &Call, cx: &mut ViewContext) { @@ -1342,8 +1306,7 @@ impl View for ContactList { ChildView::new(&self.filter_editor, cx) .contained() .with_style(theme.contact_list.user_query_editor.container) - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_child( MouseEventHandler::::new(0, cx, |_, _| { @@ -1351,7 +1314,6 @@ impl View for ContactList { &theme.contact_list.add_contact_button, "icons/user_plus_16.svg", ) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, |_, _, cx| { @@ -1363,15 +1325,13 @@ impl View for ContactList { None, theme.tooltip.clone(), cx, - ) - .boxed(), + ), ) .constrained() - .with_height(theme.contact_list.user_query_editor_height) - .boxed(), + .with_height(theme.contact_list.user_query_editor_height), ) - .with_child(List::new(self.list_state.clone()).flex(1., false).boxed()) - .boxed() + .with_child(List::new(self.list_state.clone()).flex(1., false)) + .into_element() } fn focus_in(&mut self, _: gpui::AnyViewHandle, cx: &mut ViewContext) { diff --git a/crates/collab_ui/src/contacts_popover.rs b/crates/collab_ui/src/contacts_popover.rs index 6cfe173a8d..15ceb26fbe 100644 --- a/crates/collab_ui/src/contacts_popover.rs +++ b/crates/collab_ui/src/contacts_popover.rs @@ -105,18 +105,17 @@ impl View for ContactsPopover { MouseEventHandler::::new(0, cx, |_, _| { Flex::column() - .with_child(child.flex(1., true).boxed()) + .with_child(child.flex(1., true)) .contained() .with_style(theme.contacts_popover.container) .constrained() .with_width(theme.contacts_popover.width) .with_height(theme.contacts_popover.height) - .boxed() }) .on_down_out(MouseButton::Left, move |_, _, cx| { cx.dispatch_action(ToggleContactsMenu); }) - .boxed() + .into_element() } fn focus_in(&mut self, _: gpui::AnyViewHandle, cx: &mut ViewContext) { diff --git a/crates/collab_ui/src/incoming_call_notification.rs b/crates/collab_ui/src/incoming_call_notification.rs index 02767daf95..e0799626d8 100644 --- a/crates/collab_ui/src/incoming_call_notification.rs +++ b/crates/collab_ui/src/incoming_call_notification.rs @@ -112,7 +112,6 @@ impl IncomingCallNotification { Image::from_data(avatar) .with_style(theme.caller_avatar) .aligned() - .boxed() })) .with_child( Flex::column() @@ -122,8 +121,7 @@ impl IncomingCallNotification { theme.caller_username.text.clone(), ) .contained() - .with_style(theme.caller_username.container) - .boxed(), + .with_style(theme.caller_username.container), ) .with_child( Label::new( @@ -138,8 +136,7 @@ impl IncomingCallNotification { theme.caller_message.text.clone(), ) .contained() - .with_style(theme.caller_message.container) - .boxed(), + .with_style(theme.caller_message.container), ) .with_children(if initial_project.worktree_root_names.is_empty() { None @@ -150,19 +147,17 @@ impl IncomingCallNotification { theme.worktree_roots.text.clone(), ) .contained() - .with_style(theme.worktree_roots.container) - .boxed(), + .with_style(theme.worktree_roots.container), ) }) .contained() .with_style(theme.caller_metadata) - .aligned() - .boxed(), + .aligned(), ) .contained() .with_style(theme.caller_container) .flex(1., true) - .boxed() + .into_element() } fn render_buttons(&self, cx: &mut ViewContext) -> Element { @@ -177,14 +172,12 @@ impl IncomingCallNotification { .aligned() .contained() .with_style(theme.accept_button.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, |_, _, cx| { cx.dispatch_action(RespondToCall { accept: true }); }) - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_child( MouseEventHandler::::new(0, cx, |_, cx| { @@ -193,14 +186,12 @@ impl IncomingCallNotification { .aligned() .contained() .with_style(theme.decline_button.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, |_, _, cx| { cx.dispatch_action(RespondToCall { accept: false }); }) - .flex(1., true) - .boxed(), + .flex(1., true), ) .constrained() .with_width( @@ -209,7 +200,7 @@ impl IncomingCallNotification { .incoming_call_notification .button_width, ) - .boxed() + .into_element() } } @@ -235,6 +226,6 @@ impl View for IncomingCallNotification { .contained() .with_background_color(background) .expanded() - .boxed() + .into_element() } } diff --git a/crates/collab_ui/src/notifications.rs b/crates/collab_ui/src/notifications.rs index e57c3bf793..c3facc8b39 100644 --- a/crates/collab_ui/src/notifications.rs +++ b/crates/collab_ui/src/notifications.rs @@ -35,7 +35,6 @@ pub fn render_user_notification( ) .aligned() .top() - .boxed() })) .with_child( Text::new( @@ -47,8 +46,7 @@ pub fn render_user_notification( .aligned() .top() .left() - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_child( MouseEventHandler::::new(user.id as usize, cx, |state, _| { @@ -63,7 +61,6 @@ pub fn render_user_notification( .constrained() .with_width(style.button_width) .with_height(style.button_width) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .with_padding(Padding::uniform(5.)) @@ -78,16 +75,14 @@ pub fn render_user_notification( ) .aligned() .top() - .flex_float() - .boxed(), + .flex_float(), ) - .named("contact notification header"), + .into_named_element("contact notification header"), ) .with_children(body.map(|body| { Label::new(body, theme.body_message.text.clone()) .contained() .with_style(theme.body_message.container) - .boxed() })) .with_children(if buttons.is_empty() { None @@ -101,20 +96,17 @@ pub fn render_user_notification( Label::new(message, button.text.clone()) .contained() .with_style(button.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { cx.dispatch_any_action(action.boxed_clone()) }) - .boxed() }, )) .aligned() - .right() - .boxed(), + .right(), ) }) .contained() - .boxed() + .into_element() } diff --git a/crates/collab_ui/src/project_shared_notification.rs b/crates/collab_ui/src/project_shared_notification.rs index 1389441d15..3600de2b14 100644 --- a/crates/collab_ui/src/project_shared_notification.rs +++ b/crates/collab_ui/src/project_shared_notification.rs @@ -109,7 +109,6 @@ impl ProjectSharedNotification { Image::from_data(avatar) .with_style(theme.owner_avatar) .aligned() - .boxed() })) .with_child( Flex::column() @@ -119,8 +118,7 @@ impl ProjectSharedNotification { theme.owner_username.text.clone(), ) .contained() - .with_style(theme.owner_username.container) - .boxed(), + .with_style(theme.owner_username.container), ) .with_child( Label::new( @@ -135,8 +133,7 @@ impl ProjectSharedNotification { theme.message.text.clone(), ) .contained() - .with_style(theme.message.container) - .boxed(), + .with_style(theme.message.container), ) .with_children(if self.worktree_root_names.is_empty() { None @@ -147,19 +144,17 @@ impl ProjectSharedNotification { theme.worktree_roots.text.clone(), ) .contained() - .with_style(theme.worktree_roots.container) - .boxed(), + .with_style(theme.worktree_roots.container), ) }) .contained() .with_style(theme.owner_metadata) - .aligned() - .boxed(), + .aligned(), ) .contained() .with_style(theme.owner_container) .flex(1., true) - .boxed() + .into_element() } fn render_buttons(&self, cx: &mut ViewContext) -> Element { @@ -177,7 +172,6 @@ impl ProjectSharedNotification { .aligned() .contained() .with_style(theme.open_button.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { @@ -186,8 +180,7 @@ impl ProjectSharedNotification { follow_user_id: owner_user_id, }); }) - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_child( MouseEventHandler::::new(0, cx, |_, cx| { @@ -196,14 +189,12 @@ impl ProjectSharedNotification { .aligned() .contained() .with_style(theme.dismiss_button.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, |_, _, cx| { cx.dispatch_action(DismissProject); }) - .flex(1., true) - .boxed(), + .flex(1., true), ) .constrained() .with_width( @@ -212,7 +203,7 @@ impl ProjectSharedNotification { .project_shared_notification .button_width, ) - .boxed() + .into_element() } } @@ -237,6 +228,6 @@ impl View for ProjectSharedNotification { .contained() .with_background_color(background) .expanded() - .boxed() + .into_element() } } diff --git a/crates/collab_ui/src/sharing_status_indicator.rs b/crates/collab_ui/src/sharing_status_indicator.rs index 8881801993..df67286a8c 100644 --- a/crates/collab_ui/src/sharing_status_indicator.rs +++ b/crates/collab_ui/src/sharing_status_indicator.rs @@ -52,11 +52,10 @@ impl View for SharingStatusIndicator { .constrained() .with_width(18.) .aligned() - .boxed() }) .on_click(MouseButton::Left, |_, _, cx| { cx.dispatch_action(ToggleScreenSharing); }) - .boxed() + .into_element() } } diff --git a/crates/command_palette/src/command_palette.rs b/crates/command_palette/src/command_palette.rs index f903d9e493..c7e3acd6a8 100644 --- a/crates/command_palette/src/command_palette.rs +++ b/crates/command_palette/src/command_palette.rs @@ -188,8 +188,7 @@ impl PickerDelegate for CommandPaletteDelegate { Flex::row() .with_child( Label::new(mat.string.clone(), style.label.clone()) - .with_highlights(mat.positions.clone()) - .boxed(), + .with_highlights(mat.positions.clone()), ) .with_children(command.keystrokes.iter().map(|keystroke| { Flex::row() @@ -206,8 +205,7 @@ impl PickerDelegate for CommandPaletteDelegate { Some( Label::new(label, key_style.label.clone()) .contained() - .with_style(key_style.container) - .boxed(), + .with_style(key_style.container), ) } else { None @@ -217,17 +215,15 @@ impl PickerDelegate for CommandPaletteDelegate { .with_child( Label::new(keystroke.key.clone(), key_style.label.clone()) .contained() - .with_style(key_style.container) - .boxed(), + .with_style(key_style.container), ) .contained() .with_margin_left(keystroke_spacing) .flex_float() - .boxed() })) .contained() .with_style(style.container) - .boxed() + .into_element() } } diff --git a/crates/context_menu/src/context_menu.rs b/crates/context_menu/src/context_menu.rs index a7a006bc77..7db1500208 100644 --- a/crates/context_menu/src/context_menu.rs +++ b/crates/context_menu/src/context_menu.rs @@ -144,21 +144,20 @@ impl View for ContextMenu { fn render(&mut self, cx: &mut ViewContext) -> Element { if !self.visible { - return Empty::new().boxed(); + return Empty::new().into_element(); } // Render the menu once at minimum width. - let mut collapsed_menu = self.render_menu_for_measurement(cx).boxed(); - let expanded_menu = self - .render_menu(cx) - .constrained() - .dynamically(move |constraint, view, cx| { - SizeConstraint::strict_along( - Axis::Horizontal, - collapsed_menu.layout(constraint, view, cx).x(), - ) - }) - .boxed(); + let mut collapsed_menu = self.render_menu_for_measurement(cx); + let expanded_menu = + self.render_menu(cx) + .constrained() + .dynamically(move |constraint, view, cx| { + SizeConstraint::strict_along( + Axis::Horizontal, + collapsed_menu.layout(constraint, view, cx).0.x(), + ) + }); Overlay::new(expanded_menu) .with_hoverable(true) @@ -166,7 +165,7 @@ impl View for ContextMenu { .with_anchor_position(self.anchor_position) .with_anchor_corner(self.anchor_corner) .with_position_mode(self.position_mode) - .boxed() + .into_element() } fn focus_out(&mut self, _: AnyViewHandle, cx: &mut ViewContext) { @@ -335,40 +334,38 @@ impl ContextMenu { let style = cx.global::().theme.context_menu.clone(); Flex::row() .with_child( - Flex::column() - .with_children(self.items.iter().enumerate().map(|(ix, item)| { - match item { - ContextMenuItem::Item { label, .. } => { - let style = style.item.style_for( - &mut Default::default(), - Some(ix) == self.selected_index, - ); + Flex::column().with_children(self.items.iter().enumerate().map(|(ix, item)| { + match item { + ContextMenuItem::Item { label, .. } => { + let style = style.item.style_for( + &mut Default::default(), + Some(ix) == self.selected_index, + ); - match label { - ContextMenuItemLabel::String(label) => { - Label::new(label.to_string(), style.label.clone()) - .contained() - .with_style(style.container) - .boxed() - } - ContextMenuItemLabel::Element(element) => { - element(&mut Default::default(), style) - } + match label { + ContextMenuItemLabel::String(label) => { + Label::new(label.to_string(), style.label.clone()) + .contained() + .with_style(style.container) + .into_element() + } + ContextMenuItemLabel::Element(element) => { + element(&mut Default::default(), style) } } - - ContextMenuItem::Static(f) => f(cx), - - ContextMenuItem::Separator => Empty::new() - .collapsed() - .contained() - .with_style(style.separator) - .constrained() - .with_height(1.) - .boxed(), } - })) - .boxed(), + + ContextMenuItem::Static(f) => f(cx), + + ContextMenuItem::Separator => Empty::new() + .collapsed() + .contained() + .with_style(style.separator) + .constrained() + .with_height(1.) + .into_element(), + } + })), ) .with_child( Flex::column() @@ -394,10 +391,10 @@ impl ContextMenu { style.keystroke.container, style.keystroke.text.clone(), ) - .boxed() + .into_element() } - ContextMenuItem::Static(_) => Empty::new().boxed(), + ContextMenuItem::Static(_) => Empty::new().into_element(), ContextMenuItem::Separator => Empty::new() .collapsed() @@ -405,12 +402,11 @@ impl ContextMenu { .with_height(1.) .contained() .with_style(style.separator) - .boxed(), + .into_element(), } })) .contained() - .with_margin_left(style.keystroke_margin) - .boxed(), + .with_margin_left(style.keystroke_margin), ) .contained() .with_style(style.container) @@ -445,7 +441,7 @@ impl ContextMenu { ContextMenuItemLabel::String(label) => { Label::new(label.clone(), style.label.clone()) .contained() - .boxed() + .into_element() } ContextMenuItemLabel::Element(element) => { element(state, style) @@ -459,11 +455,9 @@ impl ContextMenu { style.keystroke.text.clone(), ) .flex_float() - .boxed() }) .contained() .with_style(style.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_up(MouseButton::Left, |_, _, _| {}) // Capture these events @@ -474,7 +468,7 @@ impl ContextMenu { cx.dispatch_any_action_at(window_id, view_id, action.boxed_clone()); }) .on_drag(MouseButton::Left, |_, _, _| {}) - .boxed() + .into_element() } ContextMenuItem::Static(f) => f(cx), @@ -484,12 +478,11 @@ impl ContextMenu { .with_height(1.) .contained() .with_style(style.separator) - .boxed(), + .into_element(), } })) .contained() .with_style(style.container) - .boxed() }) .on_down_out(MouseButton::Left, |_, _, cx| cx.dispatch_action(Cancel)) .on_down_out(MouseButton::Right, |_, _, cx| cx.dispatch_action(Cancel)) diff --git a/crates/copilot/src/sign_in.rs b/crates/copilot/src/sign_in.rs index 4f807f8e9b..1ad407912e 100644 --- a/crates/copilot/src/sign_in.rs +++ b/crates/copilot/src/sign_in.rs @@ -119,7 +119,7 @@ impl CopilotCodeVerification { data: &PromptUserDeviceFlow, style: &theme::Copilot, cx: &mut ViewContext, - ) -> Element { + ) -> impl Drawable { let copied = cx .read_from_clipboard() .map(|item| item.text() == &data.user_code) @@ -129,14 +129,15 @@ impl CopilotCodeVerification { MouseEventHandler::::new(0, cx, |state, _cx| { Flex::row() - .with_children([ + .with_child( Label::new(data.user_code.clone(), device_code_style.text.clone()) .aligned() .contained() .with_style(device_code_style.left_container) .constrained() - .with_width(device_code_style.left) - .boxed(), + .with_width(device_code_style.left), + ) + .with_child( Label::new( if copied { "Copied!" } else { "Copy" }, device_code_style.cta.style_for(state, false).text.clone(), @@ -145,12 +146,10 @@ impl CopilotCodeVerification { .contained() .with_style(*device_code_style.right_container.style_for(state, false)) .constrained() - .with_width(device_code_style.right) - .boxed(), - ]) + .with_width(device_code_style.right), + ) .contained() .with_style(device_code_style.cta.style_for(state, false).container) - .boxed() }) .on_click(gpui::platform::MouseButton::Left, { let user_code = data.user_code.clone(); @@ -161,7 +160,6 @@ impl CopilotCodeVerification { } }) .with_cursor_style(gpui::platform::CursorStyle::PointingHand) - .boxed() } fn render_prompting_modal( @@ -173,113 +171,105 @@ impl CopilotCodeVerification { enum ConnectButton {} Flex::column() - .with_children([ + .with_child( Flex::column() .with_children([ Label::new( "Enable Copilot by connecting", style.auth.prompting.subheading.text.clone(), ) - .aligned() - .boxed(), + .aligned(), Label::new( "your existing license.", style.auth.prompting.subheading.text.clone(), ) - .aligned() - .boxed(), + .aligned(), ]) .align_children_center() .contained() - .with_style(style.auth.prompting.subheading.container) - .boxed(), - Self::render_device_code(data, &style, cx), + .with_style(style.auth.prompting.subheading.container), + ) + .with_child(Self::render_device_code(data, &style, cx)) + .with_child( Flex::column() .with_children([ Label::new( "Paste this code into GitHub after", style.auth.prompting.hint.text.clone(), ) - .aligned() - .boxed(), + .aligned(), Label::new( "clicking the button below.", style.auth.prompting.hint.text.clone(), ) - .aligned() - .boxed(), + .aligned(), ]) .align_children_center() .contained() - .with_style(style.auth.prompting.hint.container.clone()) - .boxed(), - theme::ui::cta_button_with_click::( - if connect_clicked { - "Waiting for connection..." - } else { - "Connect to GitHub" - }, - style.auth.content_width, - &style.auth.cta_button, - cx, - { - let verification_uri = data.verification_uri.clone(); - move |_, _, cx| { - cx.platform().open_url(&verification_uri); - cx.dispatch_action(ClickedConnect) - } - }, - ) - .boxed(), - ]) + .with_style(style.auth.prompting.hint.container.clone()), + ) + .with_child(theme::ui::cta_button_with_click::( + if connect_clicked { + "Waiting for connection..." + } else { + "Connect to GitHub" + }, + style.auth.content_width, + &style.auth.cta_button, + cx, + { + let verification_uri = data.verification_uri.clone(); + move |_, _, cx| { + cx.platform().open_url(&verification_uri); + cx.dispatch_action(ClickedConnect) + } + }, + )) .align_children_center() - .boxed() + .into_element() } + fn render_enabled_modal(style: &theme::Copilot, cx: &mut ViewContext) -> Element { enum DoneButton {} let enabled_style = &style.auth.authorized; Flex::column() - .with_children([ + .with_child( Label::new("Copilot Enabled!", enabled_style.subheading.text.clone()) .contained() .with_style(enabled_style.subheading.container) - .aligned() - .boxed(), + .aligned(), + ) + .with_child( Flex::column() .with_children([ Label::new( "You can update your settings or", enabled_style.hint.text.clone(), ) - .aligned() - .boxed(), + .aligned(), Label::new( "sign out from the Copilot menu in", enabled_style.hint.text.clone(), ) - .aligned() - .boxed(), - Label::new("the status bar.", enabled_style.hint.text.clone()) - .aligned() - .boxed(), + .aligned(), + Label::new("the status bar.", enabled_style.hint.text.clone()).aligned(), ]) .align_children_center() .contained() - .with_style(enabled_style.hint.container) - .boxed(), - theme::ui::cta_button_with_click::( - "Done", - style.auth.content_width, - &style.auth.cta_button, - cx, - |_, _, cx| cx.remove_window(), - ) - .boxed(), - ]) + .with_style(enabled_style.hint.container), + ) + .with_child(theme::ui::cta_button_with_click::( + "Done", + style.auth.content_width, + &style.auth.cta_button, + cx, + |_, _, cx| cx.remove_window(), + )) .align_children_center() - .boxed() + .into_element() } + fn render_unauthorized_modal( style: &theme::Copilot, cx: &mut ViewContext, @@ -287,59 +277,54 @@ impl CopilotCodeVerification { let unauthorized_style = &style.auth.not_authorized; Flex::column() - .with_children([ + .with_child( Flex::column() .with_children([ Label::new( "Enable Copilot by connecting", unauthorized_style.subheading.text.clone(), ) - .aligned() - .boxed(), + .aligned(), Label::new( "your existing license.", unauthorized_style.subheading.text.clone(), ) - .aligned() - .boxed(), + .aligned(), ]) .align_children_center() .contained() - .with_style(unauthorized_style.subheading.container) - .boxed(), + .with_style(unauthorized_style.subheading.container), + ) + .with_child( Flex::column() .with_children([ Label::new( "You must have an active copilot", unauthorized_style.warning.text.clone(), ) - .aligned() - .boxed(), + .aligned(), Label::new( "license to use it in Zed.", unauthorized_style.warning.text.clone(), ) - .aligned() - .boxed(), + .aligned(), ]) .align_children_center() .contained() - .with_style(unauthorized_style.warning.container) - .boxed(), - theme::ui::cta_button_with_click::( - "Subscribe on GitHub", - style.auth.content_width, - &style.auth.cta_button, - cx, - |_, _, cx| { - cx.remove_window(); - cx.platform().open_url(COPILOT_SIGN_UP_URL) - }, - ) - .boxed(), - ]) + .with_style(unauthorized_style.warning.container), + ) + .with_child(theme::ui::cta_button_with_click::( + "Subscribe on GitHub", + style.auth.content_width, + &style.auth.cta_button, + cx, + |_, _, cx| { + cx.remove_window(); + cx.platform().open_url(COPILOT_SIGN_UP_URL) + }, + )) .align_children_center() - .boxed() + .into_element() } } @@ -365,32 +350,37 @@ impl View for CopilotCodeVerification { let style = cx.global::().theme.clone(); - modal::("Connect Copilot to Zed", &style.copilot.modal, cx, |cx| { - Flex::column() - .with_children([ - theme::ui::icon(&style.copilot.auth.header).boxed(), - match &self.status { - Status::SigningIn { - prompt: Some(prompt), - } => Self::render_prompting_modal( - self.connect_clicked, - &prompt, - &style.copilot, - cx, - ), - Status::Unauthorized => { - self.connect_clicked = false; - Self::render_unauthorized_modal(&style.copilot, cx) - } - Status::Authorized => { - self.connect_clicked = false; - Self::render_enabled_modal(&style.copilot, cx) - } - _ => Empty::new().boxed(), - }, - ]) - .align_children_center() - .boxed() - }) + modal::( + "Connect Copilot to Zed", + &style.copilot.modal, + cx, + |cx| { + Flex::column() + .with_children([ + theme::ui::icon(&style.copilot.auth.header).into_element(), + match &self.status { + Status::SigningIn { + prompt: Some(prompt), + } => Self::render_prompting_modal( + self.connect_clicked, + &prompt, + &style.copilot, + cx, + ), + Status::Unauthorized => { + self.connect_clicked = false; + Self::render_unauthorized_modal(&style.copilot, cx) + } + Status::Authorized => { + self.connect_clicked = false; + Self::render_enabled_modal(&style.copilot, cx) + } + _ => Empty::new().into_element(), + }, + ]) + .align_children_center() + }, + ) + .into_element() } } diff --git a/crates/copilot_button/src/copilot_button.rs b/crates/copilot_button/src/copilot_button.rs index a3560ab5a1..a838766233 100644 --- a/crates/copilot_button/src/copilot_button.rs +++ b/crates/copilot_button/src/copilot_button.rs @@ -159,13 +159,13 @@ impl View for CopilotButton { let settings = cx.global::(); if !settings.features.copilot { - return Empty::new().boxed(); + return Empty::new().into_element(); } let theme = settings.theme.clone(); let active = self.popup_menu.read(cx).visible(); let Some(copilot) = Copilot::global(cx) else { - return Empty::new().boxed(); + return Empty::new().into_element(); }; let status = copilot.read(cx).status(); @@ -205,13 +205,12 @@ impl View for CopilotButton { .constrained() .with_width(style.icon_size) .aligned() - .named("copilot-icon"), + .into_named_element("copilot-icon"), ) .constrained() .with_height(style.icon_size) .contained() .with_style(style.container) - .boxed() } }) .with_cursor_style(CursorStyle::PointingHand) @@ -228,17 +227,16 @@ impl View for CopilotButton { _ => cx.dispatch_action(DeployCopilotStartMenu), } }) - .with_tooltip::(0, "GitHub Copilot".into(), None, theme.tooltip.clone(), cx) - .boxed(), + .with_tooltip::( + 0, + "GitHub Copilot".into(), + None, + theme.tooltip.clone(), + cx, + ), ) - .with_child( - ChildView::new(&self.popup_menu, cx) - .aligned() - .top() - .right() - .boxed(), - ) - .boxed() + .with_child(ChildView::new(&self.popup_menu, cx).aligned().top().right()) + .into_element() } } @@ -322,12 +320,10 @@ impl CopilotButton { Box::new( move |state: &mut MouseState, style: &theme::ContextMenuItem| { Flex::row() - .with_children([ - Label::new("Copilot Settings", style.label.clone()).boxed(), - theme::ui::icon(icon_style.style_for(state, false)).boxed(), - ]) + .with_child(Label::new("Copilot Settings", style.label.clone())) + .with_child(theme::ui::icon(icon_style.style_for(state, false))) .align_children_center() - .boxed() + .into_element() }, ), OsOpen::new(COPILOT_SETTINGS_URL), diff --git a/crates/diagnostics/src/diagnostics.rs b/crates/diagnostics/src/diagnostics.rs index 94a3c36847..f637880d52 100644 --- a/crates/diagnostics/src/diagnostics.rs +++ b/crates/diagnostics/src/diagnostics.rs @@ -96,9 +96,9 @@ impl View for ProjectDiagnosticsEditor { .aligned() .contained() .with_style(theme.container) - .boxed() + .into_element() } else { - ChildView::new(&self.editor, cx).boxed() + ChildView::new(&self.editor, cx).into_element() } } @@ -694,8 +694,7 @@ fn diagnostic_header_renderer(diagnostic: Diagnostic) -> RenderBlock { icon.constrained() .with_width(icon_width) .aligned() - .contained() - .boxed(), + .contained(), ) .with_child( Label::new( @@ -706,22 +705,20 @@ fn diagnostic_header_renderer(diagnostic: Diagnostic) -> RenderBlock { .contained() .with_style(style.message.container) .with_margin_left(cx.gutter_padding) - .aligned() - .boxed(), + .aligned(), ) .with_children(diagnostic.code.clone().map(|code| { Label::new(code, style.code.text.clone().with_font_size(font_size)) .contained() .with_style(style.code.container) .aligned() - .boxed() })) .contained() .with_style(style.container) .with_padding_left(cx.gutter_padding) .with_padding_right(cx.gutter_padding) .expanded() - .named("diagnostic header") + .into_named_element("diagnostic header") }) } @@ -731,21 +728,22 @@ pub(crate) fn render_summary( theme: &theme::ProjectDiagnostics, ) -> Element { if summary.error_count == 0 && summary.warning_count == 0 { - Label::new("No problems", text_style.clone()).boxed() + Label::new("No problems", text_style.clone()).into_element() } else { let icon_width = theme.tab_icon_width; let icon_spacing = theme.tab_icon_spacing; let summary_spacing = theme.tab_summary_spacing; Flex::row() - .with_children([ + .with_child( Svg::new("icons/circle_x_mark_12.svg") .with_color(text_style.color) .constrained() .with_width(icon_width) .aligned() .contained() - .with_margin_right(icon_spacing) - .named("no-icon"), + .with_margin_right(icon_spacing), + ) + .with_child( Label::new( summary.error_count.to_string(), LabelStyle { @@ -753,8 +751,9 @@ pub(crate) fn render_summary( highlight_text: None, }, ) - .aligned() - .boxed(), + .aligned(), + ) + .with_child( Svg::new("icons/triangle_exclamation_12.svg") .with_color(text_style.color) .constrained() @@ -762,8 +761,9 @@ pub(crate) fn render_summary( .aligned() .contained() .with_margin_left(summary_spacing) - .with_margin_right(icon_spacing) - .named("warn-icon"), + .with_margin_right(icon_spacing), + ) + .with_child( Label::new( summary.warning_count.to_string(), LabelStyle { @@ -771,10 +771,9 @@ pub(crate) fn render_summary( highlight_text: None, }, ) - .aligned() - .boxed(), - ]) - .boxed() + .aligned(), + ) + .into_element() } } diff --git a/crates/diagnostics/src/items.rs b/crates/diagnostics/src/items.rs index 333f5c843e..6febb447e6 100644 --- a/crates/diagnostics/src/items.rs +++ b/crates/diagnostics/src/items.rs @@ -103,23 +103,23 @@ impl View for DiagnosticIndicator { let mut summary_row = Flex::row(); if self.summary.error_count > 0 { - summary_row.add_children([ + summary_row.add_child( Svg::new("icons/circle_x_mark_16.svg") .with_color(style.icon_color_error) .constrained() .with_width(style.icon_width) .aligned() .contained() - .with_margin_right(style.icon_spacing) - .named("error-icon"), + .with_margin_right(style.icon_spacing), + ); + summary_row.add_child( Label::new(self.summary.error_count.to_string(), style.text.clone()) - .aligned() - .boxed(), - ]); + .aligned(), + ); } if self.summary.warning_count > 0 { - summary_row.add_children([ + summary_row.add_child( Svg::new("icons/triangle_exclamation_16.svg") .with_color(style.icon_color_warning) .constrained() @@ -131,12 +131,12 @@ impl View for DiagnosticIndicator { style.summary_spacing } else { 0. - }) - .named("warning-icon"), + }), + ); + summary_row.add_child( Label::new(self.summary.warning_count.to_string(), style.text.clone()) - .aligned() - .boxed(), - ]); + .aligned(), + ); } if self.summary.error_count == 0 && self.summary.warning_count == 0 { @@ -146,7 +146,7 @@ impl View for DiagnosticIndicator { .constrained() .with_width(style.icon_width) .aligned() - .named("ok-icon"), + .into_named_element("ok-icon"), ); } @@ -161,7 +161,6 @@ impl View for DiagnosticIndicator { } else { style.container_ok }) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, |_, _, cx| { @@ -175,7 +174,7 @@ impl View for DiagnosticIndicator { cx, ) .aligned() - .boxed(), + .into_element(), ); let style = &cx.global::().theme.workspace.status_bar; @@ -186,8 +185,7 @@ impl View for DiagnosticIndicator { Label::new("Checking…", style.diagnostic_message.default.text.clone()) .aligned() .contained() - .with_margin_left(item_spacing) - .boxed(), + .with_margin_left(item_spacing), ); } else if let Some(diagnostic) = &self.current_diagnostic { let message_style = style.diagnostic_message.clone(); @@ -200,17 +198,15 @@ impl View for DiagnosticIndicator { .aligned() .contained() .with_margin_left(item_spacing) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, |_, _, cx| { cx.dispatch_action(GoToDiagnostic) - }) - .boxed(), + }), ); } - element.named("diagnostic indicator") + element.into_named_element("diagnostic indicator") } fn debug_json(&self, _: &gpui::AppContext) -> serde_json::Value { diff --git a/crates/drag_and_drop/src/drag_and_drop.rs b/crates/drag_and_drop/src/drag_and_drop.rs index c6837eb559..8eb0fab15b 100644 --- a/crates/drag_and_drop/src/drag_and_drop.rs +++ b/crates/drag_and_drop/src/drag_and_drop.rs @@ -227,21 +227,16 @@ impl DragAndDrop { .with_hoverable(false) .constrained() .with_width(region.width()) - .with_height(region.height()) - .boxed(), + .with_height(region.height()), ) .with_anchor_position(position) - .boxed(), + .into_element(), ) } State::Canceled => Some( MouseEventHandler::::new(0, cx, |_, _| { - Empty::new() - .constrained() - .with_width(0.) - .with_height(0.) - .boxed() + Empty::new().constrained().with_width(0.).with_height(0.) }) .on_up(MouseButton::Left, |_, _, cx| { cx.window_context().defer(|cx| { @@ -257,7 +252,7 @@ impl DragAndDrop { }); }); }) - .boxed(), + .into_element(), ), } }) diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index 5bbd0a478a..01df7bb2bd 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -973,7 +973,7 @@ pub mod tests { position, height, disposition, - render: Arc::new(|_| Empty::new().boxed()), + render: Arc::new(|_| Empty::new().into_element()), } }) .collect::>(); diff --git a/crates/editor/src/display_map/block_map.rs b/crates/editor/src/display_map/block_map.rs index f5d2c83a8f..9fe78c1081 100644 --- a/crates/editor/src/display_map/block_map.rs +++ b/crates/editor/src/display_map/block_map.rs @@ -1045,21 +1045,21 @@ mod tests { position: buffer_snapshot.anchor_after(Point::new(1, 0)), height: 1, disposition: BlockDisposition::Above, - render: Arc::new(|_| Empty::new().named("block 1")), + render: Arc::new(|_| Empty::new().into_named_element("block 1")), }, BlockProperties { style: BlockStyle::Fixed, position: buffer_snapshot.anchor_after(Point::new(1, 2)), height: 2, disposition: BlockDisposition::Above, - render: Arc::new(|_| Empty::new().named("block 2")), + render: Arc::new(|_| Empty::new().into_named_element("block 2")), }, BlockProperties { style: BlockStyle::Fixed, position: buffer_snapshot.anchor_after(Point::new(3, 3)), height: 3, disposition: BlockDisposition::Below, - render: Arc::new(|_| Empty::new().named("block 3")), + render: Arc::new(|_| Empty::new().into_named_element("block 3")), }, ]); @@ -1219,14 +1219,14 @@ mod tests { style: BlockStyle::Fixed, position: buffer_snapshot.anchor_after(Point::new(1, 12)), disposition: BlockDisposition::Above, - render: Arc::new(|_| Empty::new().named("block 1")), + render: Arc::new(|_| Empty::new().into_named_element("block 1")), height: 1, }, BlockProperties { style: BlockStyle::Fixed, position: buffer_snapshot.anchor_after(Point::new(1, 1)), disposition: BlockDisposition::Below, - render: Arc::new(|_| Empty::new().named("block 2")), + render: Arc::new(|_| Empty::new().into_named_element("block 2")), height: 1, }, ]); @@ -1329,7 +1329,7 @@ mod tests { position, height, disposition, - render: Arc::new(|_| Empty::new().boxed()), + render: Arc::new(|_| Empty::new().into_element()), } }) .collect::>(); diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 4f88e91375..c2c1b23dc1 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -819,7 +819,6 @@ impl CompletionsMenu { )) .contained() .with_style(item_style) - .boxed() }, ) .with_cursor_style(CursorStyle::PointingHand) @@ -828,7 +827,7 @@ impl CompletionsMenu { item_ix: Some(item_ix), }); }) - .boxed(), + .into_element(), ); } }, @@ -848,7 +847,7 @@ impl CompletionsMenu { ) .contained() .with_style(container_style) - .boxed() + .into_element() } pub async fn filter(&mut self, query: Option<&str>, executor: Arc) { @@ -982,7 +981,6 @@ impl CodeActionsMenu { .with_soft_wrap(false) .contained() .with_style(item_style) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_down(MouseButton::Left, move |_, _, cx| { @@ -990,7 +988,7 @@ impl CodeActionsMenu { item_ix: Some(item_ix), }); }) - .boxed(), + .into_element(), ); } }, @@ -1004,7 +1002,7 @@ impl CodeActionsMenu { ) .contained() .with_style(container_style) - .boxed(); + .into_element(); if self.deployed_from_indicator { *cursor_position.column_mut() = 0; @@ -3138,7 +3136,6 @@ impl Editor { MouseEventHandler::::new(0, cx, |state, _| { Svg::new("icons/bolt_8.svg") .with_color(style.code_actions.indicator.style_for(state, active).color) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .with_padding(Padding::uniform(3.)) @@ -3147,7 +3144,7 @@ impl Editor { deployed_from_indicator: true, }); }) - .boxed(), + .into_element(), ) } else { None @@ -3177,7 +3174,7 @@ impl Editor { MouseEventHandler::::new( ix as usize, cx, - |mouse_state, _| -> Element { + |mouse_state, _| { Svg::new(match fold_status { FoldStatus::Folded => style.folded_icon.clone(), FoldStatus::Foldable => style.foldable_icon.clone(), @@ -3198,7 +3195,6 @@ impl Editor { .with_height(line_height) .with_width(gutter_margin) .aligned() - .boxed() }, ) .with_cursor_style(CursorStyle::PointingHand) @@ -3211,7 +3207,7 @@ impl Editor { }); } }) - .boxed() + .into_element() }) }) .flatten() @@ -5893,7 +5889,7 @@ impl Editor { ChildView::new(&editor, cx) .contained() .with_padding_left(cx.anchor_x) - .boxed() + .into_element() } }), disposition: BlockDisposition::Below, @@ -7022,9 +7018,9 @@ impl View for Editor { } Stack::new() - .with_child(EditorElement::new(style.clone()).boxed()) - .with_child(ChildView::new(&self.mouse_context_menu, cx).boxed()) - .boxed() + .with_child(EditorElement::new(style.clone())) + .with_child(ChildView::new(&self.mouse_context_menu, cx)) + .into_element() } fn ui_name() -> &'static str { @@ -7497,11 +7493,10 @@ pub fn diagnostic_block_renderer(diagnostic: Diagnostic, is_valid: bool) -> Rend .with_highlights(highlights.clone()) .contained() .with_margin_left(cx.anchor_x) - .boxed() })) .aligned() .left() - .boxed() + .into_element() }) } diff --git a/crates/editor/src/editor_tests.rs b/crates/editor/src/editor_tests.rs index 3b3a0df59b..e6d0b5e3f2 100644 --- a/crates/editor/src/editor_tests.rs +++ b/crates/editor/src/editor_tests.rs @@ -2299,7 +2299,7 @@ fn test_move_line_up_down_with_blocks(cx: &mut TestAppContext) { position: snapshot.anchor_after(Point::new(2, 0)), disposition: BlockDisposition::Below, height: 1, - render: Arc::new(|_| Empty::new().boxed()), + render: Arc::new(|_| Empty::new().into_element()), }], cx, ); @@ -4411,7 +4411,7 @@ async fn test_strip_whitespace_and_format_via_lsp(cx: &mut gpui::TestAppContext) cx.set_state( &[ "one ", // - "twoˇ", // + "twoˇ", // "three ", // "four", // ] @@ -4486,7 +4486,7 @@ async fn test_strip_whitespace_and_format_via_lsp(cx: &mut gpui::TestAppContext) &[ "one", // "", // - "twoˇ", // + "twoˇ", // "", // "three", // "four", // @@ -4501,7 +4501,7 @@ async fn test_strip_whitespace_and_format_via_lsp(cx: &mut gpui::TestAppContext) cx.assert_editor_state( &[ "one ", // - "twoˇ", // + "twoˇ", // "three ", // "four", // ] diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index c0c459351a..c44d6808dc 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1447,7 +1447,6 @@ impl EditorElement { .constrained() .with_width(style.button_width) .with_height(style.button_width) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { @@ -1462,7 +1461,6 @@ impl EditorElement { ) .aligned() .flex_float() - .boxed() }); if *starts_new_buffer { @@ -1488,15 +1486,13 @@ impl EditorElement { ) .contained() .with_style(style.filename.container) - .aligned() - .boxed(), + .aligned(), ) .with_children(parent_path.map(|path| { Label::new(path, style.path.text.clone().with_font_size(font_size)) .contained() .with_style(style.path.container) .aligned() - .boxed() })) .with_children(jump_icon) .contained() @@ -1504,17 +1500,17 @@ impl EditorElement { .with_padding_left(gutter_padding) .with_padding_right(gutter_padding) .expanded() - .named("path header block") + .into_named_element("path header block") } else { let text_style = self.style.text.clone(); Flex::row() - .with_child(Label::new("⋯", text_style).boxed()) + .with_child(Label::new("⋯", text_style)) .with_children(jump_icon) .contained() .with_padding_left(gutter_padding) .with_padding_right(gutter_padding) .expanded() - .named("collapsed context") + .into_named_element("collapsed context") } } }; @@ -2535,7 +2531,7 @@ mod tests { disposition: BlockDisposition::Above, height: 3, position: Anchor::min(), - render: Arc::new(|_| Empty::new().boxed()), + render: Arc::new(|_| Empty::new().into_element()), }], cx, ); diff --git a/crates/editor/src/hover_popover.rs b/crates/editor/src/hover_popover.rs index 037b43a00d..b1e6f26000 100644 --- a/crates/editor/src/hover_popover.rs +++ b/crates/editor/src/hover_popover.rs @@ -344,7 +344,7 @@ impl InfoPopover { }) .collect(), ) - .boxed() + .into_element() } else { let mut text_style = style.hover_popover.prose.clone(); text_style.font_size = style.text.font_size; @@ -353,12 +353,10 @@ impl InfoPopover { .with_soft_wrap(true) .contained() .with_style(style.hover_popover.block_style) - .boxed() + .into_element() } })); - flex.contained() - .with_style(style.hover_popover.container) - .boxed() + flex.contained().with_style(style.hover_popover.container) }) .on_move(|_, _, _| {}) // Consume move events so they don't reach regions underneath. .with_cursor_style(CursorStyle::Arrow) @@ -367,7 +365,7 @@ impl InfoPopover { top: HOVER_POPOVER_GAP, ..Default::default() }) - .boxed() + .into_element() } } @@ -399,7 +397,6 @@ impl DiagnosticPopover { .with_soft_wrap(true) .contained() .with_style(container_style) - .boxed() }) .with_padding(Padding { top: HOVER_POPOVER_GAP, @@ -418,7 +415,7 @@ impl DiagnosticPopover { tooltip_style, cx, ) - .boxed() + .into_element() } pub fn activation_info(&self) -> (usize, Anchor) { diff --git a/crates/editor/src/items.rs b/crates/editor/src/items.rs index 69c211a070..cd3a41a515 100644 --- a/crates/editor/src/items.rs +++ b/crates/editor/src/items.rs @@ -565,11 +565,7 @@ impl Item for Editor { cx: &AppContext, ) -> Element { Flex::row() - .with_child( - Label::new(self.title(cx).to_string(), style.label.clone()) - .aligned() - .boxed(), - ) + .with_child(Label::new(self.title(cx).to_string(), style.label.clone()).aligned()) .with_children(detail.and_then(|detail| { let path = path_for_buffer(&self.buffer, detail, false, cx)?; let description = path.to_string_lossy(); @@ -580,11 +576,10 @@ impl Item for Editor { ) .contained() .with_style(style.description.container) - .aligned() - .boxed(), + .aligned(), ) })) - .boxed() + .into_element() } fn for_each_project_item(&self, cx: &AppContext, f: &mut dyn FnMut(usize, &dyn project::Item)) { @@ -1120,9 +1115,9 @@ impl View for CursorPosition { if self.selected_count > 0 { write!(text, " ({} selected)", self.selected_count).unwrap(); } - Label::new(text, theme.cursor_position.clone()).boxed() + Label::new(text, theme.cursor_position.clone()).into_element() } else { - Empty::new().boxed() + Empty::new().into_element() } } } diff --git a/crates/feedback/src/deploy_feedback_button.rs b/crates/feedback/src/deploy_feedback_button.rs index 9280b63d97..e3256b5cbe 100644 --- a/crates/feedback/src/deploy_feedback_button.rs +++ b/crates/feedback/src/deploy_feedback_button.rs @@ -50,7 +50,6 @@ impl View for DeployFeedbackButton { .with_height(style.icon_size) .contained() .with_style(style.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { @@ -64,10 +63,9 @@ impl View for DeployFeedbackButton { Some(Box::new(GiveFeedback)), theme.tooltip.clone(), cx, - ) - .boxed(), + ), ) - .boxed() + .into_element() } } diff --git a/crates/feedback/src/feedback_editor.rs b/crates/feedback/src/feedback_editor.rs index 3a0123eb48..0466402ad9 100644 --- a/crates/feedback/src/feedback_editor.rs +++ b/crates/feedback/src/feedback_editor.rs @@ -231,7 +231,7 @@ impl View for FeedbackEditor { } fn render(&mut self, cx: &mut ViewContext) -> Element { - ChildView::new(&self.editor, cx).boxed() + ChildView::new(&self.editor, cx).into_element() } fn focus_in(&mut self, _: AnyViewHandle, cx: &mut ViewContext) { @@ -264,16 +264,14 @@ impl Item for FeedbackEditor { .with_width(style.type_icon_width) .aligned() .contained() - .with_margin_right(style.spacing) - .boxed(), + .with_margin_right(style.spacing), ) .with_child( Label::new("Send Feedback", style.label.clone()) .aligned() - .contained() - .boxed(), + .contained(), ) - .boxed() + .into_element() } fn for_each_project_item(&self, cx: &AppContext, f: &mut dyn FnMut(usize, &dyn project::Item)) { diff --git a/crates/feedback/src/feedback_info_text.rs b/crates/feedback/src/feedback_info_text.rs index 4952cb5b43..1d86435351 100644 --- a/crates/feedback/src/feedback_info_text.rs +++ b/crates/feedback/src/feedback_info_text.rs @@ -39,8 +39,7 @@ impl View for FeedbackInfoText { theme.feedback.info_text_default.text.clone(), ) .with_soft_wrap(false) - .aligned() - .boxed(), + .aligned(), ) .with_child( MouseEventHandler::::new(0, cx, |state, _| { @@ -55,24 +54,21 @@ impl View for FeedbackInfoText { .aligned() .left() .clipped() - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, |_, _, cx| { cx.dispatch_action(OpenZedCommunityRepo) - }) - .boxed(), + }), ) .with_child( Text::new(" on GitHub.", theme.feedback.info_text_default.text.clone()) .with_soft_wrap(false) - .aligned() - .boxed(), + .aligned(), ) .aligned() .left() .clipped() - .boxed() + .into_element() } } diff --git a/crates/feedback/src/submit_feedback_button.rs b/crates/feedback/src/submit_feedback_button.rs index 5ea79c075a..642befebb7 100644 --- a/crates/feedback/src/submit_feedback_button.rs +++ b/crates/feedback/src/submit_feedback_button.rs @@ -37,7 +37,6 @@ impl View for SubmitFeedbackButton { Label::new("Submit as Markdown", style.text.clone()) .contained() .with_style(style.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, |_, _, cx| { @@ -53,7 +52,7 @@ impl View for SubmitFeedbackButton { theme.tooltip.clone(), cx, ) - .boxed() + .into_element() } } diff --git a/crates/file_finder/src/file_finder.rs b/crates/file_finder/src/file_finder.rs index 4a5c733a2b..1b1eb3090f 100644 --- a/crates/file_finder/src/file_finder.rs +++ b/crates/file_finder/src/file_finder.rs @@ -254,19 +254,15 @@ impl PickerDelegate for FileFinderDelegate { self.labels_for_match(path_match); Flex::column() .with_child( - Label::new(file_name, style.label.clone()) - .with_highlights(file_name_positions) - .boxed(), + Label::new(file_name, style.label.clone()).with_highlights(file_name_positions), ) .with_child( - Label::new(full_path, style.label.clone()) - .with_highlights(full_path_positions) - .boxed(), + Label::new(full_path, style.label.clone()).with_highlights(full_path_positions), ) .flex(1., false) .contained() .with_style(style.container) - .named("match") + .into_named_element("match") } } diff --git a/crates/go_to_line/src/go_to_line.rs b/crates/go_to_line/src/go_to_line.rs index 2827adb91f..76fe0f94c8 100644 --- a/crates/go_to_line/src/go_to_line.rs +++ b/crates/go_to_line/src/go_to_line.rs @@ -153,26 +153,22 @@ impl View for GoToLine { self.max_point.row + 1 ); - ConstrainedBox::new( - Container::new( - Flex::new(Axis::Vertical) - .with_child( - Container::new(ChildView::new(&self.line_editor, cx).boxed()) - .with_style(theme.input_editor.container) - .boxed(), - ) - .with_child( - Container::new(Label::new(label, theme.no_matches.label.clone()).boxed()) - .with_style(theme.no_matches.container) - .boxed(), - ) - .boxed(), + Flex::new(Axis::Vertical) + .with_child( + ChildView::new(&self.line_editor, cx) + .contained() + .with_style(theme.input_editor.container), ) + .with_child( + Label::new(label, theme.no_matches.label.clone()) + .contained() + .with_style(theme.no_matches.container), + ) + .contained() .with_style(theme.container) - .boxed(), - ) - .with_max_width(500.0) - .named("go to line") + .constrained() + .with_max_width(500.0) + .into_named_element("go to line") } fn focus_in(&mut self, _: AnyViewHandle, cx: &mut ViewContext) { diff --git a/crates/gpui/examples/text.rs b/crates/gpui/examples/text.rs index 2dd96ec286..4450c3e4d5 100644 --- a/crates/gpui/examples/text.rs +++ b/crates/gpui/examples/text.rs @@ -31,7 +31,7 @@ impl gpui::View for TextView { } fn render(&mut self, _: &mut gpui::ViewContext) -> Element { - TextElement.boxed() + TextElement.into_element() } } diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 762837c478..db3fa42491 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -4685,7 +4685,7 @@ mod tests { impl super::View for View { fn render(&mut self, _: &mut ViewContext) -> Element { post_inc(&mut self.render_count); - Empty::new().boxed() + Empty::new().into_element() } fn ui_name() -> &'static str { @@ -4737,7 +4737,7 @@ mod tests { impl super::View for View { fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } fn ui_name() -> &'static str { @@ -4809,11 +4809,11 @@ mod tests { fn render(&mut self, cx: &mut ViewContext) -> Element { enum Handler {} let mouse_down_count = self.mouse_down_count.clone(); - MouseEventHandler::::new(0, cx, |_, _| Empty::new().boxed()) + MouseEventHandler::::new(0, cx, |_, _| Empty::new()) .on_down(MouseButton::Left, move |_, _, _| { mouse_down_count.fetch_add(1, SeqCst); }) - .boxed() + .into_element() } fn ui_name() -> &'static str { @@ -4873,7 +4873,7 @@ mod tests { } fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } } @@ -5391,7 +5391,7 @@ mod tests { impl super::View for View { fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } fn ui_name() -> &'static str { @@ -5458,7 +5458,7 @@ mod tests { impl super::View for View { fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } fn ui_name() -> &'static str { @@ -5639,7 +5639,7 @@ mod tests { impl View for ViewA { fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } fn ui_name() -> &'static str { @@ -5657,7 +5657,7 @@ mod tests { impl View for ViewB { fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } fn ui_name() -> &'static str { @@ -5805,7 +5805,7 @@ mod tests { impl super::View for View { fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } fn ui_name() -> &'static str { @@ -5932,7 +5932,7 @@ mod tests { impl super::View for View1 { fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } fn ui_name() -> &'static str { "View1" @@ -5940,7 +5940,7 @@ mod tests { } impl super::View for View2 { fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } fn ui_name() -> &'static str { "View2" @@ -6110,7 +6110,7 @@ mod tests { } fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } } @@ -6172,7 +6172,7 @@ mod tests { } fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().named(format!("render count: {}", post_inc(&mut self.0))) + Empty::new().into_named_element(format!("render count: {}", post_inc(&mut self.0))) } } @@ -6261,7 +6261,7 @@ mod tests { } fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } } @@ -6342,7 +6342,7 @@ mod tests { fn render(&mut self, _: &mut ViewContext) -> Element { self.rendered.set(true); - Empty::new().boxed() + Empty::new().into_element() } } @@ -6367,9 +6367,9 @@ mod tests { fn render(&mut self, cx: &mut ViewContext) -> Element { if let Some(child) = self.child.as_ref() { - ChildView::new(child, cx).boxed() + ChildView::new(child, cx).into_element() } else { - Empty::new().boxed() + Empty::new().into_element() } } } @@ -6408,7 +6408,7 @@ mod tests { } fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } } } diff --git a/crates/gpui/src/elements.rs b/crates/gpui/src/elements.rs index de2f7e5a6b..6247722d98 100644 --- a/crates/gpui/src/elements.rs +++ b/crates/gpui/src/elements.rs @@ -47,7 +47,7 @@ use std::{ }; use util::ResultExt; -pub trait Drawable { +pub trait Drawable: 'static { type LayoutState; type PaintState; @@ -92,7 +92,7 @@ pub trait Drawable { cx: &ViewContext, ) -> serde_json::Value; - fn boxed(self) -> Element + fn into_element(self) -> Element where Self: 'static + Sized, { @@ -103,17 +103,7 @@ pub trait Drawable { } } - fn into_root(self, cx: &ViewContext) -> RootElement - where - Self: 'static + Sized, - { - RootElement { - element: self.boxed(), - view: cx.handle().downgrade(), - } - } - - fn named(self, name: impl Into>) -> Element + fn into_named_element(self, name: impl Into>) -> Element where Self: 'static + Sized, { @@ -124,53 +114,63 @@ pub trait Drawable { } } + fn into_root_element(self, cx: &ViewContext) -> RootElement + where + Self: 'static + Sized, + { + RootElement { + element: self.into_element(), + view: cx.handle().downgrade(), + } + } + fn constrained(self) -> ConstrainedBox where Self: 'static + Sized, { - ConstrainedBox::new(self.boxed()) + ConstrainedBox::new(self.into_element()) } fn aligned(self) -> Align where Self: 'static + Sized, { - Align::new(self.boxed()) + Align::new(self.into_element()) } fn clipped(self) -> Clipped where Self: 'static + Sized, { - Clipped::new(self.boxed()) + Clipped::new(self.into_element()) } fn contained(self) -> Container where Self: 'static + Sized, { - Container::new(self.boxed()) + Container::new(self.into_element()) } fn expanded(self) -> Expanded where Self: 'static + Sized, { - Expanded::new(self.boxed()) + Expanded::new(self.into_element()) } fn flex(self, flex: f32, expanded: bool) -> FlexItem where Self: 'static + Sized, { - FlexItem::new(self.boxed()).flex(flex, expanded) + FlexItem::new(self.into_element()).flex(flex, expanded) } fn flex_float(self) -> FlexItem where Self: 'static + Sized, { - FlexItem::new(self.boxed()).float() + FlexItem::new(self.into_element()).float() } fn with_tooltip( @@ -184,7 +184,7 @@ pub trait Drawable { where Self: 'static + Sized, { - Tooltip::new::(id, text, action, style, self.boxed(), cx) + Tooltip::new::(id, text, action, style, self.into_element(), cx) } fn with_resize_handle( @@ -199,7 +199,7 @@ pub trait Drawable { Self: 'static + Sized, { Resizable::new::( - self.boxed(), + self.into_element(), element_id, side, handle_size, @@ -499,6 +499,64 @@ impl Element { } } +impl Drawable for Element { + type LayoutState = (); + type PaintState = (); + + fn layout( + &mut self, + constraint: SizeConstraint, + view: &mut V, + cx: &mut ViewContext, + ) -> (Vector2F, Self::LayoutState) { + let size = self.layout(constraint, view, cx); + (size, ()) + } + + fn paint( + &mut self, + scene: &mut SceneBuilder, + bounds: RectF, + visible_bounds: RectF, + _: &mut Self::LayoutState, + view: &mut V, + cx: &mut ViewContext, + ) -> Self::PaintState { + self.paint(scene, bounds.origin(), visible_bounds, view, cx); + } + + fn rect_for_text_range( + &self, + range_utf16: Range, + _: RectF, + _: RectF, + _: &Self::LayoutState, + _: &Self::PaintState, + view: &V, + cx: &ViewContext, + ) -> Option { + self.rect_for_text_range(range_utf16, view, cx) + } + + fn debug( + &self, + _: RectF, + _: &Self::LayoutState, + _: &Self::PaintState, + view: &V, + cx: &ViewContext, + ) -> serde_json::Value { + self.debug(view, cx) + } + + fn into_element(self) -> Element + where + Self: Sized, + { + self + } +} + pub struct RootElement { element: Element, view: WeakViewHandle, @@ -510,7 +568,7 @@ impl RootElement { } } -pub trait Component { +pub trait Component: 'static { fn render(&self, view: &mut V, cx: &mut ViewContext) -> Element; } @@ -718,21 +776,22 @@ impl Drawable for RootElement { } pub trait ParentElement<'a, V: View>: Extend> + Sized { - fn add_children(&mut self, children: impl IntoIterator>) { - self.extend(children); + fn add_children>(&mut self, children: impl IntoIterator) { + self.extend(children.into_iter().map(|child| child.into_element())); } - fn add_child(&mut self, child: Element) { - self.add_children(Some(child)); + fn add_child>(&mut self, child: D) { + self.extend(Some(child.into_element())); } - fn with_children(mut self, children: impl IntoIterator>) -> Self { - self.add_children(children); + fn with_children>(mut self, children: impl IntoIterator) -> Self { + self.extend(children.into_iter().map(|child| child.into_element())); self } - fn with_child(self, child: Element) -> Self { - self.with_children(Some(child)) + fn with_child>(mut self, child: D) -> Self { + self.extend(Some(child.into_element())); + self } } diff --git a/crates/gpui/src/elements/canvas.rs b/crates/gpui/src/elements/canvas.rs index bad40f3b01..78b3b61c19 100644 --- a/crates/gpui/src/elements/canvas.rs +++ b/crates/gpui/src/elements/canvas.rs @@ -25,7 +25,7 @@ where impl Drawable for Canvas where - F: FnMut(&mut SceneBuilder, RectF, RectF, &mut V, &mut ViewContext), + F: 'static + FnMut(&mut SceneBuilder, RectF, RectF, &mut V, &mut ViewContext), { type LayoutState = (); type PaintState = (); diff --git a/crates/gpui/src/elements/constrained_box.rs b/crates/gpui/src/elements/constrained_box.rs index 9e41412ebc..efea1df127 100644 --- a/crates/gpui/src/elements/constrained_box.rs +++ b/crates/gpui/src/elements/constrained_box.rs @@ -28,9 +28,9 @@ impl ToJson for Constraint { } impl ConstrainedBox { - pub fn new(child: Element) -> Self { + pub fn new(child: impl Drawable) -> Self { Self { - child, + child: child.into_element(), constraint: Constraint::Static(Default::default()), } } diff --git a/crates/gpui/src/elements/expanded.rs b/crates/gpui/src/elements/expanded.rs index 5336edf936..0004b3ac3d 100644 --- a/crates/gpui/src/elements/expanded.rs +++ b/crates/gpui/src/elements/expanded.rs @@ -13,9 +13,9 @@ pub struct Expanded { } impl Expanded { - pub fn new(child: Element) -> Self { + pub fn new(child: impl Drawable) -> Self { Self { - child, + child: child.into_element(), full_width: true, full_height: true, } diff --git a/crates/gpui/src/elements/flex.rs b/crates/gpui/src/elements/flex.rs index 71b3469d17..2357fe1553 100644 --- a/crates/gpui/src/elements/flex.rs +++ b/crates/gpui/src/elements/flex.rs @@ -403,13 +403,13 @@ pub struct FlexItem { } impl FlexItem { - pub fn new(child: Element) -> Self { + pub fn new(child: impl Drawable) -> Self { FlexItem { metadata: FlexParentData { flex: None, float: false, }, - child, + child: child.into_element(), } } diff --git a/crates/gpui/src/elements/hook.rs b/crates/gpui/src/elements/hook.rs index f3a03b80a2..577bdb904a 100644 --- a/crates/gpui/src/elements/hook.rs +++ b/crates/gpui/src/elements/hook.rs @@ -12,9 +12,9 @@ pub struct Hook { } impl Hook { - pub fn new(child: Element) -> Self { + pub fn new(child: impl Drawable) -> Self { Self { - child, + child: child.into_element(), after_layout: None, } } diff --git a/crates/gpui/src/elements/keystroke_label.rs b/crates/gpui/src/elements/keystroke_label.rs index 78d111e29a..c5b6b58fe9 100644 --- a/crates/gpui/src/elements/keystroke_label.rs +++ b/crates/gpui/src/elements/keystroke_label.rs @@ -49,11 +49,10 @@ impl Drawable for KeystrokeLabel { Label::new(keystroke.to_string(), self.text_style.clone()) .contained() .with_style(self.container_style) - .boxed() })) - .boxed() + .into_element() } else { - Empty::new().collapsed().boxed() + Empty::new().collapsed().into_element() }; let size = element.layout(constraint, view, cx); diff --git a/crates/gpui/src/elements/list.rs b/crates/gpui/src/elements/list.rs index d808959fcd..f9b51c956e 100644 --- a/crates/gpui/src/elements/list.rs +++ b/crates/gpui/src/elements/list.rs @@ -347,21 +347,21 @@ impl Drawable for List { } impl ListState { - pub fn new( + pub fn new( element_count: usize, orientation: Orientation, overdraw: f32, - render_item: F, + mut render_item: F, ) -> Self where - V: View, - F: 'static + FnMut(&mut V, usize, &mut ViewContext) -> Element, + D: Drawable, + F: 'static + FnMut(&mut V, usize, &mut ViewContext) -> D, { let mut items = SumTree::new(); items.extend((0..element_count).map(|_| ListItem::Unrendered), &()); Self(Rc::new(RefCell::new(StateInner { last_layout_width: None, - render_item: Box::new(render_item), + render_item: Box::new(move |view, ix, cx| render_item(view, ix, cx).into_element()), rendered_range: 0..0, items, logical_scroll_top: None, @@ -660,7 +660,7 @@ mod tests { let elements = elements.clone(); move |_, ix, _| { let (id, height) = elements.borrow()[ix]; - TestElement::new(id, height).boxed() + TestElement::new(id, height).into_element() } }); @@ -765,7 +765,7 @@ mod tests { let elements = elements.clone(); move |_, ix, _| { let (id, height) = elements.borrow()[ix]; - TestElement::new(id, height).boxed() + TestElement::new(id, height).into_element() } }); @@ -921,7 +921,7 @@ mod tests { } fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } } diff --git a/crates/gpui/src/elements/mouse_event_handler.rs b/crates/gpui/src/elements/mouse_event_handler.rs index f06a3f9baf..22863de610 100644 --- a/crates/gpui/src/elements/mouse_event_handler.rs +++ b/crates/gpui/src/elements/mouse_event_handler.rs @@ -32,13 +32,13 @@ pub struct MouseEventHandler { /// Element which provides a render_child callback with a MouseState and paints a mouse /// region under (or above) it for easy mouse event handling. impl MouseEventHandler { - pub fn new(region_id: usize, cx: &mut ViewContext, render_child: F) -> Self + pub fn new(region_id: usize, cx: &mut ViewContext, render_child: F) -> Self where - V: View, - F: FnOnce(&mut MouseState, &mut ViewContext) -> Element, + D: Drawable, + F: FnOnce(&mut MouseState, &mut ViewContext) -> D, { let mut mouse_state = cx.mouse_state::(region_id); - let child = render_child(&mut mouse_state, cx); + let child = render_child(&mut mouse_state, cx).into_element(); let notify_on_hover = mouse_state.accessed_hovered(); let notify_on_click = mouse_state.accessed_clicked(); Self { @@ -58,10 +58,10 @@ impl MouseEventHandler { /// Modifies the MouseEventHandler to render the MouseRegion above the child element. Useful /// for drag and drop handling and similar events which should be captured before the child /// gets the opportunity - pub fn above(region_id: usize, cx: &mut ViewContext, render_child: F) -> Self + pub fn above(region_id: usize, cx: &mut ViewContext, render_child: F) -> Self where - V: View, - F: FnOnce(&mut MouseState, &mut ViewContext) -> Element, + D: Drawable, + F: FnOnce(&mut MouseState, &mut ViewContext) -> D, { let mut handler = Self::new(region_id, cx, render_child); handler.above = true; diff --git a/crates/gpui/src/elements/overlay.rs b/crates/gpui/src/elements/overlay.rs index 177e1ed9a7..71057f50a7 100644 --- a/crates/gpui/src/elements/overlay.rs +++ b/crates/gpui/src/elements/overlay.rs @@ -73,9 +73,9 @@ impl AnchorCorner { } impl Overlay { - pub fn new(child: Element) -> Self { + pub fn new(child: impl Drawable) -> Self { Self { - child, + child: child.into_element(), anchor_position: None, anchor_corner: AnchorCorner::TopLeft, fit_mode: OverlayFitMode::None, diff --git a/crates/gpui/src/elements/resizable.rs b/crates/gpui/src/elements/resizable.rs index 9cc8c087b5..aaf35cd507 100644 --- a/crates/gpui/src/elements/resizable.rs +++ b/crates/gpui/src/elements/resizable.rs @@ -108,7 +108,6 @@ impl Resizable { Axis::Horizontal => constrained.with_max_width(state.custom_dimension.get()), Axis::Vertical => constrained.with_max_height(state.custom_dimension.get()), } - .boxed() }) .on_after_layout({ let state = state.clone(); @@ -116,7 +115,7 @@ impl Resizable { state.actual_dimension.set(side.relevant_component(size)); } }) - .boxed(); + .into_element(); Self { side, diff --git a/crates/gpui/src/elements/text.rs b/crates/gpui/src/elements/text.rs index 072b8fcfec..38e387209e 100644 --- a/crates/gpui/src/elements/text.rs +++ b/crates/gpui/src/elements/text.rs @@ -308,7 +308,7 @@ mod tests { } fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } } } diff --git a/crates/gpui/src/elements/tooltip.rs b/crates/gpui/src/elements/tooltip.rs index d30c099400..4b29886dc2 100644 --- a/crates/gpui/src/elements/tooltip.rs +++ b/crates/gpui/src/elements/tooltip.rs @@ -71,8 +71,7 @@ impl Tooltip { style.clone(), action.as_ref().map(|a| a.boxed_clone()), true, - ) - .boxed(); + ); Some( Overlay::new( Self::render_tooltip(focused_view_id, text, style, action, false) @@ -80,14 +79,13 @@ impl Tooltip { .dynamically(move |constraint, view, cx| { SizeConstraint::strict_along( Axis::Vertical, - collapsed_tooltip.layout(constraint, view, cx).y(), + collapsed_tooltip.layout(constraint, view, cx).0.y(), ) - }) - .boxed(), + }), ) .with_fit_mode(OverlayFitMode::SwitchAnchor) .with_anchor_position(state.position.get()) - .boxed(), + .into_element(), ) } else { None @@ -119,7 +117,7 @@ impl Tooltip { cx.notify(); } }) - .boxed(); + .into_element(); Self { child, tooltip, @@ -145,9 +143,9 @@ impl Tooltip { }; if measure { - text.flex(1., false).boxed() + text.flex(1., false).into_element() } else { - text.flex(1., false).aligned().boxed() + text.flex(1., false).aligned().into_element() } }) .with_children(action.and_then(|action| { @@ -158,9 +156,9 @@ impl Tooltip { style.keystroke.text, ); if measure { - Some(keystroke_label.boxed()) + Some(keystroke_label.into_element()) } else { - Some(keystroke_label.aligned().boxed()) + Some(keystroke_label.aligned().into_element()) } })) .contained() diff --git a/crates/gpui/src/test.rs b/crates/gpui/src/test.rs index 37e5299231..8200400acd 100644 --- a/crates/gpui/src/test.rs +++ b/crates/gpui/src/test.rs @@ -243,6 +243,6 @@ impl View for EmptyView { } fn render(&mut self, _: &mut ViewContext) -> Element { - Drawable::boxed(Empty::new()) + Empty::new().into_element() } } diff --git a/crates/gpui/src/views/select.rs b/crates/gpui/src/views/select.rs index 468f949b13..c6c7f5d7a8 100644 --- a/crates/gpui/src/views/select.rs +++ b/crates/gpui/src/views/select.rs @@ -94,7 +94,7 @@ impl View for Select { fn render(&mut self, cx: &mut ViewContext) -> Element { if self.item_count == 0 { - return Empty::new().boxed(); + return Empty::new().into_element(); } enum Header {} @@ -107,71 +107,58 @@ impl View for Select { }; let mut result = Flex::column().with_child( MouseEventHandler::::new(self.handle.id(), cx, |mouse_state, cx| { - Container::new((self.render_item)( + (self.render_item)( self.selected_item_ix, ItemType::Header, mouse_state.hovered(), cx, - )) + ) + .contained() .with_style(style.header) - .boxed() }) .on_click( MouseButton::Left, move |_, _, cx: &mut EventContext| cx.dispatch_action(ToggleSelect), - ) - .boxed(), + ), ); if self.is_open { - result.add_child( - Overlay::new( - Container::new( - ConstrainedBox::new( - UniformList::new( - self.list_state.clone(), - self.item_count, - cx, - move |this, mut range, items, cx| { - let selected_item_ix = this.selected_item_ix; - range.end = range.end.min(this.item_count); - items.extend(range.map(|ix| { - MouseEventHandler::::new( - ix, - cx, - |mouse_state, cx| { - (this.render_item)( - ix, - if ix == selected_item_ix { - ItemType::Selected - } else { - ItemType::Unselected - }, - mouse_state.hovered(), - cx, - ) - }, - ) - .on_click( - MouseButton::Left, - move |_, _, cx: &mut EventContext| { - cx.dispatch_action(SelectItem(ix)) - }, - ) - .boxed() - })) + result.add_child(Overlay::new( + UniformList::new( + self.list_state.clone(), + self.item_count, + cx, + move |this, mut range, items, cx| { + let selected_item_ix = this.selected_item_ix; + range.end = range.end.min(this.item_count); + items.extend(range.map(|ix| { + MouseEventHandler::::new(ix, cx, |mouse_state, cx| { + (this.render_item)( + ix, + if ix == selected_item_ix { + ItemType::Selected + } else { + ItemType::Unselected + }, + mouse_state.hovered(), + cx, + ) + }) + .on_click( + MouseButton::Left, + move |_, _, cx: &mut EventContext| { + cx.dispatch_action(SelectItem(ix)) }, ) - .boxed(), - ) - .with_max_height(200.) - .boxed(), - ) - .with_style(style.menu) - .boxed(), + .into_element() + })) + }, ) - .boxed(), - ) + .constrained() + .with_max_height(200.) + .contained() + .with_style(style.menu), + )); } - result.boxed() + result.into_element() } } diff --git a/crates/language_selector/src/active_buffer_language.rs b/crates/language_selector/src/active_buffer_language.rs index 5e91a2d2e3..fe05ed85a2 100644 --- a/crates/language_selector/src/active_buffer_language.rs +++ b/crates/language_selector/src/active_buffer_language.rs @@ -64,15 +64,14 @@ impl View for ActiveBufferLanguage { Label::new(active_language_text, style.text.clone()) .contained() .with_style(style.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, |_, _, cx| { cx.dispatch_action(crate::Toggle) }) - .boxed() + .into_element() } else { - Empty::new().boxed() + Empty::new().into_element() } } } diff --git a/crates/language_selector/src/language_selector.rs b/crates/language_selector/src/language_selector.rs index d39da99963..1f349108ba 100644 --- a/crates/language_selector/src/language_selector.rs +++ b/crates/language_selector/src/language_selector.rs @@ -197,6 +197,6 @@ impl PickerDelegate for LanguageSelectorDelegate { .with_highlights(mat.positions.clone()) .contained() .with_style(style.container) - .boxed() + .into_element() } } diff --git a/crates/outline/src/outline.rs b/crates/outline/src/outline.rs index 4dde620a35..ae044678a5 100644 --- a/crates/outline/src/outline.rs +++ b/crates/outline/src/outline.rs @@ -220,6 +220,6 @@ impl PickerDelegate for OutlineViewDelegate { .with_padding_left(20. * outline_item.depth as f32) .contained() .with_style(style.container) - .boxed() + .into_element() } } diff --git a/crates/picker/src/picker.rs b/crates/picker/src/picker.rs index f973dddb3c..9b2da2435f 100644 --- a/crates/picker/src/picker.rs +++ b/crates/picker/src/picker.rs @@ -75,8 +75,7 @@ impl View for Picker { .with_child( ChildView::new(&self.query_editor, cx) .contained() - .with_style(editor_style) - .boxed(), + .with_style(editor_style), ) .with_children(if match_count == 0 { if query.is_empty() { @@ -86,7 +85,7 @@ impl View for Picker { Label::new("No matches", theme.no_matches.label.clone()) .contained() .with_style(theme.no_matches.container) - .boxed(), + .into_element(), ) } } else { @@ -109,14 +108,14 @@ impl View for Picker { cx.dispatch_action(SelectIndex(ix)) }) .with_cursor_style(CursorStyle::PointingHand) - .boxed() + .into_element() })); }, ) .contained() .with_margin_top(6.0) .flex(1., false) - .boxed(), + .into_element(), ) }) .contained() @@ -124,7 +123,7 @@ impl View for Picker { .constrained() .with_max_width(self.max_size.x()) .with_max_height(self.max_size.y()) - .named("picker") + .into_named_element("picker") } fn keymap_context(&self, _: &AppContext) -> KeymapContext { diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index c70ffdd4e1..b540b7f3bf 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -6,8 +6,8 @@ use gpui::{ actions, anyhow::{anyhow, Result}, elements::{ - AnchorCorner, ChildView, ConstrainedBox, ContainerStyle, Empty, Flex, Label, - MouseEventHandler, ParentElement, ScrollTarget, Stack, Svg, UniformList, UniformListState, + AnchorCorner, ChildView, ContainerStyle, Empty, Flex, Label, MouseEventHandler, + ParentElement, ScrollTarget, Stack, Svg, UniformList, UniformListState, }, geometry::vector::Vector2F, impl_internal_actions, @@ -1104,25 +1104,21 @@ impl ProjectPanel { Flex::row() .with_child( - ConstrainedBox::new(if kind == EntryKind::Dir { + if kind == EntryKind::Dir { if details.is_expanded { - Svg::new("icons/chevron_down_8.svg") - .with_color(style.icon_color) - .boxed() + Svg::new("icons/chevron_down_8.svg").with_color(style.icon_color) } else { - Svg::new("icons/chevron_right_8.svg") - .with_color(style.icon_color) - .boxed() + Svg::new("icons/chevron_right_8.svg").with_color(style.icon_color) } + .constrained() } else { - Empty::new().boxed() - }) + Empty::new().constrained() + } .with_max_width(style.icon_size) .with_max_height(style.icon_size) .aligned() .constrained() - .with_width(style.icon_size) - .boxed(), + .with_width(style.icon_size), ) .with_child(if show_editor && editor.is_some() { ChildView::new(editor.as_ref().unwrap(), cx) @@ -1131,21 +1127,21 @@ impl ProjectPanel { .aligned() .left() .flex(1.0, true) - .boxed() + .into_element() } else { Label::new(details.filename.clone(), style.text.clone()) .contained() .with_margin_left(style.icon_spacing) .aligned() .left() - .boxed() + .into_element() }) .constrained() .with_height(style.height) .contained() .with_style(row_container_style) .with_padding_left(padding) - .boxed() + .into_named_element("project panel entry visual element") } fn render_entry( @@ -1259,7 +1255,7 @@ impl ProjectPanel { } }) .with_cursor_style(CursorStyle::PointingHand) - .boxed() + .into_named_element("project panel entry") } } @@ -1310,7 +1306,6 @@ impl View for ProjectPanel { .contained() .with_style(container_style) .expanded() - .boxed() }) .on_down(MouseButton::Right, move |e, _, cx| { // When deploying the context menu anywhere below the last project entry, @@ -1321,11 +1316,10 @@ impl View for ProjectPanel { position: e.position, }) } - }) - .boxed(), + }), ) - .with_child(ChildView::new(&self.context_menu, cx).boxed()) - .boxed() + .with_child(ChildView::new(&self.context_menu, cx)) + .into_named_element("project panel") } else { Flex::column() .with_child( @@ -1345,18 +1339,16 @@ impl View for ProjectPanel { Box::new(workspace::Open), cx, ) - .boxed() } }) .on_click(MouseButton::Left, move |_, _, cx| { cx.dispatch_action(workspace::Open) }) - .with_cursor_style(CursorStyle::PointingHand) - .boxed(), + .with_cursor_style(CursorStyle::PointingHand), ) .contained() .with_style(container_style) - .boxed() + .into_named_element("empty project panel") } } diff --git a/crates/project_symbols/src/project_symbols.rs b/crates/project_symbols/src/project_symbols.rs index 273b55754d..32c04a43bf 100644 --- a/crates/project_symbols/src/project_symbols.rs +++ b/crates/project_symbols/src/project_symbols.rs @@ -231,17 +231,16 @@ impl PickerDelegate for ProjectSymbolsDelegate { current_style.label.text.clone().into(), syntax_runs, &string_match.positions, - )) - .boxed(), + )), ) .with_child( // Avoid styling the path differently when it is selected, since // the symbol's syntax highlighting doesn't change when selected. - Label::new(path.to_string(), style.default.label.clone()).boxed(), + Label::new(path.to_string(), style.default.label.clone()), ) .contained() .with_style(current_style.container) - .boxed() + .into_element() } } diff --git a/crates/recent_projects/src/highlighted_workspace_location.rs b/crates/recent_projects/src/highlighted_workspace_location.rs index 4c8c116bd9..7decf0830d 100644 --- a/crates/recent_projects/src/highlighted_workspace_location.rs +++ b/crates/recent_projects/src/highlighted_workspace_location.rs @@ -45,7 +45,7 @@ impl HighlightedText { pub fn render(self, style: impl Into) -> Element { Label::new(self.text, style) .with_highlights(self.highlight_positions) - .boxed() + .into_element() } } diff --git a/crates/recent_projects/src/recent_projects.rs b/crates/recent_projects/src/recent_projects.rs index a055177a99..4a441ab8e6 100644 --- a/crates/recent_projects/src/recent_projects.rs +++ b/crates/recent_projects/src/recent_projects.rs @@ -177,6 +177,6 @@ impl PickerDelegate for RecentProjectsDelegate { .flex(1., false) .contained() .with_style(style.container) - .named("match") + .into_named_element("match") } } diff --git a/crates/search/src/buffer_search.rs b/crates/search/src/buffer_search.rs index c5a9ac8443..c6baa613fd 100644 --- a/crates/search/src/buffer_search.rs +++ b/crates/search/src/buffer_search.rs @@ -114,8 +114,7 @@ impl View for BufferSearchBar { ChildView::new(&self.query_editor, cx) .aligned() .left() - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_children(self.active_searchable_item.as_ref().and_then( |searchable_item| { @@ -132,8 +131,7 @@ impl View for BufferSearchBar { Label::new(message, theme.search.match_index.text.clone()) .contained() .with_style(theme.search.match_index.container) - .aligned() - .boxed(), + .aligned(), ) }, )) @@ -143,15 +141,13 @@ impl View for BufferSearchBar { .constrained() .with_min_width(theme.search.editor.min_width) .with_max_width(theme.search.editor.max_width) - .flex(1., false) - .boxed(), + .flex(1., false), ) .with_child( Flex::row() .with_child(self.render_nav_button("<", Direction::Prev, cx)) .with_child(self.render_nav_button(">", Direction::Next, cx)) - .aligned() - .boxed(), + .aligned(), ) .with_child( Flex::row() @@ -175,16 +171,14 @@ impl View for BufferSearchBar { )) .contained() .with_style(theme.search.option_button_group) - .aligned() - .boxed(), + .aligned(), ) - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_child(self.render_close_button(&theme.search, cx)) .contained() .with_style(theme.search.container) - .named("search bar") + .into_named_element("search bar") } } @@ -343,7 +337,6 @@ impl BufferSearchBar { Label::new(icon, style.text.clone()) .contained() .with_style(style.container) - .boxed() }) .on_click(MouseButton::Left, move |_, _, cx| { cx.dispatch_any_action(option.to_toggle_action()) @@ -356,7 +349,7 @@ impl BufferSearchBar { tooltip_style, cx, ) - .boxed(), + .into_element(), ) } @@ -391,7 +384,6 @@ impl BufferSearchBar { Label::new(icon, style.text.clone()) .contained() .with_style(style.container) - .boxed() }) .on_click(MouseButton::Left, { let action = action.boxed_clone(); @@ -405,7 +397,7 @@ impl BufferSearchBar { tooltip_style, cx, ) - .boxed() + .into_element() } fn render_close_button( @@ -429,7 +421,6 @@ impl BufferSearchBar { .with_width(style.button_width) .contained() .with_style(style.container) - .boxed() }) .on_click(MouseButton::Left, { let action = action.boxed_clone(); @@ -437,7 +428,7 @@ impl BufferSearchBar { }) .with_cursor_style(CursorStyle::PointingHand) .with_tooltip::(0, tooltip.to_string(), Some(action), tooltip_style, cx) - .boxed() + .into_element() } fn deploy(pane: &mut Pane, action: &Deploy, cx: &mut ViewContext) { diff --git a/crates/search/src/project_search.rs b/crates/search/src/project_search.rs index e0dac1b9ad..d358c96c8a 100644 --- a/crates/search/src/project_search.rs +++ b/crates/search/src/project_search.rs @@ -197,16 +197,15 @@ impl View for ProjectSearchView { .contained() .with_background_color(theme.editor.background) .flex(1., true) - .boxed() }) .on_down(MouseButton::Left, |_, _, cx| { cx.focus_parent_view(); }) - .boxed() + .into_named_element("project search view") } else { ChildView::new(&self.results_editor, cx) .flex(1., true) - .boxed() + .into_named_element("project search view") } } @@ -263,17 +262,14 @@ impl Item for ProjectSearchView { .with_width(tab_theme.type_icon_width) .aligned() .contained() - .with_margin_right(tab_theme.spacing) - .boxed(), + .with_margin_right(tab_theme.spacing), ) .with_children(self.model.read(cx).active_query.as_ref().map(|query| { let query_text = util::truncate_and_trailoff(query.as_str(), MAX_TAB_TITLE_LEN); - Label::new(query_text, tab_theme.label.clone()) - .aligned() - .boxed() + Label::new(query_text, tab_theme.label.clone()).aligned() })) - .boxed() + .into_element() } fn for_each_project_item(&self, cx: &AppContext, f: &mut dyn FnMut(usize, &dyn project::Item)) { @@ -778,7 +774,6 @@ impl ProjectSearchBar { Label::new(icon, style.text.clone()) .contained() .with_style(style.container) - .boxed() }) .on_click(MouseButton::Left, { let action = action.boxed_clone(); @@ -792,7 +787,7 @@ impl ProjectSearchBar { tooltip_style, cx, ) - .boxed() + .into_element() } fn render_option_button( @@ -813,7 +808,6 @@ impl ProjectSearchBar { Label::new(icon, style.text.clone()) .contained() .with_style(style.container) - .boxed() }) .on_click(MouseButton::Left, move |_, _, cx| { cx.dispatch_any_action(option.to_toggle_action()) @@ -826,7 +820,7 @@ impl ProjectSearchBar { tooltip_style, cx, ) - .boxed() + .into_element() } fn is_option_enabled(&self, option: SearchOption, cx: &AppContext) -> bool { @@ -868,8 +862,7 @@ impl View for ProjectSearchBar { ChildView::new(&search.query_editor, cx) .aligned() .left() - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_children(search.active_match_index.map(|match_ix| { Label::new( @@ -883,7 +876,6 @@ impl View for ProjectSearchBar { .contained() .with_style(theme.search.match_index.container) .aligned() - .boxed() })) .contained() .with_style(editor_container) @@ -891,15 +883,13 @@ impl View for ProjectSearchBar { .constrained() .with_min_width(theme.search.editor.min_width) .with_max_width(theme.search.editor.max_width) - .flex(1., false) - .boxed(), + .flex(1., false), ) .with_child( Flex::row() .with_child(self.render_nav_button("<", Direction::Prev, cx)) .with_child(self.render_nav_button(">", Direction::Next, cx)) - .aligned() - .boxed(), + .aligned(), ) .with_child( Flex::row() @@ -912,16 +902,15 @@ impl View for ProjectSearchBar { .with_child(self.render_option_button("Regex", SearchOption::Regex, cx)) .contained() .with_style(theme.search.option_button_group) - .aligned() - .boxed(), + .aligned(), ) .contained() .with_style(theme.search.container) .aligned() .left() - .named("project search") + .into_named_element("project search") } else { - Empty::new().boxed() + Empty::new().into_element() } } } diff --git a/crates/settings/src/settings_file.rs b/crates/settings/src/settings_file.rs index aec950c417..80078e8165 100644 --- a/crates/settings/src/settings_file.rs +++ b/crates/settings/src/settings_file.rs @@ -95,7 +95,7 @@ mod tests { } fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } } diff --git a/crates/terminal_view/src/terminal_button.rs b/crates/terminal_view/src/terminal_button.rs index 03500bdb35..7a84665649 100644 --- a/crates/terminal_view/src/terminal_button.rs +++ b/crates/terminal_view/src/terminal_button.rs @@ -46,7 +46,7 @@ impl View for TerminalButton { let workspace = self.workspace.upgrade(cx); let project = match workspace { Some(workspace) => workspace.read(cx).project().read(cx), - None => return Empty::new().boxed(), + None => return Empty::new().into_element(), }; let focused_view = cx.focused_view_id(); @@ -79,20 +79,18 @@ impl View for TerminalButton { .constrained() .with_width(style.icon_size) .aligned() - .named("terminals-icon"), + .into_named_element("terminals-icon"), ) .with_children(has_terminals.then(|| { Label::new(terminal_count.to_string(), style.label.text.clone()) .contained() .with_style(style.label.container) .aligned() - .boxed() })) .constrained() .with_height(style.icon_size) .contained() .with_style(style.container) - .boxed() } }) .with_cursor_style(CursorStyle::PointingHand) @@ -111,17 +109,10 @@ impl View for TerminalButton { Some(Box::new(FocusDock)), theme.tooltip.clone(), cx, - ) - .boxed(), + ), ) - .with_child( - ChildView::new(&self.popup_menu, cx) - .aligned() - .top() - .right() - .boxed(), - ) - .boxed() + .with_child(ChildView::new(&self.popup_menu, cx).aligned().top().right()) + .into_named_element("terminal button") } } diff --git a/crates/terminal_view/src/terminal_element.rs b/crates/terminal_view/src/terminal_element.rs index 496dca0e79..8ddd248be9 100644 --- a/crates/terminal_view/src/terminal_element.rs +++ b/crates/terminal_view/src/terminal_element.rs @@ -600,11 +600,10 @@ impl Drawable for TerminalElement { .constrained() .with_width(dimensions.width()) .with_height(dimensions.height()) - .with_tooltip::(id, uri, None, tooltip_style, cx) - .boxed(), + .with_tooltip::(id, uri, None, tooltip_style, cx), ) .with_position_mode(gpui::elements::OverlayPositionMode::Local) - .boxed(); + .into_element(); tooltip.layout( SizeConstraint::new(Vector2F::zero(), cx.window_size()), diff --git a/crates/terminal_view/src/terminal_view.rs b/crates/terminal_view/src/terminal_view.rs index 8f9e73a6f3..2a4a4c3432 100644 --- a/crates/terminal_view/src/terminal_view.rs +++ b/crates/terminal_view/src/terminal_view.rs @@ -403,11 +403,10 @@ impl View for TerminalView { focused, self.should_show_cursor(focused, cx), ) - .contained() - .boxed(), + .contained(), ) - .with_child(ChildView::new(&self.context_menu, cx).boxed()) - .boxed() + .with_child(ChildView::new(&self.context_menu, cx)) + .into_element() } fn focus_in(&mut self, _: AnyViewHandle, cx: &mut ViewContext) { @@ -561,11 +560,10 @@ impl Item for TerminalView { .with_width(tab_theme.type_icon_width) .aligned() .contained() - .with_margin_right(tab_theme.spacing) - .boxed(), + .with_margin_right(tab_theme.spacing), ) - .with_child(Label::new(title, tab_theme.label.clone()).aligned().boxed()) - .boxed() + .with_child(Label::new(title, tab_theme.label.clone()).aligned()) + .into_element() } fn clone_on_split( diff --git a/crates/theme/src/ui.rs b/crates/theme/src/ui.rs index 2a05faa600..74046c94b1 100644 --- a/crates/theme/src/ui.rs +++ b/crates/theme/src/ui.rs @@ -11,7 +11,7 @@ use gpui::{ platform, platform::MouseButton, scene::MouseClick, - Action, Drawable, Element, EventContext, MouseState, View, ViewContext, + Action, Drawable, EventContext, MouseState, View, ViewContext, }; use serde::Deserialize; @@ -36,14 +36,13 @@ pub fn checkbox( ) -> MouseEventHandler { let label = Label::new(label, style.label.text.clone()) .contained() - .with_style(style.label.container) - .boxed(); + .with_style(style.label.container); checkbox_with_label(label, style, checked, cx, change) } -pub fn checkbox_with_label( - label: Element, +pub fn checkbox_with_label, V: View>( + label: D, style: &CheckboxStyle, checked: bool, cx: &mut ViewContext, @@ -60,27 +59,21 @@ pub fn checkbox_with_label( }; Flex::row() - .with_children([ - indicator - .contained() - .with_style(if checked { - if state.hovered() { - style.hovered_and_checked - } else { - style.checked - } - } else { - if state.hovered() { - style.hovered - } else { - style.default - } - }) - .boxed(), - label, - ]) + .with_child(indicator.contained().with_style(if checked { + if state.hovered() { + style.hovered_and_checked + } else { + style.checked + } + } else { + if state.hovered() { + style.hovered + } else { + style.default + } + })) + .with_child(label) .align_children_center() - .boxed() }) .on_click(platform::MouseButton::Left, move |_, _, cx| { change(!checked, cx) @@ -151,21 +144,16 @@ pub fn keystroke_label_for( action: Box, ) -> Container { Flex::row() + .with_child(Label::new(label_text, label_style.text.clone()).contained()) .with_child( - Label::new(label_text, label_style.text.clone()) - .contained() - .boxed(), - ) - .with_child({ KeystrokeLabel::new( view_id, action, keystroke_style.container, keystroke_style.text.clone(), ) - .flex_float() - .boxed() - }) + .flex_float(), + ) .contained() .with_style(label_style.container) } @@ -178,7 +166,7 @@ pub fn cta_button( max_width: f32, style: &ButtonStyle, cx: &mut ViewContext, -) -> Element +) -> MouseEventHandler where L: Into>, A: 'static + Action + Clone, @@ -187,7 +175,6 @@ where cta_button_with_click::(label, max_width, style, cx, move |_, _, cx| { cx.dispatch_action(action.clone()) }) - .boxed() } pub fn cta_button_with_click( @@ -211,7 +198,6 @@ where .with_style(style.container) .constrained() .with_max_width(max_width) - .boxed() }) .on_click(MouseButton::Left, f) .with_cursor_style(platform::CursorStyle::PointingHand) @@ -232,17 +218,18 @@ impl ModalStyle { } } -pub fn modal( +pub fn modal( title: I, style: &ModalStyle, cx: &mut ViewContext, build_modal: F, -) -> Element +) -> impl Drawable where Tag: 'static, V: View, I: Into>, - F: FnOnce(&mut gpui::ViewContext) -> Element, + D: Drawable, + F: FnOnce(&mut gpui::ViewContext) -> D, { const TITLEBAR_HEIGHT: f32 = 28.; // let active = cx.window_is_active(cx.window_id()); @@ -250,43 +237,39 @@ where Flex::column() .with_child( Stack::new() - .with_children([ - Label::new( - title, - style - .title_text - .style_for(&mut MouseState::default(), false) - .clone(), - ) - .boxed(), + .with_child(Label::new( + title, + style + .title_text + .style_for(&mut MouseState::default(), false) + .clone(), + )) + .with_child( // FIXME: Get a better tag type MouseEventHandler::::new(999999, cx, |state, _cx| { let style = style.close_icon.style_for(state, false); - icon(style).boxed() + icon(style) }) .on_click(platform::MouseButton::Left, move |_, _, cx| { cx.remove_window(); }) .with_cursor_style(platform::CursorStyle::PointingHand) .aligned() - .right() - .boxed(), - ]) + .right(), + ) .contained() .with_style(style.titlebar) .constrained() - .with_height(TITLEBAR_HEIGHT) - .boxed(), + .with_height(TITLEBAR_HEIGHT), ) .with_child( - Container::new(build_modal(cx)) + build_modal(cx) + .contained() .with_style(style.container) .constrained() .with_width(style.dimensions().x()) - .with_height(style.dimensions().y() - TITLEBAR_HEIGHT) - .boxed(), + .with_height(style.dimensions().y() - TITLEBAR_HEIGHT), ) .constrained() .with_height(style.dimensions().y()) - .boxed() } diff --git a/crates/theme_selector/src/theme_selector.rs b/crates/theme_selector/src/theme_selector.rs index c1c1dbc676..946e3ddbb7 100644 --- a/crates/theme_selector/src/theme_selector.rs +++ b/crates/theme_selector/src/theme_selector.rs @@ -217,6 +217,6 @@ impl PickerDelegate for ThemeSelectorDelegate { .with_highlights(theme_match.positions.clone()) .contained() .with_style(style.container) - .boxed() + .into_element() } } diff --git a/crates/theme_testbench/src/theme_testbench.rs b/crates/theme_testbench/src/theme_testbench.rs index fe6f1dcc67..1127f89709 100644 --- a/crates/theme_testbench/src/theme_testbench.rs +++ b/crates/theme_testbench/src/theme_testbench.rs @@ -46,10 +46,9 @@ impl ThemeTestbench { }); }) .flex(1.0, false) - .boxed() })) .flex(1.0, false) - .boxed() + .into_element() } Flex::column() @@ -71,39 +70,30 @@ impl ThemeTestbench { ) -> Container { Flex::column() .with_child( - Self::render_button_set(0, layer_index, "base", &layer.base, cx) - .flex(1., false) - .boxed(), + Self::render_button_set(0, layer_index, "base", &layer.base, cx).flex(1., false), ) .with_child( Self::render_button_set(1, layer_index, "variant", &layer.variant, cx) - .flex(1., false) - .boxed(), + .flex(1., false), ) .with_child( - Self::render_button_set(2, layer_index, "on", &layer.on, cx) - .flex(1., false) - .boxed(), + Self::render_button_set(2, layer_index, "on", &layer.on, cx).flex(1., false), ) .with_child( Self::render_button_set(3, layer_index, "accent", &layer.accent, cx) - .flex(1., false) - .boxed(), + .flex(1., false), ) .with_child( Self::render_button_set(4, layer_index, "positive", &layer.positive, cx) - .flex(1., false) - .boxed(), + .flex(1., false), ) .with_child( Self::render_button_set(5, layer_index, "warning", &layer.warning, cx) - .flex(1., false) - .boxed(), + .flex(1., false), ) .with_child( Self::render_button_set(6, layer_index, "negative", &layer.negative, cx) - .flex(1., false) - .boxed(), + .flex(1., false), ) .contained() .with_style(ContainerStyle { @@ -224,10 +214,9 @@ impl ThemeTestbench { corner_radius: 2., ..Default::default() }) - .boxed() }) .flex(1., true) - .boxed() + .into_element() } fn render_label(text: String, style: &Style, cx: &mut ViewContext) -> Label { @@ -270,30 +259,16 @@ impl View for ThemeTestbench { Self::render_ramps(color_scheme) .contained() .with_margin_right(10.) - .flex(0.1, false) - .boxed(), + .flex(0.1, false), ) .with_child( Flex::column() - .with_child( - Self::render_layer(100, &color_scheme.lowest, cx) - .flex(1., true) - .boxed(), - ) - .with_child( - Self::render_layer(200, &color_scheme.middle, cx) - .flex(1., true) - .boxed(), - ) - .with_child( - Self::render_layer(300, &color_scheme.highest, cx) - .flex(1., true) - .boxed(), - ) - .flex(1., false) - .boxed(), + .with_child(Self::render_layer(100, &color_scheme.lowest, cx).flex(1., true)) + .with_child(Self::render_layer(200, &color_scheme.middle, cx).flex(1., true)) + .with_child(Self::render_layer(300, &color_scheme.highest, cx).flex(1., true)) + .flex(1., false), ) - .boxed() + .into_element() } } @@ -307,7 +282,7 @@ impl Item for ThemeTestbench { Label::new("Theme Testbench", style.label.clone()) .aligned() .contained() - .boxed() + .into_element() } fn serialized_item_kind() -> Option<&'static str> { diff --git a/crates/welcome/src/base_keymap_picker.rs b/crates/welcome/src/base_keymap_picker.rs index e79598ef4d..b8ba7de528 100644 --- a/crates/welcome/src/base_keymap_picker.rs +++ b/crates/welcome/src/base_keymap_picker.rs @@ -143,6 +143,6 @@ impl PickerDelegate for BaseKeymapSelectorDelegate { .with_highlights(keymap_match.positions.clone()) .contained() .with_style(style.container) - .boxed() + .into_element() } } diff --git a/crates/welcome/src/welcome.rs b/crates/welcome/src/welcome.rs index 2952ee6a36..e9eb66ee7d 100644 --- a/crates/welcome/src/welcome.rs +++ b/crates/welcome/src/welcome.rs @@ -73,78 +73,77 @@ impl View for WelcomePage { PaneBackdrop::new( self_handle.id(), Flex::column() - .with_children([ + .with_child( Flex::column() - .with_children([ + .with_child( theme::ui::svg(&theme.welcome.logo) .aligned() .contained() - .aligned() - .boxed(), + .aligned(), + ) + .with_child( Label::new( "Code at the speed of thought", theme.welcome.logo_subheading.text.clone(), ) .aligned() .contained() - .with_style(theme.welcome.logo_subheading.container) - .boxed(), - ]) + .with_style(theme.welcome.logo_subheading.container), + ) .contained() .with_style(theme.welcome.heading_group) .constrained() - .with_width(width) - .boxed(), + .with_width(width), + ) + .with_child( Flex::column() - .with_children([ - theme::ui::cta_button( - "Choose a theme", - theme_selector::Toggle, - width, - &theme.welcome.button, - cx, - ), - theme::ui::cta_button( - "Choose a keymap", - ToggleBaseKeymapSelector, - width, - &theme.welcome.button, - cx, - ), - theme::ui::cta_button( - "Install the CLI", - install_cli::Install, - width, - &theme.welcome.button, - cx, - ), - ]) + .with_child(theme::ui::cta_button( + "Choose a theme", + theme_selector::Toggle, + width, + &theme.welcome.button, + cx, + )) + .with_child(theme::ui::cta_button( + "Choose a keymap", + ToggleBaseKeymapSelector, + width, + &theme.welcome.button, + cx, + )) + .with_child(theme::ui::cta_button( + "Install the CLI", + install_cli::Install, + width, + &theme.welcome.button, + cx, + )) .contained() .with_style(theme.welcome.button_group) .constrained() - .with_width(width) - .boxed(), + .with_width(width), + ) + .with_child( Flex::column() - .with_children([ - theme::ui::checkbox_with_label::( + .with_child( + theme::ui::checkbox_with_label::( Flex::column() - .with_children([ + .with_child( Label::new( "Send anonymous usage data", theme.welcome.checkbox.label.text.clone(), ) .contained() - .with_style(theme.welcome.checkbox.label.container) - .boxed(), + .with_style(theme.welcome.checkbox.label.container), + ) + .with_child( Label::new( "Help > View Telemetry", theme.welcome.usage_note.text.clone(), ) .contained() - .with_style(theme.welcome.usage_note.container) - .boxed(), - ]) - .boxed(), + .with_style(theme.welcome.usage_note.container), + ), &theme.welcome.checkbox, metrics, cx, @@ -155,8 +154,9 @@ impl View for WelcomePage { }, ) .contained() - .with_style(theme.welcome.checkbox_container) - .boxed(), + .with_style(theme.welcome.checkbox_container), + ) + .with_child( theme::ui::checkbox::( "Send crash reports", &theme.welcome.checkbox, @@ -169,23 +169,21 @@ impl View for WelcomePage { }, ) .contained() - .with_style(theme.welcome.checkbox_container) - .boxed(), - ]) + .with_style(theme.welcome.checkbox_container), + ) .contained() .with_style(theme.welcome.checkbox_group) .constrained() - .with_width(width) - .boxed(), - ]) + .with_width(width), + ) .constrained() .with_max_width(width) .contained() .with_uniform_padding(10.) .aligned() - .boxed(), + .into_element(), ) - .boxed() + .into_named_element("welcome page") } } @@ -212,10 +210,9 @@ impl Item for WelcomePage { .with_child( Label::new("Welcome to Zed!", style.label.clone()) .aligned() - .contained() - .boxed(), + .contained(), ) - .boxed() + .into_element() } fn show_toolbar(&self) -> bool { diff --git a/crates/workspace/src/dock.rs b/crates/workspace/src/dock.rs index 0f13bc1a04..19cc00654d 100644 --- a/crates/workspace/src/dock.rs +++ b/crates/workspace/src/dock.rs @@ -5,7 +5,7 @@ use serde::Deserialize; use collections::HashMap; use gpui::{ actions, - elements::{ChildView, Container, Empty, MouseEventHandler, ParentElement, Side, Stack}, + elements::{ChildView, Empty, MouseEventHandler, ParentElement, Side, Stack}, geometry::vector::Vector2F, impl_internal_actions, platform::{CursorStyle, MouseButton}, @@ -348,7 +348,8 @@ impl Dock { enum DockResizeHandle {} - let resizable = Container::new(ChildView::new(&self.pane, cx).boxed()) + let resizable = ChildView::new(&self.pane, cx) + .contained() .with_style(panel_style) .with_resize_handle::( resize_side as usize, @@ -367,26 +368,21 @@ impl Dock { }); if anchor == DockAnchor::Right { - resizable - .constrained() - .dynamically(|constraint, _, cx| { - SizeConstraint::new( - Vector2F::new(20., constraint.min.y()), - Vector2F::new(cx.window_size().x() * 0.8, constraint.max.y()), - ) - }) - .boxed() + resizable.constrained().dynamically(|constraint, _, cx| { + SizeConstraint::new( + Vector2F::new(20., constraint.min.y()), + Vector2F::new(cx.window_size().x() * 0.8, constraint.max.y()), + ) + }) } else { - resizable - .constrained() - .dynamically(|constraint, _, cx| { - SizeConstraint::new( - Vector2F::new(constraint.min.x(), 50.), - Vector2F::new(constraint.max.x(), cx.window_size().y() * 0.8), - ) - }) - .boxed() + resizable.constrained().dynamically(|constraint, _, cx| { + SizeConstraint::new( + Vector2F::new(constraint.min.x(), 50.), + Vector2F::new(constraint.max.x(), cx.window_size().y() * 0.8), + ) + }) } + .into_element() } DockAnchor::Expanded => { enum ExpandedDockWash {} @@ -398,27 +394,24 @@ impl Dock { Empty::new() .contained() .with_background_color(style.wash_color) - .boxed() }) .capture_all() .on_down(MouseButton::Left, |_, _, cx| { cx.dispatch_action(HideDock); }) - .with_cursor_style(CursorStyle::Arrow) - .boxed(), + .with_cursor_style(CursorStyle::Arrow), ) .with_child( MouseEventHandler::::new(0, cx, |_state, cx| { - ChildView::new(&self.pane, cx).boxed() + ChildView::new(&self.pane, cx) }) // Make sure all events directly under the dock pane // are captured .capture_all() .contained() - .with_style(style.maximized) - .boxed(), + .with_style(style.maximized), ) - .boxed() + .into_element() } }) } diff --git a/crates/workspace/src/dock/toggle_dock_button.rs b/crates/workspace/src/dock/toggle_dock_button.rs index fccd160865..bea1072211 100644 --- a/crates/workspace/src/dock/toggle_dock_button.rs +++ b/crates/workspace/src/dock/toggle_dock_button.rs @@ -38,7 +38,7 @@ impl View for ToggleDockButton { let workspace = self.workspace.upgrade(cx); if workspace.is_none() { - return Empty::new().boxed(); + return Empty::new().into_element(); } let workspace = workspace.unwrap(); @@ -64,7 +64,6 @@ impl View for ToggleDockButton { .with_height(style.icon_size) .contained() .with_style(style.container) - .boxed() } }) .with_cursor_style(CursorStyle::PointingHand) @@ -98,7 +97,7 @@ impl View for ToggleDockButton { cx, ) } - .boxed() + .into_element() } } diff --git a/crates/workspace/src/item.rs b/crates/workspace/src/item.rs index 1d5df19d42..d1a2b8c2fe 100644 --- a/crates/workspace/src/item.rs +++ b/crates/workspace/src/item.rs @@ -930,7 +930,7 @@ pub(crate) mod test { } fn render(&mut self, _: &mut ViewContext) -> Element { - Empty::new().boxed() + Empty::new().into_element() } } @@ -949,7 +949,7 @@ pub(crate) mod test { _: &AppContext, ) -> Element { self.tab_detail.set(detail); - Empty::new().boxed() + Empty::new().into_element() } fn for_each_project_item( diff --git a/crates/workspace/src/notifications.rs b/crates/workspace/src/notifications.rs index 07e90b2680..6d941e0f60 100644 --- a/crates/workspace/src/notifications.rs +++ b/crates/workspace/src/notifications.rs @@ -255,8 +255,7 @@ pub mod simple_message_notification { .aligned() .top() .left() - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_child( MouseEventHandler::::new(0, cx, |state, _| { @@ -271,7 +270,6 @@ pub mod simple_message_notification { .constrained() .with_width(style.button_width) .with_height(style.button_width) - .boxed() }) .with_padding(Padding::uniform(5.)) .on_click(MouseButton::Left, move |_, _, cx| { @@ -285,23 +283,18 @@ pub mod simple_message_notification { ) .aligned() .top() - .flex_float() - .boxed(), - ) - .boxed(), + .flex_float(), + ), ) .with_children({ let style = theme.action_message.style_for(state, false); if let Some(click_message) = click_message { Some( - Flex::row() - .with_child( - Text::new(click_message, style.text.clone()) - .contained() - .with_style(style.container) - .boxed(), - ) - .boxed(), + Flex::row().with_child( + Text::new(click_message, style.text.clone()) + .contained() + .with_style(style.container), + ), ) } else { None @@ -309,7 +302,6 @@ pub mod simple_message_notification { .into_iter() }) .contained() - .boxed() }) // Since we're not using a proper overlay, we have to capture these extra events .on_down(MouseButton::Left, |_, _, _| {}) @@ -325,7 +317,7 @@ pub mod simple_message_notification { } else { CursorStyle::Arrow }) - .boxed() + .into_element() } } diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index 88ccb677c3..b0b8539ea6 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -1383,7 +1383,7 @@ impl Pane { row.add_child({ enum TabDragReceiver {} let mut receiver = - dragged_item_receiver::(ix, ix, true, None, cx, { + dragged_item_receiver::(ix, ix, true, None, cx, { let item = item.clone(); let pane = pane.clone(); let detail = detail.clone(); @@ -1437,7 +1437,7 @@ impl Pane { ); if let Some(tab_tooltip_text) = tab_tooltip_text { - return mouse_event_handler + mouse_event_handler .with_tooltip::( ix, tab_tooltip_text, @@ -1445,10 +1445,10 @@ impl Pane { tooltip_theme, cx, ) - .boxed(); + .into_element() + } else { + mouse_event_handler.into_element() } - - mouse_event_handler.boxed() } }); @@ -1456,31 +1456,29 @@ impl Pane { receiver = receiver.with_cursor_style(CursorStyle::PointingHand); } - receiver - .as_draggable( - DraggedItem { - item, - pane: pane.clone(), - }, - { - let theme = cx.global::().theme.clone(); + receiver.as_draggable( + DraggedItem { + item, + pane: pane.clone(), + }, + { + let theme = cx.global::().theme.clone(); - let detail = detail.clone(); - move |dragged_item: &DraggedItem, cx: &mut ViewContext| { - let tab_style = &theme.workspace.tab_bar.dragged_tab; - Self::render_dragged_tab( - &dragged_item.item, - dragged_item.pane.clone(), - false, - detail, - false, - &tab_style, - cx, - ) - } - }, - ) - .boxed() + let detail = detail.clone(); + move |dragged_item: &DraggedItem, cx: &mut ViewContext| { + let tab_style = &theme.workspace.tab_bar.dragged_tab; + Self::render_dragged_tab( + &dragged_item.item, + dragged_item.pane.clone(), + false, + detail, + false, + &tab_style, + cx, + ) + } + }, + ) }) } @@ -1490,15 +1488,14 @@ impl Pane { let filler_style = theme.workspace.tab_bar.tab_style(pane_active, false); enum Filler {} row.add_child( - dragged_item_receiver::(0, filler_index, true, None, cx, |_, _| { + dragged_item_receiver::(0, filler_index, true, None, cx, |_, _| { Empty::new() .contained() .with_style(filler_style.container) .with_border(filler_style.container.border) - .boxed() }) .flex(1., true) - .named("filler"), + .into_named_element("filler"), ); row @@ -1582,91 +1579,76 @@ impl Pane { } Flex::row() - .with_child( - Align::new({ - let diameter = 7.0; - let icon_color = if item.has_conflict(cx) { - Some(tab_style.icon_conflict) - } else if item.is_dirty(cx) { - Some(tab_style.icon_dirty) - } else { - None - }; + .with_child({ + let diameter = 7.0; + let icon_color = if item.has_conflict(cx) { + Some(tab_style.icon_conflict) + } else if item.is_dirty(cx) { + Some(tab_style.icon_dirty) + } else { + None + }; - ConstrainedBox::new( - Canvas::new(move |scene, bounds, _, _, _| { - if let Some(color) = icon_color { - let square = RectF::new(bounds.origin(), vec2f(diameter, diameter)); - scene.push_quad(Quad { - bounds: square, - background: Some(color), - border: Default::default(), - corner_radius: diameter / 2., - }); - } - }) - .boxed(), - ) - .with_width(diameter) - .with_height(diameter) - .boxed() + Canvas::new(move |scene, bounds, _, _, _| { + if let Some(color) = icon_color { + let square = RectF::new(bounds.origin(), vec2f(diameter, diameter)); + scene.push_quad(Quad { + bounds: square, + background: Some(color), + border: Default::default(), + corner_radius: diameter / 2., + }); + } }) - .boxed(), - ) + .constrained() + .with_width(diameter) + .with_height(diameter) + .aligned() + }) + .with_child(title.aligned().contained().with_style(ContainerStyle { + margin: Margin { + left: tab_style.spacing, + right: tab_style.spacing, + ..Default::default() + }, + ..Default::default() + })) .with_child( - Container::new(Align::new(title).boxed()) - .with_style(ContainerStyle { - margin: Margin { - left: tab_style.spacing, - right: tab_style.spacing, - ..Default::default() - }, - ..Default::default() + if hovered { + let item_id = item.id(); + enum TabCloseButton {} + let icon = Svg::new("icons/x_mark_8.svg"); + MouseEventHandler::::new(item_id, cx, |mouse_state, _| { + if mouse_state.hovered() { + icon.with_color(tab_style.icon_close_active) + } else { + icon.with_color(tab_style.icon_close) + } }) - .boxed(), - ) - .with_child( - Align::new( - ConstrainedBox::new(if hovered { - let item_id = item.id(); - enum TabCloseButton {} - let icon = Svg::new("icons/x_mark_8.svg"); - MouseEventHandler::::new( - item_id, - cx, - |mouse_state, _| { - if mouse_state.hovered() { - icon.with_color(tab_style.icon_close_active).boxed() - } else { - icon.with_color(tab_style.icon_close).boxed() - } - }, - ) - .with_padding(Padding::uniform(4.)) - .with_cursor_style(CursorStyle::PointingHand) - .on_click(MouseButton::Left, { - let pane = pane.clone(); - move |_, _, cx| { - cx.dispatch_action(CloseItemById { - item_id, - pane: pane.clone(), - }) - } - }) - .named("close-tab-icon") - } else { - Empty::new().boxed() + .with_padding(Padding::uniform(4.)) + .with_cursor_style(CursorStyle::PointingHand) + .on_click(MouseButton::Left, { + let pane = pane.clone(); + move |_, _, cx| { + cx.dispatch_action(CloseItemById { + item_id, + pane: pane.clone(), + }) + } }) - .with_width(tab_style.close_icon_width) - .boxed(), - ) - .boxed(), + .into_named_element("close-tab-icon") + .constrained() + } else { + Empty::new().constrained() + } + .with_width(tab_style.close_icon_width) + .aligned(), ) .contained() .with_style(container) .constrained() .with_height(tab_style.height) - .boxed() + .into_element() } fn render_tab_bar_buttons( @@ -1719,7 +1701,7 @@ impl Pane { .contained() .with_style(theme.workspace.tab_bar.pane_button_container) .flex(1., false) - .boxed() + .into_element() } fn render_blank_pane(&mut self, theme: &Theme, _cx: &mut ViewContext) -> Element { @@ -1727,7 +1709,7 @@ impl Pane { Empty::new() .contained() .with_background_color(background) - .boxed() + .into_element() } } @@ -1743,113 +1725,106 @@ impl View for Pane { fn render(&mut self, cx: &mut ViewContext) -> Element { enum MouseNavigationHandler {} - Stack::new() - .with_child( - MouseEventHandler::::new(0, cx, |_, cx| { - let active_item_index = self.active_item_index; + MouseEventHandler::::new(0, cx, |_, cx| { + let active_item_index = self.active_item_index; - if let Some(active_item) = self.active_item() { - Flex::column() - .with_child({ - let theme = cx.global::().theme.clone(); - - let mut stack = Stack::new(); - - enum TabBarEventHandler {} - stack.add_child( - MouseEventHandler::::new( - 0, - cx, - |_, _| { - Empty::new() - .contained() - .with_style(theme.workspace.tab_bar.container) - .boxed() - }, - ) - .on_down(MouseButton::Left, move |_, _, cx| { - cx.dispatch_action(ActivateItem(active_item_index)); - }) - .boxed(), - ); - - let mut tab_row = Flex::row() - .with_child(self.render_tabs(cx).flex(1., true).named("tabs")); - - if self.is_active { - tab_row.add_child(self.render_tab_bar_buttons(&theme, cx)) - } - - stack.add_child(tab_row.boxed()); - stack - .constrained() - .with_height(theme.workspace.tab_bar.height) - .flex(1., false) - .named("tab bar") - }) - .with_child({ - enum PaneContentTabDropTarget {} - dragged_item_receiver::( - 0, - self.active_item_index + 1, - false, - if self.docked.is_some() { - None - } else { - Some(100.) - }, - cx, - { - let toolbar = self.toolbar.clone(); - let toolbar_hidden = toolbar.read(cx).hidden(); - move |_, cx| { - Flex::column() - .with_children((!toolbar_hidden).then(|| { - ChildView::new(&toolbar, cx).expanded().boxed() - })) - .with_child( - ChildView::new(active_item.as_any(), cx) - .flex(1., true) - .boxed(), - ) - .boxed() - } - }, - ) - .flex(1., true) - .boxed() - }) - .with_child(ChildView::new(&self.tab_context_menu, cx).boxed()) - .boxed() - } else { - enum EmptyPane {} + if let Some(active_item) = self.active_item() { + Flex::column() + .with_child({ let theme = cx.global::().theme.clone(); - dragged_item_receiver::(0, 0, false, None, cx, |_, cx| { - self.render_blank_pane(&theme, cx) - }) - .on_down(MouseButton::Left, |_, _, cx| { - cx.focus_parent_view(); - }) - .boxed() - } + let mut stack = Stack::new(); + + enum TabBarEventHandler {} + stack.add_child( + MouseEventHandler::::new(0, cx, |_, _| { + Empty::new() + .contained() + .with_style(theme.workspace.tab_bar.container) + }) + .on_down( + MouseButton::Left, + move |_, _, cx| { + cx.dispatch_action(ActivateItem(active_item_index)); + }, + ), + ); + + let mut tab_row = Flex::row().with_child( + self.render_tabs(cx) + .flex(1., true) + .into_named_element("tabs"), + ); + + if self.is_active { + tab_row.add_child(self.render_tab_bar_buttons(&theme, cx)) + } + + stack.add_child(tab_row); + stack + .constrained() + .with_height(theme.workspace.tab_bar.height) + .flex(1., false) + .into_named_element("tab bar") + }) + .with_child({ + enum PaneContentTabDropTarget {} + dragged_item_receiver::( + 0, + self.active_item_index + 1, + false, + if self.docked.is_some() { + None + } else { + Some(100.) + }, + cx, + { + let toolbar = self.toolbar.clone(); + let toolbar_hidden = toolbar.read(cx).hidden(); + move |_, cx| { + Flex::column() + .with_children( + (!toolbar_hidden) + .then(|| ChildView::new(&toolbar, cx).expanded()), + ) + .with_child( + ChildView::new(active_item.as_any(), cx).flex(1., true), + ) + } + }, + ) + .flex(1., true) + }) + .with_child(ChildView::new(&self.tab_context_menu, cx)) + .into_element() + } else { + enum EmptyPane {} + let theme = cx.global::().theme.clone(); + + dragged_item_receiver::(0, 0, false, None, cx, |_, cx| { + self.render_blank_pane(&theme, cx) }) - .on_down( - MouseButton::Navigate(NavigationDirection::Back), - move |_, _, cx| { - let pane = cx.weak_handle(); - cx.dispatch_action(GoBack { pane: Some(pane) }); - }, - ) - .on_down(MouseButton::Navigate(NavigationDirection::Forward), { - move |_, _, cx| { - let pane = cx.weak_handle(); - cx.dispatch_action(GoForward { pane: Some(pane) }) - } + .on_down(MouseButton::Left, |_, _, cx| { + cx.focus_parent_view(); }) - .boxed(), - ) - .named("pane") + .into_element() + } + }) + .on_down( + MouseButton::Navigate(NavigationDirection::Back), + move |_, _, cx| { + let pane = cx.weak_handle(); + cx.dispatch_action(GoBack { pane: Some(pane) }); + }, + ) + .on_down(MouseButton::Navigate(NavigationDirection::Forward), { + move |_, _, cx| { + let pane = cx.weak_handle(); + cx.dispatch_action(GoForward { pane: Some(pane) }) + } + }) + .into_named_element("pane") } fn focus_in(&mut self, focused: AnyViewHandle, cx: &mut ViewContext) { @@ -1917,19 +1892,17 @@ fn render_tab_bar_button( .constrained() .with_width(style.button_width) .with_height(style.button_width) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, _, cx| { cx.dispatch_action(action.clone()); - }) - .boxed(), + }), ) .with_children( - context_menu.map(|menu| ChildView::new(&menu, cx).aligned().bottom().right().boxed()), + context_menu.map(|menu| ChildView::new(&menu, cx).aligned().bottom().right()), ) .flex(1., false) - .boxed() + .into_named_element("tab bar button") } impl ItemNavHistory { diff --git a/crates/workspace/src/pane/dragged_item_receiver.rs b/crates/workspace/src/pane/dragged_item_receiver.rs index efbc3ce878..8b20699331 100644 --- a/crates/workspace/src/pane/dragged_item_receiver.rs +++ b/crates/workspace/src/pane/dragged_item_receiver.rs @@ -5,8 +5,7 @@ use gpui::{ geometry::{rect::RectF, vector::Vector2F}, platform::MouseButton, scene::MouseUp, - AppContext, Drawable, Element, EventContext, MouseState, Quad, View, ViewContext, - WeakViewHandle, + AppContext, Drawable, EventContext, MouseState, Quad, View, ViewContext, WeakViewHandle, }; use project::ProjectEntryId; use settings::Settings; @@ -18,7 +17,7 @@ use crate::{ use super::DraggedItem; -pub fn dragged_item_receiver( +pub fn dragged_item_receiver( region_id: usize, drop_index: usize, allow_same_pane: bool, @@ -28,7 +27,8 @@ pub fn dragged_item_receiver( ) -> MouseEventHandler where Tag: 'static, - F: FnOnce(&mut MouseState, &mut ViewContext) -> Element, + D: Drawable, + F: FnOnce(&mut MouseState, &mut ViewContext) -> D, { MouseEventHandler::::above(region_id, cx, |state, cx| { // Observing hovered will cause a render when the mouse enters regardless @@ -69,9 +69,7 @@ where }); } }) - .boxed() })) - .boxed() }) .on_up(MouseButton::Left, { move |event, _, cx| { diff --git a/crates/workspace/src/pane_group.rs b/crates/workspace/src/pane_group.rs index 26cc73bd60..24d2ea78b5 100644 --- a/crates/workspace/src/pane_group.rs +++ b/crates/workspace/src/pane_group.rs @@ -165,7 +165,7 @@ impl Member { Border::default() }; - let prompt = if let Some((_, leader)) = leader { + let leader_status_box = if let Some((_, leader)) = leader { match leader.location { ParticipantLocation::SharedProject { project_id: leader_project_id, @@ -195,7 +195,6 @@ impl Member { .with_style( theme.workspace.external_location_message.container, ) - .boxed() }, ) .with_cursor_style(CursorStyle::PointingHand) @@ -208,7 +207,7 @@ impl Member { .aligned() .bottom() .right() - .boxed(), + .into_element(), ) } } @@ -225,7 +224,7 @@ impl Member { .aligned() .bottom() .right() - .boxed(), + .into_element(), ), ParticipantLocation::External => Some( Label::new( @@ -240,7 +239,7 @@ impl Member { .aligned() .bottom() .right() - .boxed(), + .into_element(), ), } } else { @@ -248,14 +247,9 @@ impl Member { }; Stack::new() - .with_child( - ChildView::new(pane, cx) - .contained() - .with_border(border) - .boxed(), - ) - .with_children(prompt) - .boxed() + .with_child(ChildView::new(pane, cx).contained().with_border(border)) + .with_children(leader_status_box) + .into_element() } Member::Axis(axis) => axis.render( project, @@ -388,12 +382,12 @@ impl PaneAxis { Axis::Vertical => border.bottom = true, Axis::Horizontal => border.right = true, } - member = Container::new(member).with_border(border).boxed(); + member = member.contained().with_border(border).into_element(); } - FlexItem::new(member).flex(flex, true).boxed() + FlexItem::new(member).flex(flex, true) })) - .boxed() + .into_element() } } diff --git a/crates/workspace/src/shared_screen.rs b/crates/workspace/src/shared_screen.rs index f02fbc88f8..b9304b87c9 100644 --- a/crates/workspace/src/shared_screen.rs +++ b/crates/workspace/src/shared_screen.rs @@ -89,10 +89,9 @@ impl View for SharedScreen { }) .contained() .with_style(cx.global::().theme.shared_screen) - .boxed() }) .on_down(MouseButton::Left, |_, _, cx| cx.focus_parent_view()) - .boxed() + .into_element() } } @@ -120,18 +119,16 @@ impl Item for SharedScreen { .with_width(style.type_icon_width) .aligned() .contained() - .with_margin_right(style.spacing) - .boxed(), + .with_margin_right(style.spacing), ) .with_child( Label::new( format!("{}'s screen", self.user.github_login), style.label.clone(), ) - .aligned() - .boxed(), + .aligned(), ) - .boxed() + .into_element() } fn set_nav_history(&mut self, history: ItemNavHistory, _: &mut ViewContext) { diff --git a/crates/workspace/src/sidebar.rs b/crates/workspace/src/sidebar.rs index 8c170a9ee3..3d17278c9c 100644 --- a/crates/workspace/src/sidebar.rs +++ b/crates/workspace/src/sidebar.rs @@ -202,9 +202,9 @@ impl View for Sidebar { style.initial_size, cx, ) - .boxed() + .into_element() } else { - Empty::new().boxed() + Empty::new().into_element() } } } @@ -258,7 +258,7 @@ impl View for SidebarButtons { let is_active = is_open && ix == active_ix; let style = item_style.style_for(state, is_active); Stack::new() - .with_child(Svg::new(icon_path).with_color(style.icon_color).boxed()) + .with_child(Svg::new(icon_path).with_color(style.icon_color)) .with_children(if !is_active && item_view.should_show_badge(cx) { Some( Empty::new() @@ -267,8 +267,7 @@ impl View for SidebarButtons { .with_style(badge_style) .aligned() .bottom() - .right() - .boxed(), + .right(), ) } else { None @@ -278,7 +277,6 @@ impl View for SidebarButtons { .with_height(style.icon_size) .contained() .with_style(style.container) - .boxed() }) .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, { @@ -292,12 +290,11 @@ impl View for SidebarButtons { tooltip_style.clone(), cx, ) - .boxed() }, )) .contained() .with_style(group_style) - .boxed() + .into_element() } } diff --git a/crates/workspace/src/status_bar.rs b/crates/workspace/src/status_bar.rs index 6007fe4850..290ba69e4c 100644 --- a/crates/workspace/src/status_bar.rs +++ b/crates/workspace/src/status_bar.rs @@ -56,9 +56,8 @@ impl View for StatusBar { .aligned() .contained() .with_margin_right(theme.item_spacing) - .boxed() })) - .boxed(), + .into_element(), right: Flex::row() .with_children(self.right_items.iter().rev().map(|i| { @@ -66,15 +65,14 @@ impl View for StatusBar { .aligned() .contained() .with_margin_left(theme.item_spacing) - .boxed() })) - .boxed(), + .into_element(), } .contained() .with_style(theme.container) .constrained() .with_height(theme.height) - .boxed() + .into_element() } } diff --git a/crates/workspace/src/toolbar.rs b/crates/workspace/src/toolbar.rs index 291936aaa5..d4b4d6fb2f 100644 --- a/crates/workspace/src/toolbar.rs +++ b/crates/workspace/src/toolbar.rs @@ -77,9 +77,9 @@ impl View for Toolbar { .contained() .with_margin_right(spacing); if let Some((flex, expanded)) = flex { - primary_left_items.push(left_item.flex(flex, expanded).boxed()); + primary_left_items.push(left_item.flex(flex, expanded).into_element()); } else { - primary_left_items.push(left_item.boxed()); + primary_left_items.push(left_item.into_element()); } } @@ -90,9 +90,9 @@ impl View for Toolbar { .with_margin_left(spacing) .flex_float(); if let Some((flex, expanded)) = flex { - primary_right_items.push(right_item.flex(flex, expanded).boxed()); + primary_right_items.push(right_item.flex(flex, expanded).into_element()); } else { - primary_right_items.push(right_item.boxed()); + primary_right_items.push(right_item.into_element()); } } @@ -101,7 +101,7 @@ impl View for Toolbar { ChildView::new(item.as_any(), cx) .constrained() .with_height(theme.height) - .boxed(), + .into_element(), ); } } @@ -151,13 +151,12 @@ impl View for Toolbar { .with_children(primary_left_items) .with_children(primary_right_items) .constrained() - .with_height(height) - .boxed(), + .with_height(height), ) .with_children(secondary_item) .contained() .with_style(container_style) - .boxed() + .into_named_element("toolbar") } } @@ -190,7 +189,6 @@ fn nav_button( .with_width(style.button_width) .with_height(style.button_width) .aligned() - .boxed() }) .with_cursor_style(if enabled { CursorStyle::PointingHand @@ -209,7 +207,7 @@ fn nav_button( ) .contained() .with_margin_right(spacing) - .boxed() + .into_named_element("nav button") } impl Toolbar { diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 38082548a2..77eabb8d64 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -2088,29 +2088,24 @@ impl Workspace { }; enum TitleBar {} - ConstrainedBox::new( - MouseEventHandler::::new(0, cx, |_, cx| { - Container::new( - Stack::new() - .with_children( - self.titlebar_item - .as_ref() - .map(|item| ChildView::new(item, cx).boxed()), - ) - .boxed(), + MouseEventHandler::::new(0, cx, |_, cx| { + Stack::new() + .with_children( + self.titlebar_item + .as_ref() + .map(|item| ChildView::new(item, cx)), ) + .contained() .with_style(container_theme) - .boxed() - }) - .on_click(MouseButton::Left, |event, _, cx| { - if event.click_count == 2 { - cx.zoom_window(); - } - }) - .boxed(), - ) + }) + .on_click(MouseButton::Left, |event, _, cx| { + if event.click_count == 2 { + cx.zoom_window(); + } + }) + .constrained() .with_height(theme.workspace.titlebar.height) - .named("titlebar") + .into_named_element("titlebar") } fn active_item_path_changed(&mut self, cx: &mut ViewContext) { @@ -2191,11 +2186,10 @@ impl Workspace { .aligned() .contained() .with_style(theme.workspace.disconnected_overlay.container) - .boxed() }) .with_cursor_style(CursorStyle::Arrow) .capture_all() - .boxed(), + .into_named_element("disconnected overlay"), ) } else { None @@ -2216,7 +2210,6 @@ impl Workspace { ChildView::new(notification.as_any(), cx) .contained() .with_style(theme.notification) - .boxed() })) .constrained() .with_width(theme.notifications.width) @@ -2225,7 +2218,7 @@ impl Workspace { .aligned() .bottom() .right() - .boxed(), + .into_element(), ) } } @@ -2857,8 +2850,7 @@ impl View for Workspace { constraint.max.y(), ), ) - }) - .boxed(), + }), ) } else { None @@ -2876,18 +2868,15 @@ impl View for Workspace { self.active_pane(), cx, )) - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_children(self.dock.render( &theme, DockAnchor::Bottom, cx, - )) - .boxed(), + )), ) - .flex(1., true) - .boxed(), + .flex(1., true), ) .with_children(self.dock.render(&theme, DockAnchor::Right, cx)) .with_children( @@ -2903,49 +2892,38 @@ impl View for Workspace { constraint.max.y(), ), ) - }) - .boxed(), + }), ) } else { None }, ) - .boxed() }) - .with_child( - Overlay::new( - Stack::new() - .with_children(self.dock.render( - &theme, - DockAnchor::Expanded, - cx, - )) - .with_children(self.modal.as_ref().map(|modal| { - ChildView::new(modal, cx) - .contained() - .with_style(theme.workspace.modal) - .aligned() - .top() - .boxed() - })) - .with_children( - self.render_notifications(&theme.workspace, cx), - ) - .boxed(), - ) - .boxed(), - ) - .flex(1.0, true) - .boxed(), + .with_child(Overlay::new( + Stack::new() + .with_children(self.dock.render( + &theme, + DockAnchor::Expanded, + cx, + )) + .with_children(self.modal.as_ref().map(|modal| { + ChildView::new(modal, cx) + .contained() + .with_style(theme.workspace.modal) + .aligned() + .top() + })) + .with_children(self.render_notifications(&theme.workspace, cx)), + )) + .flex(1.0, true), ) - .with_child(ChildView::new(&self.status_bar, cx).boxed()) + .with_child(ChildView::new(&self.status_bar, cx)) .contained() - .with_background_color(theme.workspace.background) - .boxed(), + .with_background_color(theme.workspace.background), ) .with_children(DragAndDrop::render(cx)) .with_children(self.render_disconnected_overlay(cx)) - .named("workspace") + .into_named_element("workspace") } fn focus_in(&mut self, view: AnyViewHandle, cx: &mut ViewContext) {