Return back git status colors for tab labels (#3906)

Kirill Bulatov created

Change summary

crates/editor/src/items.rs        | 33 ++++++++++++++++++++++++++-------
crates/gpui/src/app/entity_map.rs |  7 ++++---
crates/workspace/src/pane.rs      |  7 ++++++-
3 files changed, 36 insertions(+), 11 deletions(-)

Detailed changes

crates/editor/src/items.rs 🔗

@@ -15,9 +15,11 @@ use language::{
     proto::serialize_anchor as serialize_text_anchor, Bias, Buffer, CharKind, OffsetRangeExt,
     Point, SelectionGoal,
 };
+use project::repository::GitFileStatus;
 use project::{search::SearchQuery, FormatTrigger, Item as _, Project, ProjectPath};
 use rpc::proto::{self, update_view, PeerId};
 use settings::Settings;
+use workspace::item::ItemSettings;
 
 use std::fmt::Write;
 use std::{
@@ -29,7 +31,7 @@ use std::{
     sync::Arc,
 };
 use text::Selection;
-use theme::{ActiveTheme, Theme};
+use theme::Theme;
 use ui::{h_stack, prelude::*, Label};
 use util::{paths::PathExt, paths::FILE_ROW_COLUMN_DELIMITER, ResultExt, TryFutureExt};
 use workspace::{
@@ -579,7 +581,28 @@ impl Item for Editor {
     }
 
     fn tab_content(&self, detail: Option<usize>, selected: bool, cx: &WindowContext) -> AnyElement {
-        let _theme = cx.theme();
+        let git_status = if ItemSettings::get_global(cx).git_status {
+            self.buffer()
+                .read(cx)
+                .as_singleton()
+                .and_then(|buffer| buffer.read(cx).project_path(cx))
+                .and_then(|path| self.project.as_ref()?.read(cx).entry_for_path(&path, cx))
+                .and_then(|entry| entry.git_status())
+        } else {
+            None
+        };
+        let label_color = match git_status {
+            Some(GitFileStatus::Added) => Color::Created,
+            Some(GitFileStatus::Modified) => Color::Modified,
+            Some(GitFileStatus::Conflict) => Color::Conflict,
+            None => {
+                if selected {
+                    Color::Default
+                } else {
+                    Color::Muted
+                }
+            }
+        };
 
         let description = detail.and_then(|detail| {
             let path = path_for_buffer(&self.buffer, detail, false, cx)?;
@@ -595,11 +618,7 @@ impl Item for Editor {
 
         h_stack()
             .gap_2()
-            .child(Label::new(self.title(cx).to_string()).color(if selected {
-                Color::Default
-            } else {
-                Color::Muted
-            }))
+            .child(Label::new(self.title(cx).to_string()).color(label_color))
             .when_some(description, |this, description| {
                 this.child(
                     Label::new(description)

crates/gpui/src/app/entity_map.rs 🔗

@@ -1,8 +1,6 @@
 use crate::{private::Sealed, AppContext, Context, Entity, ModelContext};
 use anyhow::{anyhow, Result};
-use collections::HashMap;
 use derive_more::{Deref, DerefMut};
-use lazy_static::lazy_static;
 use parking_lot::{RwLock, RwLockUpgradableReadGuard};
 use slotmap::{SecondaryMap, SlotMap};
 use std::{
@@ -18,6 +16,9 @@ use std::{
     thread::panicking,
 };
 
+#[cfg(any(test, feature = "test-support"))]
+use collections::HashMap;
+
 slotmap::new_key_type! { pub struct EntityId; }
 
 impl EntityId {
@@ -600,7 +601,7 @@ impl<T> PartialEq<Model<T>> for WeakModel<T> {
 }
 
 #[cfg(any(test, feature = "test-support"))]
-lazy_static! {
+lazy_static::lazy_static! {
     static ref LEAK_BACKTRACE: bool =
         std::env::var("LEAK_BACKTRACE").map_or(false, |b| !b.is_empty());
 }

crates/workspace/src/pane.rs 🔗

@@ -1128,7 +1128,12 @@ impl Pane {
             if self.items.len() == 1 && should_activate {
                 self.focus_handle.focus(cx);
             } else {
-                self.activate_item(index_to_activate, should_activate, should_activate, cx);
+                self.activate_item(
+                    dbg!(index_to_activate),
+                    dbg!(should_activate),
+                    should_activate,
+                    cx,
+                );
             }
         }