Split git/project label into a flex row

Piotr Osiewicz created

Change summary

crates/collab_ui/src/collab_titlebar_item.rs | 62 +++++++++------------
1 file changed, 26 insertions(+), 36 deletions(-)

Detailed changes

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, RepositoryEntry};
 use std::{ops::Range, sync::Arc};
 use theme::{AvatarStyle, Theme};
 use util::ResultExt;
@@ -193,37 +193,16 @@ impl CollabTitlebarItem {
         theme: Arc<Theme>,
         cx: &ViewContext<Self>,
     ) -> AnyElement<Self> {
-        let names_and_branches = project.visible_worktrees(cx).map(|worktree| {
+        let mut names_and_branches = project.visible_worktrees(cx).map(|worktree| {
             let worktree = worktree.read(cx);
             (worktree.root_name(), worktree.root_git_entry())
         });
 
-        fn push_str(buffer: &mut String, index: &mut usize, str: &str) {
-            buffer.push_str(str);
-            *index += str.chars().count();
-        }
-
-        let mut indices = Vec::new();
-        let mut index = 0;
-        let mut title = String::new();
-        let mut names_and_branches = names_and_branches.peekable();
-        while let Some((name, entry)) = names_and_branches.next() {
-            let pre_index = index;
-            push_str(&mut title, &mut index, name);
-            indices.extend((pre_index..index).into_iter());
-            if let Some(branch) = entry.and_then(|entry| entry.branch()) {
-                push_str(&mut title, &mut index, "/");
-                push_str(&mut title, &mut index, &branch);
-            }
-            if names_and_branches.peek().is_some() {
-                push_str(&mut title, &mut index, ", ");
-                if index >= MAX_TITLE_LENGTH {
-                    title.push_str(" …");
-                    break;
-                }
-            }
-        }
-
+        let (name, entry) = names_and_branches.next().unwrap_or(("", None));
+        let branch_prepended = entry
+            .as_ref()
+            .and_then(RepositoryEntry::branch)
+            .map(|branch| format!("/{branch}"));
         let text_style = theme.workspace.titlebar.title.clone();
         let item_spacing = theme.workspace.titlebar.item_spacing;
 
@@ -234,14 +213,25 @@ impl CollabTitlebarItem {
             text: text_style,
             highlight_text: Some(highlight),
         };
-
-        Label::new(title, style)
-            .with_highlights(indices)
-            .contained()
-            .with_margin_right(item_spacing)
-            .aligned()
-            .left()
-            .into_any_named("title-with-git-information")
+        let mut ret = Flex::row().with_child(
+            Label::new(name.to_owned(), style.clone())
+                .with_highlights((0..name.len()).into_iter().collect())
+                .contained()
+                .aligned()
+                .left()
+                .into_any_named("title-project-name"),
+        );
+        if let Some(git_branch) = branch_prepended {
+            ret = ret.with_child(
+                Label::new(git_branch, style)
+                    .contained()
+                    .with_margin_right(item_spacing)
+                    .aligned()
+                    .left()
+                    .into_any_named("title-project-branch"),
+            )
+        }
+        ret.into_any()
     }
 
     fn window_activation_changed(&mut self, active: bool, cx: &mut ViewContext<Self>) {