Assign unique color indices to room participants, use those instead of replica_ids
Co-authored-by: Conrad <conrad@zed.dev> Co-authored-by: Antonio <antonio@zed.dev>
This commit is contained in:
parent
7711530704
commit
545b5e0161
35 changed files with 707 additions and 639 deletions
|
@ -4,7 +4,10 @@ use crate::{
|
|||
};
|
||||
use crate::{AutosaveSetting, DelayedDebouncedEditAction, WorkspaceSettings};
|
||||
use anyhow::Result;
|
||||
use client::{proto, Client};
|
||||
use client::{
|
||||
proto::{self, PeerId},
|
||||
Client,
|
||||
};
|
||||
use gpui::geometry::vector::Vector2F;
|
||||
use gpui::AnyWindowHandle;
|
||||
use gpui::{
|
||||
|
@ -698,13 +701,13 @@ pub trait FollowableItem: Item {
|
|||
) -> Task<Result<()>>;
|
||||
fn is_project_item(&self, cx: &AppContext) -> bool;
|
||||
|
||||
fn set_leader_replica_id(&mut self, leader_replica_id: Option<u16>, cx: &mut ViewContext<Self>);
|
||||
fn set_leader_peer_id(&mut self, leader_peer_id: Option<PeerId>, cx: &mut ViewContext<Self>);
|
||||
fn should_unfollow_on_event(event: &Self::Event, cx: &AppContext) -> bool;
|
||||
}
|
||||
|
||||
pub trait FollowableItemHandle: ItemHandle {
|
||||
fn remote_id(&self, client: &Arc<Client>, cx: &AppContext) -> Option<ViewId>;
|
||||
fn set_leader_replica_id(&self, leader_replica_id: Option<u16>, cx: &mut WindowContext);
|
||||
fn set_leader_peer_id(&self, leader_peer_id: Option<PeerId>, cx: &mut WindowContext);
|
||||
fn to_state_proto(&self, cx: &AppContext) -> Option<proto::view::Variant>;
|
||||
fn add_event_to_update_proto(
|
||||
&self,
|
||||
|
@ -732,10 +735,8 @@ impl<T: FollowableItem> FollowableItemHandle for ViewHandle<T> {
|
|||
})
|
||||
}
|
||||
|
||||
fn set_leader_replica_id(&self, leader_replica_id: Option<u16>, cx: &mut WindowContext) {
|
||||
self.update(cx, |this, cx| {
|
||||
this.set_leader_replica_id(leader_replica_id, cx)
|
||||
})
|
||||
fn set_leader_peer_id(&self, leader_peer_id: Option<PeerId>, cx: &mut WindowContext) {
|
||||
self.update(cx, |this, cx| this.set_leader_peer_id(leader_peer_id, cx))
|
||||
}
|
||||
|
||||
fn to_state_proto(&self, cx: &AppContext) -> Option<proto::view::Variant> {
|
||||
|
|
|
@ -183,25 +183,23 @@ impl Member {
|
|||
})
|
||||
.and_then(|leader_id| {
|
||||
let room = active_call?.read(cx).room()?.read(cx);
|
||||
let collaborator = project.read(cx).collaborators().get(leader_id)?;
|
||||
let participant = room.remote_participant_for_peer_id(*leader_id)?;
|
||||
Some((collaborator.replica_id, participant))
|
||||
room.remote_participant_for_peer_id(*leader_id)
|
||||
});
|
||||
|
||||
let border = if let Some((replica_id, _)) = leader.as_ref() {
|
||||
let leader_color = theme.editor.replica_selection_style(*replica_id).cursor;
|
||||
let mut border = Border::all(theme.workspace.leader_border_width, leader_color);
|
||||
border
|
||||
let mut leader_border = Border::default();
|
||||
let mut leader_status_box = None;
|
||||
if let Some(leader) = &leader {
|
||||
let leader_color = theme
|
||||
.editor
|
||||
.replica_selection_style(leader.color_index)
|
||||
.cursor;
|
||||
leader_border = Border::all(theme.workspace.leader_border_width, leader_color);
|
||||
leader_border
|
||||
.color
|
||||
.fade_out(1. - theme.workspace.leader_border_opacity);
|
||||
border.overlay = true;
|
||||
border
|
||||
} else {
|
||||
Border::default()
|
||||
};
|
||||
leader_border.overlay = true;
|
||||
|
||||
let leader_status_box = if let Some((_, leader)) = leader {
|
||||
match leader.location {
|
||||
leader_status_box = match leader.location {
|
||||
ParticipantLocation::SharedProject {
|
||||
project_id: leader_project_id,
|
||||
} => {
|
||||
|
@ -279,13 +277,11 @@ impl Member {
|
|||
.right()
|
||||
.into_any(),
|
||||
),
|
||||
}
|
||||
} else {
|
||||
None
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
Stack::new()
|
||||
.with_child(pane_element.contained().with_border(border))
|
||||
.with_child(pane_element.contained().with_border(leader_border))
|
||||
.with_children(leader_status_box)
|
||||
.into_any()
|
||||
}
|
||||
|
|
|
@ -2423,7 +2423,7 @@ impl Workspace {
|
|||
if let Some(states_by_pane) = self.follower_states_by_leader.remove(&peer_id) {
|
||||
for state in states_by_pane.into_values() {
|
||||
for item in state.items_by_leader_view_id.into_values() {
|
||||
item.set_leader_replica_id(None, cx);
|
||||
item.set_leader_peer_id(None, cx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2527,7 +2527,7 @@ impl Workspace {
|
|||
let leader_id = *leader_id;
|
||||
if let Some(state) = states_by_pane.remove(pane) {
|
||||
for (_, item) in state.items_by_leader_view_id {
|
||||
item.set_leader_replica_id(None, cx);
|
||||
item.set_leader_peer_id(None, cx);
|
||||
}
|
||||
|
||||
if states_by_pane.is_empty() {
|
||||
|
@ -2828,16 +2828,6 @@ impl Workspace {
|
|||
let this = this
|
||||
.upgrade(cx)
|
||||
.ok_or_else(|| anyhow!("workspace dropped"))?;
|
||||
let project = this
|
||||
.read_with(cx, |this, _| this.project.clone())
|
||||
.ok_or_else(|| anyhow!("window dropped"))?;
|
||||
|
||||
let replica_id = project.read_with(cx, |project, _| {
|
||||
project
|
||||
.collaborators()
|
||||
.get(&leader_id)
|
||||
.map(|c| c.replica_id)
|
||||
});
|
||||
|
||||
let item_builders = cx.update(|cx| {
|
||||
cx.default_global::<FollowableItemBuilders>()
|
||||
|
@ -2882,7 +2872,7 @@ impl Workspace {
|
|||
.get_mut(&pane)?;
|
||||
|
||||
for (id, item) in leader_view_ids.into_iter().zip(items) {
|
||||
item.set_leader_replica_id(replica_id, cx);
|
||||
item.set_leader_peer_id(Some(leader_id), cx);
|
||||
state.items_by_leader_view_id.insert(id, item);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue