Rename color_index to participant_index

Co-authored-by: Conrad <conrad@zed.dev>
This commit is contained in:
Max Brunsfeld 2023-09-28 11:18:29 -07:00
parent 545b5e0161
commit 0f39b63801
17 changed files with 97 additions and 80 deletions

View file

@ -1,4 +1,5 @@
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use client::ParticipantIndex;
use client::{proto, User}; use client::{proto, User};
use collections::HashMap; use collections::HashMap;
use gpui::WeakModelHandle; use gpui::WeakModelHandle;
@ -6,7 +7,6 @@ pub use live_kit_client::Frame;
use live_kit_client::RemoteAudioTrack; use live_kit_client::RemoteAudioTrack;
use project::Project; use project::Project;
use std::{fmt, sync::Arc}; use std::{fmt, sync::Arc};
use theme::ColorIndex;
#[derive(Copy, Clone, Debug, Eq, PartialEq)] #[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum ParticipantLocation { pub enum ParticipantLocation {
@ -44,7 +44,7 @@ pub struct RemoteParticipant {
pub peer_id: proto::PeerId, pub peer_id: proto::PeerId,
pub projects: Vec<proto::ParticipantProject>, pub projects: Vec<proto::ParticipantProject>,
pub location: ParticipantLocation, pub location: ParticipantLocation,
pub color_index: ColorIndex, pub participant_index: ParticipantIndex,
pub muted: bool, pub muted: bool,
pub speaking: bool, pub speaking: bool,
pub video_tracks: HashMap<live_kit_client::Sid, Arc<RemoteVideoTrack>>, pub video_tracks: HashMap<live_kit_client::Sid, Arc<RemoteVideoTrack>>,

View file

@ -7,7 +7,7 @@ use anyhow::{anyhow, Result};
use audio::{Audio, Sound}; use audio::{Audio, Sound};
use client::{ use client::{
proto::{self, PeerId}, proto::{self, PeerId},
Client, TypedEnvelope, User, UserStore, Client, ParticipantIndex, TypedEnvelope, User, UserStore,
}; };
use collections::{BTreeMap, HashMap, HashSet}; use collections::{BTreeMap, HashMap, HashSet};
use fs::Fs; use fs::Fs;
@ -21,7 +21,6 @@ use live_kit_client::{
use postage::stream::Stream; use postage::stream::Stream;
use project::Project; use project::Project;
use std::{future::Future, mem, pin::Pin, sync::Arc, time::Duration}; use std::{future::Future, mem, pin::Pin, sync::Arc, time::Duration};
use theme::ColorIndex;
use util::{post_inc, ResultExt, TryFutureExt}; use util::{post_inc, ResultExt, TryFutureExt};
pub const RECONNECT_TIMEOUT: Duration = Duration::from_secs(30); pub const RECONNECT_TIMEOUT: Duration = Duration::from_secs(30);
@ -715,7 +714,9 @@ impl Room {
participant.user_id, participant.user_id,
RemoteParticipant { RemoteParticipant {
user: user.clone(), user: user.clone(),
color_index: ColorIndex(participant.color_index), participant_index: ParticipantIndex(
participant.participant_index,
),
peer_id, peer_id,
projects: participant.projects, projects: participant.projects,
location, location,
@ -810,12 +811,12 @@ impl Room {
} }
this.user_store.update(cx, |user_store, cx| { this.user_store.update(cx, |user_store, cx| {
let color_indices_by_user_id = this let participant_indices_by_user_id = this
.remote_participants .remote_participants
.iter() .iter()
.map(|(user_id, participant)| (*user_id, participant.color_index)) .map(|(user_id, participant)| (*user_id, participant.participant_index))
.collect(); .collect();
user_store.set_color_indices(color_indices_by_user_id, cx); user_store.set_participant_indices(participant_indices_by_user_id, cx);
}); });
this.check_invariants(); this.check_invariants();

View file

@ -8,12 +8,14 @@ use postage::{sink::Sink, watch};
use rpc::proto::{RequestMessage, UsersResponse}; use rpc::proto::{RequestMessage, UsersResponse};
use std::sync::{Arc, Weak}; use std::sync::{Arc, Weak};
use text::ReplicaId; use text::ReplicaId;
use theme::ColorIndex;
use util::http::HttpClient; use util::http::HttpClient;
use util::TryFutureExt as _; use util::TryFutureExt as _;
pub type UserId = u64; pub type UserId = u64;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ParticipantIndex(pub u32);
#[derive(Default, Debug)] #[derive(Default, Debug)]
pub struct User { pub struct User {
pub id: UserId, pub id: UserId,
@ -65,7 +67,7 @@ pub enum ContactRequestStatus {
pub struct UserStore { pub struct UserStore {
users: HashMap<u64, Arc<User>>, users: HashMap<u64, Arc<User>>,
color_indices: HashMap<u64, ColorIndex>, participant_indices: HashMap<u64, ParticipantIndex>,
update_contacts_tx: mpsc::UnboundedSender<UpdateContacts>, update_contacts_tx: mpsc::UnboundedSender<UpdateContacts>,
current_user: watch::Receiver<Option<Arc<User>>>, current_user: watch::Receiver<Option<Arc<User>>>,
contacts: Vec<Arc<Contact>>, contacts: Vec<Arc<Contact>>,
@ -91,7 +93,7 @@ pub enum Event {
kind: ContactEventKind, kind: ContactEventKind,
}, },
ShowContacts, ShowContacts,
ColorIndicesChanged, ParticipantIndicesChanged,
} }
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
@ -129,7 +131,7 @@ impl UserStore {
current_user: current_user_rx, current_user: current_user_rx,
contacts: Default::default(), contacts: Default::default(),
incoming_contact_requests: Default::default(), incoming_contact_requests: Default::default(),
color_indices: Default::default(), participant_indices: Default::default(),
outgoing_contact_requests: Default::default(), outgoing_contact_requests: Default::default(),
invite_info: None, invite_info: None,
client: Arc::downgrade(&client), client: Arc::downgrade(&client),
@ -654,19 +656,19 @@ impl UserStore {
}) })
} }
pub fn set_color_indices( pub fn set_participant_indices(
&mut self, &mut self,
color_indices: HashMap<u64, ColorIndex>, participant_indices: HashMap<u64, ParticipantIndex>,
cx: &mut ModelContext<Self>, cx: &mut ModelContext<Self>,
) { ) {
if color_indices != self.color_indices { if participant_indices != self.participant_indices {
self.color_indices = color_indices; self.participant_indices = participant_indices;
cx.emit(Event::ColorIndicesChanged); cx.emit(Event::ParticipantIndicesChanged);
} }
} }
pub fn color_indices(&self) -> &HashMap<u64, ColorIndex> { pub fn participant_indices(&self) -> &HashMap<u64, ParticipantIndex> {
&self.color_indices &self.participant_indices
} }
} }

View file

@ -159,7 +159,7 @@ CREATE TABLE "room_participants" (
"calling_user_id" INTEGER NOT NULL REFERENCES users (id), "calling_user_id" INTEGER NOT NULL REFERENCES users (id),
"calling_connection_id" INTEGER NOT NULL, "calling_connection_id" INTEGER NOT NULL,
"calling_connection_server_id" INTEGER REFERENCES servers (id) ON DELETE SET NULL, "calling_connection_server_id" INTEGER REFERENCES servers (id) ON DELETE SET NULL,
"color_index" INTEGER "participant_index" INTEGER
); );
CREATE UNIQUE INDEX "index_room_participants_on_user_id" ON "room_participants" ("user_id"); CREATE UNIQUE INDEX "index_room_participants_on_user_id" ON "room_participants" ("user_id");
CREATE INDEX "index_room_participants_on_room_id" ON "room_participants" ("room_id"); CREATE INDEX "index_room_participants_on_room_id" ON "room_participants" ("room_id");

View file

@ -1 +0,0 @@
ALTER TABLE room_participants ADD COLUMN color_index INTEGER;

View file

@ -0,0 +1 @@
ALTER TABLE room_participants ADD COLUMN participant_index INTEGER;

View file

@ -152,7 +152,7 @@ impl Database {
room_id: ActiveValue::set(room_id), room_id: ActiveValue::set(room_id),
user_id: ActiveValue::set(called_user_id), user_id: ActiveValue::set(called_user_id),
answering_connection_lost: ActiveValue::set(false), answering_connection_lost: ActiveValue::set(false),
color_index: ActiveValue::NotSet, participant_index: ActiveValue::NotSet,
calling_user_id: ActiveValue::set(calling_user_id), calling_user_id: ActiveValue::set(calling_user_id),
calling_connection_id: ActiveValue::set(calling_connection.id as i32), calling_connection_id: ActiveValue::set(calling_connection.id as i32),
calling_connection_server_id: ActiveValue::set(Some(ServerId( calling_connection_server_id: ActiveValue::set(Some(ServerId(
@ -285,19 +285,19 @@ impl Database {
.ok_or_else(|| anyhow!("no such room"))?; .ok_or_else(|| anyhow!("no such room"))?;
#[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)] #[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)]
enum QueryColorIndices { enum QueryParticipantIndices {
ColorIndex, ParticipantIndex,
} }
let existing_color_indices: Vec<i32> = room_participant::Entity::find() let existing_participant_indices: Vec<i32> = room_participant::Entity::find()
.filter(room_participant::Column::RoomId.eq(room_id)) .filter(room_participant::Column::RoomId.eq(room_id))
.select_only() .select_only()
.column(room_participant::Column::ColorIndex) .column(room_participant::Column::ParticipantIndex)
.into_values::<_, QueryColorIndices>() .into_values::<_, QueryParticipantIndices>()
.all(&*tx) .all(&*tx)
.await?; .await?;
let mut color_index = 0; let mut participant_index = 0;
while existing_color_indices.contains(&color_index) { while existing_participant_indices.contains(&participant_index) {
color_index += 1; participant_index += 1;
} }
if let Some(channel_id) = channel_id { if let Some(channel_id) = channel_id {
@ -317,7 +317,7 @@ impl Database {
calling_connection_server_id: ActiveValue::set(Some(ServerId( calling_connection_server_id: ActiveValue::set(Some(ServerId(
connection.owner_id as i32, connection.owner_id as i32,
))), ))),
color_index: ActiveValue::Set(color_index), participant_index: ActiveValue::Set(participant_index),
..Default::default() ..Default::default()
}]) }])
.on_conflict( .on_conflict(
@ -340,7 +340,7 @@ impl Database {
.add(room_participant::Column::AnsweringConnectionId.is_null()), .add(room_participant::Column::AnsweringConnectionId.is_null()),
) )
.set(room_participant::ActiveModel { .set(room_participant::ActiveModel {
color_index: ActiveValue::Set(color_index), participant_index: ActiveValue::Set(participant_index),
answering_connection_id: ActiveValue::set(Some(connection.id as i32)), answering_connection_id: ActiveValue::set(Some(connection.id as i32)),
answering_connection_server_id: ActiveValue::set(Some(ServerId( answering_connection_server_id: ActiveValue::set(Some(ServerId(
connection.owner_id as i32, connection.owner_id as i32,
@ -1090,7 +1090,7 @@ impl Database {
peer_id: Some(answering_connection.into()), peer_id: Some(answering_connection.into()),
projects: Default::default(), projects: Default::default(),
location: Some(proto::ParticipantLocation { variant: location }), location: Some(proto::ParticipantLocation { variant: location }),
color_index: db_participant.color_index as u32, participant_index: db_participant.participant_index as u32,
}, },
); );
} else { } else {

View file

@ -18,7 +18,7 @@ pub struct Model {
pub calling_user_id: UserId, pub calling_user_id: UserId,
pub calling_connection_id: i32, pub calling_connection_id: i32,
pub calling_connection_server_id: Option<ServerId>, pub calling_connection_server_id: Option<ServerId>,
pub color_index: i32, pub participant_index: i32,
} }
impl Model { impl Model {

View file

@ -4,6 +4,7 @@ use crate::{
}; };
use call::ActiveCall; use call::ActiveCall;
use channel::Channel; use channel::Channel;
use client::ParticipantIndex;
use client::{Collaborator, UserId}; use client::{Collaborator, UserId};
use collab_ui::channel_view::ChannelView; use collab_ui::channel_view::ChannelView;
use collections::HashMap; use collections::HashMap;
@ -13,7 +14,6 @@ use gpui::{executor::Deterministic, ModelHandle, TestAppContext, ViewContext};
use rpc::{proto::PeerId, RECEIVE_TIMEOUT}; use rpc::{proto::PeerId, RECEIVE_TIMEOUT};
use serde_json::json; use serde_json::json;
use std::{ops::Range, sync::Arc}; use std::{ops::Range, sync::Arc};
use theme::ColorIndex;
#[gpui::test] #[gpui::test]
async fn test_core_channel_buffers( async fn test_core_channel_buffers(
@ -122,7 +122,7 @@ async fn test_core_channel_buffers(
} }
#[gpui::test] #[gpui::test]
async fn test_channel_notes_color_indices( async fn test_channel_notes_participant_indices(
deterministic: Arc<Deterministic>, deterministic: Arc<Deterministic>,
mut cx_a: &mut TestAppContext, mut cx_a: &mut TestAppContext,
mut cx_b: &mut TestAppContext, mut cx_b: &mut TestAppContext,
@ -226,12 +226,20 @@ async fn test_channel_notes_color_indices(
deterministic.run_until_parked(); deterministic.run_until_parked();
channel_view_a.update(cx_a, |notes, cx| { channel_view_a.update(cx_a, |notes, cx| {
notes.editor.update(cx, |editor, cx| { notes.editor.update(cx, |editor, cx| {
assert_remote_selections(editor, &[(Some(ColorIndex(1)), 1..2), (None, 2..3)], cx); assert_remote_selections(
editor,
&[(Some(ParticipantIndex(1)), 1..2), (None, 2..3)],
cx,
);
}); });
}); });
channel_view_b.update(cx_b, |notes, cx| { channel_view_b.update(cx_b, |notes, cx| {
notes.editor.update(cx, |editor, cx| { notes.editor.update(cx, |editor, cx| {
assert_remote_selections(editor, &[(Some(ColorIndex(0)), 0..1), (None, 2..3)], cx); assert_remote_selections(
editor,
&[(Some(ParticipantIndex(0)), 0..1), (None, 2..3)],
cx,
);
}); });
}); });
@ -275,17 +283,17 @@ async fn test_channel_notes_color_indices(
// Clients A and B see each other with the same colors as in the channel notes. // Clients A and B see each other with the same colors as in the channel notes.
editor_a.update(cx_a, |editor, cx| { editor_a.update(cx_a, |editor, cx| {
assert_remote_selections(editor, &[(Some(ColorIndex(1)), 2..3)], cx); assert_remote_selections(editor, &[(Some(ParticipantIndex(1)), 2..3)], cx);
}); });
editor_b.update(cx_b, |editor, cx| { editor_b.update(cx_b, |editor, cx| {
assert_remote_selections(editor, &[(Some(ColorIndex(0)), 0..1)], cx); assert_remote_selections(editor, &[(Some(ParticipantIndex(0)), 0..1)], cx);
}); });
} }
#[track_caller] #[track_caller]
fn assert_remote_selections( fn assert_remote_selections(
editor: &mut Editor, editor: &mut Editor,
expected_selections: &[(Option<ColorIndex>, Range<usize>)], expected_selections: &[(Option<ParticipantIndex>, Range<usize>)],
cx: &mut ViewContext<Editor>, cx: &mut ViewContext<Editor>,
) { ) {
let snapshot = editor.snapshot(cx); let snapshot = editor.snapshot(cx);
@ -295,7 +303,7 @@ fn assert_remote_selections(
.map(|s| { .map(|s| {
let start = s.selection.start.to_offset(&snapshot.buffer_snapshot); let start = s.selection.start.to_offset(&snapshot.buffer_snapshot);
let end = s.selection.end.to_offset(&snapshot.buffer_snapshot); let end = s.selection.end.to_offset(&snapshot.buffer_snapshot);
(s.color_index, start..end) (s.participant_index, start..end)
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
assert_eq!( assert_eq!(

View file

@ -3,7 +3,7 @@ use call::ActiveCall;
use channel::{Channel, ChannelBuffer, ChannelBufferEvent, ChannelId}; use channel::{Channel, ChannelBuffer, ChannelBufferEvent, ChannelId};
use client::{ use client::{
proto::{self, PeerId}, proto::{self, PeerId},
Collaborator, Collaborator, ParticipantIndex,
}; };
use collections::HashMap; use collections::HashMap;
use editor::{CollaborationHub, Editor}; use editor::{CollaborationHub, Editor};
@ -359,7 +359,10 @@ impl CollaborationHub for ChannelBufferCollaborationHub {
self.0.read(cx).collaborators() self.0.read(cx).collaborators()
} }
fn user_color_indices<'a>(&self, cx: &'a AppContext) -> &'a HashMap<u64, theme::ColorIndex> { fn user_participant_indices<'a>(
self.0.read(cx).user_store().read(cx).color_indices() &self,
cx: &'a AppContext,
) -> &'a HashMap<u64, ParticipantIndex> {
self.0.read(cx).user_store().read(cx).participant_indices()
} }
} }

View file

@ -923,15 +923,18 @@ impl CollabTitlebarItem {
.background_color .background_color
.unwrap_or_default(); .unwrap_or_default();
let color_index = self let participant_index = self
.user_store .user_store
.read(cx) .read(cx)
.color_indices() .participant_indices()
.get(&user_id) .get(&user_id)
.copied(); .copied();
if let Some(color_index) = color_index { if let Some(participant_index) = participant_index {
if followed_by_self { if followed_by_self {
let selection = theme.editor.replica_selection_style(color_index).selection; let selection = theme
.editor
.selection_style_for_room_participant(participant_index.0)
.selection;
background_color = Color::blend(selection, background_color); background_color = Color::blend(selection, background_color);
background_color.a = 255; background_color.a = 255;
} }
@ -996,10 +999,12 @@ impl CollabTitlebarItem {
.contained() .contained()
.with_style(theme.titlebar.leader_selection); .with_style(theme.titlebar.leader_selection);
if let Some(color_index) = color_index { if let Some(participant_index) = participant_index {
if followed_by_self { if followed_by_self {
let color = let color = theme
theme.editor.replica_selection_style(color_index).selection; .editor
.selection_style_for_room_participant(participant_index.0)
.selection;
container = container.with_background_color(color); container = container.with_background_color(color);
} }
} }
@ -1007,8 +1012,11 @@ impl CollabTitlebarItem {
container container
})) }))
.with_children((|| { .with_children((|| {
let color_index = color_index?; let participant_index = participant_index?;
let color = theme.editor.replica_selection_style(color_index).cursor; let color = theme
.editor
.selection_style_for_room_participant(participant_index.0)
.cursor;
Some( Some(
AvatarRibbon::new(color) AvatarRibbon::new(color)
.constrained() .constrained()

View file

@ -25,7 +25,7 @@ use ::git::diff::DiffHunk;
use aho_corasick::AhoCorasick; use aho_corasick::AhoCorasick;
use anyhow::{anyhow, Context, Result}; use anyhow::{anyhow, Context, Result};
use blink_manager::BlinkManager; use blink_manager::BlinkManager;
use client::{ClickhouseEvent, Collaborator, TelemetrySettings}; use client::{ClickhouseEvent, Collaborator, ParticipantIndex, TelemetrySettings};
use clock::{Global, ReplicaId}; use clock::{Global, ReplicaId};
use collections::{BTreeMap, Bound, HashMap, HashSet, VecDeque}; use collections::{BTreeMap, Bound, HashMap, HashSet, VecDeque};
use convert_case::{Case, Casing}; use convert_case::{Case, Casing};
@ -102,7 +102,7 @@ use std::{
pub use sum_tree::Bias; pub use sum_tree::Bias;
use sum_tree::TreeMap; use sum_tree::TreeMap;
use text::Rope; use text::Rope;
use theme::{ColorIndex, DiagnosticStyle, Theme, ThemeSettings}; use theme::{DiagnosticStyle, Theme, ThemeSettings};
use util::{post_inc, RangeExt, ResultExt, TryFutureExt}; use util::{post_inc, RangeExt, ResultExt, TryFutureExt};
use workspace::{ItemNavHistory, ViewId, Workspace}; use workspace::{ItemNavHistory, ViewId, Workspace};
@ -637,7 +637,7 @@ pub struct RemoteSelection {
pub cursor_shape: CursorShape, pub cursor_shape: CursorShape,
pub peer_id: PeerId, pub peer_id: PeerId,
pub line_mode: bool, pub line_mode: bool,
pub color_index: Option<ColorIndex>, pub participant_index: Option<ParticipantIndex>,
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@ -8570,7 +8570,10 @@ impl Editor {
pub trait CollaborationHub { pub trait CollaborationHub {
fn collaborators<'a>(&self, cx: &'a AppContext) -> &'a HashMap<PeerId, Collaborator>; fn collaborators<'a>(&self, cx: &'a AppContext) -> &'a HashMap<PeerId, Collaborator>;
fn user_color_indices<'a>(&self, cx: &'a AppContext) -> &'a HashMap<u64, ColorIndex>; fn user_participant_indices<'a>(
&self,
cx: &'a AppContext,
) -> &'a HashMap<u64, ParticipantIndex>;
} }
impl CollaborationHub for ModelHandle<Project> { impl CollaborationHub for ModelHandle<Project> {
@ -8578,8 +8581,11 @@ impl CollaborationHub for ModelHandle<Project> {
self.read(cx).collaborators() self.read(cx).collaborators()
} }
fn user_color_indices<'a>(&self, cx: &'a AppContext) -> &'a HashMap<u64, ColorIndex> { fn user_participant_indices<'a>(
self.read(cx).user_store().read(cx).color_indices() &self,
cx: &'a AppContext,
) -> &'a HashMap<u64, ParticipantIndex> {
self.read(cx).user_store().read(cx).participant_indices()
} }
} }
@ -8632,7 +8638,7 @@ impl EditorSnapshot {
collaboration_hub: &dyn CollaborationHub, collaboration_hub: &dyn CollaborationHub,
cx: &'a AppContext, cx: &'a AppContext,
) -> impl 'a + Iterator<Item = RemoteSelection> { ) -> impl 'a + Iterator<Item = RemoteSelection> {
let color_indices = collaboration_hub.user_color_indices(cx); let participant_indices = collaboration_hub.user_participant_indices(cx);
let collaborators_by_peer_id = collaboration_hub.collaborators(cx); let collaborators_by_peer_id = collaboration_hub.collaborators(cx);
let collaborators_by_replica_id = collaborators_by_peer_id let collaborators_by_replica_id = collaborators_by_peer_id
.iter() .iter()
@ -8642,13 +8648,13 @@ impl EditorSnapshot {
.remote_selections_in_range(range) .remote_selections_in_range(range)
.filter_map(move |(replica_id, line_mode, cursor_shape, selection)| { .filter_map(move |(replica_id, line_mode, cursor_shape, selection)| {
let collaborator = collaborators_by_replica_id.get(&replica_id)?; let collaborator = collaborators_by_replica_id.get(&replica_id)?;
let color_index = color_indices.get(&collaborator.user_id).copied(); let participant_index = participant_indices.get(&collaborator.user_id).copied();
Some(RemoteSelection { Some(RemoteSelection {
replica_id, replica_id,
selection, selection,
cursor_shape, cursor_shape,
line_mode, line_mode,
color_index, participant_index,
peer_id: collaborator.peer_id, peer_id: collaborator.peer_id,
}) })
}) })

View file

@ -2256,8 +2256,8 @@ impl Element<Editor> for EditorElement {
collaboration_hub.as_ref(), collaboration_hub.as_ref(),
cx, cx,
) { ) {
let selection_style = if let Some(color_index) = selection.color_index { let selection_style = if let Some(participant_index) = selection.participant_index {
style.replica_selection_style(color_index) style.selection_style_for_room_participant(participant_index.0)
} else { } else {
style.absent_selection style.absent_selection
}; };

View file

@ -76,7 +76,6 @@ use std::{
}; };
use terminals::Terminals; use terminals::Terminals;
use text::Anchor; use text::Anchor;
use theme::ColorIndex;
use util::{ use util::{
debug_panic, defer, http::HttpClient, merge_json_value_into, debug_panic, defer, http::HttpClient, merge_json_value_into,
paths::LOCAL_SETTINGS_RELATIVE_PATH, post_inc, ResultExt, TryFutureExt as _, paths::LOCAL_SETTINGS_RELATIVE_PATH, post_inc, ResultExt, TryFutureExt as _,
@ -120,7 +119,6 @@ pub struct Project {
join_project_response_message_id: u32, join_project_response_message_id: u32,
next_diagnostic_group_id: usize, next_diagnostic_group_id: usize,
user_store: ModelHandle<UserStore>, user_store: ModelHandle<UserStore>,
user_color_indices: HashMap<ReplicaId, ColorIndex>,
fs: Arc<dyn Fs>, fs: Arc<dyn Fs>,
client_state: Option<ProjectClientState>, client_state: Option<ProjectClientState>,
collaborators: HashMap<proto::PeerId, Collaborator>, collaborators: HashMap<proto::PeerId, Collaborator>,
@ -644,7 +642,6 @@ impl Project {
languages, languages,
client, client,
user_store, user_store,
user_color_indices: Default::default(),
fs, fs,
next_entry_id: Default::default(), next_entry_id: Default::default(),
next_diagnostic_group_id: Default::default(), next_diagnostic_group_id: Default::default(),
@ -717,7 +714,6 @@ impl Project {
_maintain_workspace_config: Self::maintain_workspace_config(cx), _maintain_workspace_config: Self::maintain_workspace_config(cx),
languages, languages,
user_store: user_store.clone(), user_store: user_store.clone(),
user_color_indices: Default::default(),
fs, fs,
next_entry_id: Default::default(), next_entry_id: Default::default(),
next_diagnostic_group_id: Default::default(), next_diagnostic_group_id: Default::default(),
@ -922,10 +918,6 @@ impl Project {
self.user_store.clone() self.user_store.clone()
} }
pub fn user_color_indices(&self) -> &HashMap<ReplicaId, ColorIndex> {
&self.user_color_indices
}
pub fn opened_buffers(&self, cx: &AppContext) -> Vec<ModelHandle<Buffer>> { pub fn opened_buffers(&self, cx: &AppContext) -> Vec<ModelHandle<Buffer>> {
self.opened_buffers self.opened_buffers
.values() .values()

View file

@ -256,7 +256,7 @@ message Participant {
PeerId peer_id = 2; PeerId peer_id = 2;
repeated ParticipantProject projects = 3; repeated ParticipantProject projects = 3;
ParticipantLocation location = 4; ParticipantLocation location = 4;
uint32 color_index = 5; uint32 participant_index = 5;
} }
message PendingParticipant { message PendingParticipant {

View file

@ -1064,15 +1064,12 @@ impl<'de, T: DeserializeOwned> Deserialize<'de> for Interactive<T> {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ColorIndex(pub u32);
impl Editor { impl Editor {
pub fn replica_selection_style(&self, color_index: ColorIndex) -> SelectionStyle { pub fn selection_style_for_room_participant(&self, participant_index: u32) -> SelectionStyle {
if self.guest_selections.is_empty() { if self.guest_selections.is_empty() {
return SelectionStyle::default(); return SelectionStyle::default();
} }
let style_ix = color_index.0 as usize % self.guest_selections.len(); let style_ix = participant_index as usize % self.guest_selections.len();
self.guest_selections[style_ix] self.guest_selections[style_ix]
} }
} }

View file

@ -191,7 +191,7 @@ impl Member {
if let Some(leader) = &leader { if let Some(leader) = &leader {
let leader_color = theme let leader_color = theme
.editor .editor
.replica_selection_style(leader.color_index) .selection_style_for_room_participant(leader.participant_index.0)
.cursor; .cursor;
leader_border = Border::all(theme.workspace.leader_border_width, leader_color); leader_border = Border::all(theme.workspace.leader_border_width, leader_color);
leader_border leader_border