From 25ff5959fb72b7658ba0f080c62ba2238c13fbec Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Mon, 10 Oct 2022 12:23:50 +0200 Subject: [PATCH] Superimpose external location message on active view --- crates/workspace/src/pane_group.rs | 120 +++++++++++++++++------------ styles/src/styleTree/workspace.ts | 6 +- 2 files changed, 74 insertions(+), 52 deletions(-) diff --git a/crates/workspace/src/pane_group.rs b/crates/workspace/src/pane_group.rs index 9fd27f78b5a4517f74091a52e1875eaecdbe2f80..694f6a55eb44d42f5dacf6d9419aa013908d1b7b 100644 --- a/crates/workspace/src/pane_group.rs +++ b/crates/workspace/src/pane_group.rs @@ -127,68 +127,86 @@ impl Member { Some((collaborator.replica_id, participant)) }); - if let Some((replica_id, leader)) = leader { - let view = match leader.location { + let mut border = Border::default(); + + let prompt = if let Some((replica_id, leader)) = leader { + let leader_color = theme.editor.replica_selection_style(replica_id).cursor; + border = Border::all(theme.workspace.leader_border_width, leader_color); + border + .color + .fade_out(1. - theme.workspace.leader_border_opacity); + border.overlay = true; + + match leader.location { call::ParticipantLocation::Project { project_id: leader_project_id, } => { if Some(leader_project_id) == project.read(cx).remote_id() { - ChildView::new(pane).boxed() + None } else { let leader_user = leader.user.clone(); let leader_user_id = leader.user.id; - MouseEventHandler::::new( - pane.id(), - cx, - |_, _| { - Label::new( - format!( - "Follow {} on their currently active project", - leader_user.github_login, - ), - theme.workspace.external_location_message.text.clone(), - ) - .contained() - .with_style( - theme.workspace.external_location_message.container, - ) - .boxed() - }, - ) - .with_cursor_style(CursorStyle::PointingHand) - .on_click(MouseButton::Left, move |_, cx| { - cx.dispatch_action(JoinProject { - project_id: leader_project_id, - follow_user_id: leader_user_id, + Some( + MouseEventHandler::::new( + pane.id(), + cx, + |_, _| { + Label::new( + format!( + "Follow {} on their currently active project", + leader_user.github_login, + ), + theme + .workspace + .external_location_message + .text + .clone(), + ) + .contained() + .with_style( + theme.workspace.external_location_message.container, + ) + .boxed() + }, + ) + .with_cursor_style(CursorStyle::PointingHand) + .on_click(MouseButton::Left, move |_, cx| { + cx.dispatch_action(JoinProject { + project_id: leader_project_id, + follow_user_id: leader_user_id, + }) }) - }) - .aligned() - .boxed() + .aligned() + .bottom() + .right() + .boxed(), + ) } } - call::ParticipantLocation::External => Label::new( - format!( - "{} is viewing a window outside of Zed", - leader.user.github_login - ), - theme.workspace.external_location_message.text.clone(), - ) - .contained() - .with_style(theme.workspace.external_location_message.container) - .aligned() - .boxed(), - }; - - let leader_color = theme.editor.replica_selection_style(replica_id).cursor; - let mut border = Border::all(theme.workspace.leader_border_width, leader_color); - border - .color - .fade_out(1. - theme.workspace.leader_border_opacity); - border.overlay = true; - Container::new(view).with_border(border).boxed() + call::ParticipantLocation::External => Some( + Label::new( + format!( + "{} is viewing a window outside of Zed", + leader.user.github_login + ), + theme.workspace.external_location_message.text.clone(), + ) + .contained() + .with_style(theme.workspace.external_location_message.container) + .aligned() + .bottom() + .right() + .boxed(), + ), + } } else { - ChildView::new(pane).boxed() - } + None + }; + + Stack::new() + .with_child(ChildView::new(pane).contained().with_border(border).boxed()) + .with_children(prompt) + .boxed() } Member::Axis(axis) => axis.render(project, theme, follower_states, cx), } diff --git a/styles/src/styleTree/workspace.ts b/styles/src/styleTree/workspace.ts index c970c382960cd776cc977ed1141e853ae740e863..4deee046b4298ae3b98bda8b0d87d7c4ab766ef8 100644 --- a/styles/src/styleTree/workspace.ts +++ b/styles/src/styleTree/workspace.ts @@ -48,8 +48,12 @@ export default function workspace(theme: Theme) { ...text(theme, "sans", "primary", { size: "lg" }), }, externalLocationMessage: { + background: backgroundColor(theme, "info"), + border: border(theme, "secondary"), + cornerRadius: 6, padding: 12, - ...text(theme, "sans", "primary", { size: "lg" }), + margin: { bottom: 8, right: 8 }, + ...text(theme, "sans", "secondary", { size: "xs" }), }, leaderBorderOpacity: 0.7, leaderBorderWidth: 2.0,