Fix collab panel regressions (#2915)

Max Brunsfeld created

Release Notes:

- Fixed a bug where collaborators' cursors were rendered with the wrong
color when not following them (preview only).
- Fixed an issue where icons were inconsistent sizes in the
collaboration panel (preview only).

Change summary

crates/collab_ui/src/collab_panel.rs | 84 ++++++-----------------------
crates/editor/src/element.rs         |  2 
2 files changed, 20 insertions(+), 66 deletions(-)

Detailed changes

crates/collab_ui/src/collab_panel.rs 🔗

@@ -1106,23 +1106,17 @@ impl CollabPanel {
     ) -> AnyElement<Self> {
         enum OpenSharedScreen {}
 
-        let font_cache = cx.font_cache();
-        let host_avatar_height = theme
+        let host_avatar_width = theme
             .contact_avatar
             .width
             .or(theme.contact_avatar.height)
             .unwrap_or(0.);
-        let row = &theme.project_row.inactive_state().default;
         let tree_branch = theme.tree_branch;
-        let line_height = row.name.text.line_height(font_cache);
-        let cap_height = row.name.text.cap_height(font_cache);
-        let baseline_offset =
-            row.name.text.baseline_offset(font_cache) + (theme.row_height - line_height) / 2.;
 
         MouseEventHandler::new::<OpenSharedScreen, _>(
             peer_id.as_u64() as usize,
             cx,
-            |mouse_state, _| {
+            |mouse_state, cx| {
                 let tree_branch = *tree_branch.in_state(is_selected).style_for(mouse_state);
                 let row = theme
                     .project_row
@@ -1130,49 +1124,20 @@ impl CollabPanel {
                     .style_for(mouse_state);
 
                 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.);
-
-                                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_radii: (0.).into(),
-                                });
-                                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_radii: (0.).into(),
-                                });
-                            }))
-                            .constrained()
-                            .with_width(host_avatar_height),
-                    )
+                    .with_child(render_tree_branch(
+                        tree_branch,
+                        &row.name.text,
+                        is_last,
+                        vec2f(host_avatar_width, theme.row_height),
+                        cx.font_cache(),
+                    ))
                     .with_child(
                         Svg::new("icons/disable_screen_sharing_12.svg")
-                            .with_color(row.icon.color)
+                            .with_color(theme.channel_hash.color)
                             .constrained()
-                            .with_width(row.icon.width)
+                            .with_width(theme.channel_hash.width)
                             .aligned()
-                            .left()
-                            .contained()
-                            .with_style(row.icon.container),
+                            .left(),
                     )
                     .with_child(
                         Label::new("Screen", row.name.text.clone())
@@ -2553,27 +2518,16 @@ impl View for CollabPanel {
                 .with_child(
                     Flex::column()
                         .with_child(
-                            Flex::row()
-                                .with_child(
-                                    ChildView::new(&self.filter_editor, cx)
-                                        .contained()
-                                        .with_style(theme.user_query_editor.container)
-                                        .flex(1.0, true),
-                                )
-                                .constrained()
-                                .with_width(self.size(cx)),
-                        )
-                        .with_child(
-                            List::new(self.list_state.clone())
-                                .constrained()
-                                .with_width(self.size(cx))
-                                .flex(1., true)
-                                .into_any(),
+                            Flex::row().with_child(
+                                ChildView::new(&self.filter_editor, cx)
+                                    .contained()
+                                    .with_style(theme.user_query_editor.container)
+                                    .flex(1.0, true),
+                            ),
                         )
+                        .with_child(List::new(self.list_state.clone()).flex(1., true).into_any())
                         .contained()
                         .with_style(theme.container)
-                        .constrained()
-                        .with_width(self.size(cx))
                         .into_any(),
                 )
                 .with_children(

crates/editor/src/element.rs 🔗

@@ -2251,7 +2251,7 @@ impl Element<Editor> for EditorElement {
             let replica_id = if let Some(mapping) = &editor.replica_id_mapping {
                 mapping.get(&replica_id).copied()
             } else {
-                None
+                Some(replica_id)
             };
 
             // The local selections match the leader's selections.