From d34ec462f85b536bf94f5674a97529af9de6fcc1 Mon Sep 17 00:00:00 2001 From: Petros Amoiridis Date: Wed, 3 May 2023 20:41:44 +0300 Subject: [PATCH] Display branch information per worktree root Co-Authored-By: Mikayla Maki --- crates/collab_ui/src/collab_titlebar_item.rs | 69 ++++++++++++++------ crates/project/src/worktree.rs | 4 ++ 2 files changed, 54 insertions(+), 19 deletions(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 69ca64360cbe5363f6ea9811eb8f43f6f1c63a97..de9f9615d52f8acf5178e287dbe1cd62a9456ec6 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -17,7 +17,7 @@ use gpui::{ AppContext, Entity, ImageData, LayoutContext, ModelHandle, SceneBuilder, Subscription, View, ViewContext, ViewHandle, WeakViewHandle, }; -use project::Project; +use project::{Project, Worktree}; use settings::Settings; use std::{ops::Range, sync::Arc}; use theme::{AvatarStyle, Theme}; @@ -68,29 +68,17 @@ impl View for CollabTitlebarItem { }; 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 { - project_title.push_str(", "); - } - project_title.push_str(name); - } - if project_title.is_empty() { - project_title = "empty project".to_owned(); - } - + let project_title = self.prepare_title(&project, cx); let theme = cx.global::().theme.clone(); let mut left_container = Flex::row(); let mut right_container = Flex::row().align_children_center(); - left_container.add_child( - Label::new(project_title, theme.workspace.titlebar.title.clone()) - .contained() - .with_margin_right(theme.workspace.titlebar.item_spacing) - .aligned() - .left(), - ); + left_container.add_child(self.render_title_with_information( + project, + &project_title, + theme.clone(), + )); let user = self.user_store.read(cx).current_user(); let peer_id = self.client.peer_id(); @@ -181,6 +169,49 @@ impl CollabTitlebarItem { } } + fn decorate_with_git_branch( + &self, + worktree: &ModelHandle, + cx: &ViewContext, + ) -> String { + let name = worktree.read(cx).root_name(); + let branch = worktree + .read(cx) + .snapshot() + .git_branch() + .unwrap_or_else(|| "".to_owned()); + format!("{} / {}", name, branch) + } + + fn prepare_title(&self, project: &Project, cx: &ViewContext) -> String { + let decorated_root_names: Vec = project + .visible_worktrees(cx) + .map(|worktree| self.decorate_with_git_branch(&worktree, cx)) + .collect(); + if decorated_root_names.is_empty() { + "empty project".to_owned() + } else { + decorated_root_names.join(", ") + } + } + + fn render_title_with_information( + &self, + _project: &Project, + title: &str, + theme: Arc, + ) -> AnyElement { + let text_style = theme.workspace.titlebar.title.clone(); + let item_spacing = theme.workspace.titlebar.item_spacing; + + Label::new(title.to_owned(), text_style) + .contained() + .with_margin_right(dbg!(item_spacing)) + .aligned() + .left() + .into_any_named("title-with-git-information") + } + fn window_activation_changed(&mut self, active: bool, cx: &mut ViewContext) { let project = if active { Some(self.project.clone()) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 6a8de46f8f4ee22f64ad5379a14980888c6cb311..88886347bc1f045d94680b61e31b1a9b52a07216 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -1484,6 +1484,10 @@ impl Snapshot { pub fn inode_for_path(&self, path: impl AsRef) -> Option { self.entry_for_path(path.as_ref()).map(|e| e.inode) } + + pub fn git_branch(&self) -> Option { + Some("test".to_owned()) + } } impl LocalSnapshot {