@@ -4,7 +4,7 @@ use crate::{
ToggleScreenSharing,
};
use call::{ActiveCall, ParticipantLocation, Room};
-use client::{proto::PeerId, ContactEventKind, SignIn, SignOut, User, UserStore};
+use client::{proto::PeerId, Client, ContactEventKind, SignIn, SignOut, User, UserStore};
use clock::ReplicaId;
use contacts_popover::ContactsPopover;
use context_menu::{ContextMenu, ContextMenuItem};
@@ -19,6 +19,7 @@ use gpui::{
AppContext, Entity, ImageData, ModelHandle, SceneBuilder, Subscription, View, ViewContext,
ViewHandle, WeakViewHandle,
};
+use project::Project;
use settings::Settings;
use std::{ops::Range, sync::Arc};
use theme::{AvatarStyle, Theme};
@@ -51,8 +52,10 @@ pub fn init(cx: &mut AppContext) {
}
pub struct CollabTitlebarItem {
- workspace: WeakViewHandle<Workspace>,
+ project: ModelHandle<Project>,
user_store: ModelHandle<UserStore>,
+ client: Arc<Client>,
+ workspace: WeakViewHandle<Workspace>,
contacts_popover: Option<ViewHandle<ContactsPopover>>,
user_menu: ViewHandle<ContextMenu>,
collaborator_list_popover: Option<ViewHandle<CollaboratorListPopover>>,
@@ -75,7 +78,7 @@ impl View for CollabTitlebarItem {
return Empty::new().into_any();
};
- let project = workspace.read(cx).project().read(cx);
+ let project = self.project.read(cx);
let mut project_title = String::new();
for (i, name) in project.worktree_root_names(cx).enumerate() {
if i > 0 {
@@ -100,8 +103,8 @@ impl View for CollabTitlebarItem {
.left(),
);
- let user = workspace.read(cx).user_store().read(cx).current_user();
- let peer_id = workspace.read(cx).client().peer_id();
+ let user = self.user_store.read(cx).current_user();
+ let peer_id = self.client.peer_id();
if let Some(((user, peer_id), room)) = user
.zip(peer_id)
.zip(ActiveCall::global(cx).read(cx).room().cloned())
@@ -135,20 +138,23 @@ impl View for CollabTitlebarItem {
impl CollabTitlebarItem {
pub fn new(
- workspace: &ViewHandle<Workspace>,
- user_store: &ModelHandle<UserStore>,
+ workspace: &Workspace,
+ workspace_handle: &ViewHandle<Workspace>,
cx: &mut ViewContext<Self>,
) -> Self {
+ let project = workspace.project().clone();
+ let user_store = workspace.user_store().clone();
+ let client = workspace.client().clone();
let active_call = ActiveCall::global(cx);
let mut subscriptions = Vec::new();
- subscriptions.push(cx.observe(workspace, |_, _, cx| cx.notify()));
+ subscriptions.push(cx.observe(workspace_handle, |_, _, cx| cx.notify()));
subscriptions.push(cx.observe(&active_call, |this, _, cx| this.active_call_changed(cx)));
subscriptions.push(cx.observe_window_activation(|this, active, cx| {
this.window_activation_changed(active, cx)
}));
- subscriptions.push(cx.observe(user_store, |_, _, cx| cx.notify()));
+ subscriptions.push(cx.observe(&user_store, |_, _, cx| cx.notify()));
subscriptions.push(
- cx.subscribe(user_store, move |this, user_store, event, cx| {
+ cx.subscribe(&user_store, move |this, user_store, event, cx| {
if let Some(workspace) = this.workspace.upgrade(cx) {
workspace.update(cx, |workspace, cx| {
if let client::Event::Contact { user, kind } = event {
@@ -171,8 +177,10 @@ impl CollabTitlebarItem {
);
Self {
- workspace: workspace.downgrade(),
- user_store: user_store.clone(),
+ workspace: workspace.weak_handle(),
+ project,
+ user_store,
+ client,
contacts_popover: None,
user_menu: cx.add_view(|cx| {
let mut menu = ContextMenu::new(cx);
@@ -185,16 +193,14 @@ impl CollabTitlebarItem {
}
fn window_activation_changed(&mut self, active: bool, cx: &mut ViewContext<Self>) {
- if let Some(workspace) = self.workspace.upgrade(cx) {
- let project = if active {
- Some(workspace.read(cx).project().clone())
- } else {
- None
- };
- ActiveCall::global(cx)
- .update(cx, |call, cx| call.set_location(project.as_ref(), cx))
- .detach_and_log_err(cx);
- }
+ let project = if active {
+ Some(self.project.clone())
+ } else {
+ None
+ };
+ ActiveCall::global(cx)
+ .update(cx, |call, cx| call.set_location(project.as_ref(), cx))
+ .detach_and_log_err(cx);
}
fn active_call_changed(&mut self, cx: &mut ViewContext<Self>) {
@@ -205,23 +211,19 @@ impl CollabTitlebarItem {
}
fn share_project(&mut self, _: &ShareProject, cx: &mut ViewContext<Self>) {
- if let Some(workspace) = self.workspace.upgrade(cx) {
- let active_call = ActiveCall::global(cx);
- let project = workspace.read(cx).project().clone();
- active_call
- .update(cx, |call, cx| call.share_project(project, cx))
- .detach_and_log_err(cx);
- }
+ let active_call = ActiveCall::global(cx);
+ let project = self.project.clone();
+ active_call
+ .update(cx, |call, cx| call.share_project(project, cx))
+ .detach_and_log_err(cx);
}
fn unshare_project(&mut self, _: &UnshareProject, cx: &mut ViewContext<Self>) {
- if let Some(workspace) = self.workspace.upgrade(cx) {
- let active_call = ActiveCall::global(cx);
- let project = workspace.read(cx).project().clone();
- active_call
- .update(cx, |call, cx| call.unshare_project(project, cx))
- .log_err();
- }
+ let active_call = ActiveCall::global(cx);
+ let project = self.project.clone();
+ active_call
+ .update(cx, |call, cx| call.unshare_project(project, cx))
+ .log_err();
}
pub fn toggle_collaborator_list_popover(
@@ -256,22 +258,20 @@ impl CollabTitlebarItem {
pub fn toggle_contacts_popover(&mut self, _: &ToggleContactsMenu, cx: &mut ViewContext<Self>) {
if self.contacts_popover.take().is_none() {
- if let Some(workspace) = self.workspace.upgrade(cx) {
- let project = workspace.read(cx).project().clone();
- let user_store = workspace.read(cx).user_store().clone();
- let view = cx.add_view(|cx| ContactsPopover::new(project, user_store, cx));
- cx.subscribe(&view, |this, _, event, cx| {
- match event {
- contacts_popover::Event::Dismissed => {
- this.contacts_popover = None;
- }
+ let view = cx.add_view(|cx| {
+ ContactsPopover::new(self.project.clone(), self.user_store.clone(), cx)
+ });
+ cx.subscribe(&view, |this, _, event, cx| {
+ match event {
+ contacts_popover::Event::Dismissed => {
+ this.contacts_popover = None;
}
+ }
- cx.notify();
- })
- .detach();
- self.contacts_popover = Some(view);
- }
+ cx.notify();
+ })
+ .detach();
+ self.contacts_popover = Some(view);
}
cx.notify();