Merge remote-tracking branch 'origin/main' into editor2-blocks

Antonio Scandurra created

Change summary

Cargo.lock                                 |  4 +-
Cargo.toml                                 |  1 
assets/settings/default.json               | 14 ++-----
crates/Cargo.toml                          |  2 
crates/ai/Cargo.toml                       |  2 
crates/ai2/Cargo.toml                      |  2 
crates/assistant/Cargo.toml                |  2 
crates/assistant/src/assistant_settings.rs |  7 +++
crates/semantic_index/Cargo.toml           |  2 
crates/ui2/src/components/button.rs        | 33 ++++++++++-------
crates/ui2/src/components/icon.rs          | 44 ++++++++++++++++++++---
crates/ui2/src/components/icon_button.rs   | 11 +----
crates/ui2/src/components/label.rs         | 36 +++++++++++++------
crates/workspace2/src/workspace2.rs        | 26 +++++++++++--
14 files changed, 123 insertions(+), 63 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -9256,9 +9256,9 @@ dependencies = [
 
 [[package]]
 name = "tiktoken-rs"
-version = "0.5.4"
+version = "0.5.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9ae5a3c24361e5f038af22517ba7f8e3af4099e30e78a3d56f86b48238fce9d"
+checksum = "a4427b6b1c6b38215b92dd47a83a0ecc6735573d0a5a4c14acc0ac5b33b28adb"
 dependencies = [
  "anyhow",
  "base64 0.21.4",

Cargo.toml 🔗

@@ -154,6 +154,7 @@ tempdir = { version = "0.3.7" }
 thiserror = { version = "1.0.29" }
 time = { version = "0.3", features = ["serde", "serde-well-known"] }
 toml = { version = "0.5" }
+tiktoken-rs = "0.5.7"
 tree-sitter = "0.20"
 unindent = { version = "0.1.7" }
 pretty_assertions = "1.3.0"

assets/settings/default.json 🔗

@@ -174,7 +174,8 @@
     //
     // 1. "gpt-3.5-turbo-0613""
     // 2. "gpt-4-0613""
-    "default_open_ai_model": "gpt-4-0613"
+    // 3. "gpt-4-1106-preview"
+    "default_open_ai_model": "gpt-4-1106-preview"
   },
   // Whether the screen sharing icon is shown in the os status bar.
   "show_call_status_icon": true,
@@ -270,9 +271,7 @@
   "copilot": {
     // The set of glob patterns for which copilot should be disabled
     // in any matching file.
-    "disabled_globs": [
-      ".env"
-    ]
+    "disabled_globs": [".env"]
   },
   // Settings specific to journaling
   "journal": {
@@ -381,12 +380,7 @@
         // Default directories to search for virtual environments, relative
         // to the current working directory. We recommend overriding this
         // in your project's settings, rather than globally.
-        "directories": [
-          ".env",
-          "env",
-          ".venv",
-          "venv"
-        ],
+        "directories": [".env", "env", ".venv", "venv"],
         // Can also be 'csh', 'fish', and `nushell`
         "activate_script": "default"
       }

crates/Cargo.toml 🔗

@@ -29,7 +29,7 @@ postage.workspace = true
 rand.workspace = true
 log.workspace = true
 parse_duration = "2.1.1"
-tiktoken-rs = "0.5.0"
+tiktoken-rs.workspace = true
 matrixmultiply = "0.3.7"
 rusqlite = { version = "0.29.0", features = ["blob", "array", "modern_sqlite"] }
 bincode = "1.3.3"

crates/ai/Cargo.toml 🔗

@@ -29,7 +29,7 @@ postage.workspace = true
 rand.workspace = true
 log.workspace = true
 parse_duration = "2.1.1"
-tiktoken-rs = "0.5.0"
+tiktoken-rs.workspace = true
 matrixmultiply = "0.3.7"
 rusqlite = { version = "0.29.0", features = ["blob", "array", "modern_sqlite"] }
 bincode = "1.3.3"

crates/ai2/Cargo.toml 🔗

@@ -29,7 +29,7 @@ postage.workspace = true
 rand.workspace = true
 log.workspace = true
 parse_duration = "2.1.1"
-tiktoken-rs = "0.5.0"
+tiktoken-rs.workspace = true
 matrixmultiply = "0.3.7"
 rusqlite = { version = "0.29.0", features = ["blob", "array", "modern_sqlite"] }
 bincode = "1.3.3"

crates/assistant/Cargo.toml 🔗

@@ -40,7 +40,7 @@ schemars.workspace = true
 serde.workspace = true
 serde_json.workspace = true
 smol.workspace = true
-tiktoken-rs = "0.5"
+tiktoken-rs.workspace = true
 
 [dev-dependencies]
 editor = { path = "../editor", features = ["test-support"] }

crates/assistant/src/assistant_settings.rs 🔗

@@ -9,6 +9,8 @@ pub enum OpenAIModel {
     ThreePointFiveTurbo,
     #[serde(rename = "gpt-4-0613")]
     Four,
+    #[serde(rename = "gpt-4-1106-preview")]
+    FourTurbo,
 }
 
 impl OpenAIModel {
@@ -16,6 +18,7 @@ impl OpenAIModel {
         match self {
             OpenAIModel::ThreePointFiveTurbo => "gpt-3.5-turbo-0613",
             OpenAIModel::Four => "gpt-4-0613",
+            OpenAIModel::FourTurbo => "gpt-4-1106-preview",
         }
     }
 
@@ -23,13 +26,15 @@ impl OpenAIModel {
         match self {
             OpenAIModel::ThreePointFiveTurbo => "gpt-3.5-turbo",
             OpenAIModel::Four => "gpt-4",
+            OpenAIModel::FourTurbo => "gpt-4-turbo",
         }
     }
 
     pub fn cycle(&self) -> Self {
         match self {
             OpenAIModel::ThreePointFiveTurbo => OpenAIModel::Four,
-            OpenAIModel::Four => OpenAIModel::ThreePointFiveTurbo,
+            OpenAIModel::Four => OpenAIModel::FourTurbo,
+            OpenAIModel::FourTurbo => OpenAIModel::ThreePointFiveTurbo,
         }
     }
 }

crates/semantic_index/Cargo.toml 🔗

@@ -33,7 +33,7 @@ lazy_static.workspace = true
 serde.workspace = true
 serde_json.workspace = true
 async-trait.workspace = true
-tiktoken-rs = "0.5.0"
+tiktoken-rs.workspace = true
 parking_lot.workspace = true
 rand.workspace = true
 schemars.workspace = true

crates/ui2/src/components/button.rs 🔗

@@ -87,6 +87,7 @@ pub struct Button<V: 'static> {
     label: SharedString,
     variant: ButtonVariant,
     width: Option<DefiniteLength>,
+    color: Option<LabelColor>,
 }
 
 impl<V: 'static> Button<V> {
@@ -99,6 +100,7 @@ impl<V: 'static> Button<V> {
             label: label.into(),
             variant: Default::default(),
             width: Default::default(),
+            color: None,
         }
     }
 
@@ -139,25 +141,24 @@ impl<V: 'static> Button<V> {
         self
     }
 
-    fn label_color(&self) -> LabelColor {
-        if self.disabled {
-            LabelColor::Disabled
-        } else {
-            Default::default()
-        }
+    pub fn color(mut self, color: Option<LabelColor>) -> Self {
+        self.color = color;
+        self
     }
 
-    fn icon_color(&self) -> IconColor {
+    pub fn label_color(&self, color: Option<LabelColor>) -> LabelColor {
         if self.disabled {
-            IconColor::Disabled
+            LabelColor::Disabled
+        } else if let Some(color) = color {
+            color
         } else {
             Default::default()
         }
     }
 
-    fn render_label(&self) -> Label {
+    fn render_label(&self, color: LabelColor) -> Label {
         Label::new(self.label.clone())
-            .color(self.label_color())
+            .color(color)
             .line_height_style(LineHeightStyle::UILabel)
     }
 
@@ -166,7 +167,11 @@ impl<V: 'static> Button<V> {
     }
 
     pub fn render(self, _view: &mut V, cx: &mut ViewContext<V>) -> impl Component<V> {
-        let icon_color = self.icon_color();
+        let (icon_color, label_color) = match (self.disabled, self.color) {
+            (true, _) => (IconColor::Disabled, LabelColor::Disabled),
+            (_, None) => (IconColor::Default, LabelColor::Default),
+            (_, Some(color)) => (IconColor::from(color), color),
+        };
 
         let mut button = h_stack()
             .id(SharedString::from(format!("{}", self.label)))
@@ -182,16 +187,16 @@ impl<V: 'static> Button<V> {
             (Some(_), Some(IconPosition::Left)) => {
                 button = button
                     .gap_1()
-                    .child(self.render_label())
+                    .child(self.render_label(label_color))
                     .children(self.render_icon(icon_color))
             }
             (Some(_), Some(IconPosition::Right)) => {
                 button = button
                     .gap_1()
                     .children(self.render_icon(icon_color))
-                    .child(self.render_label())
+                    .child(self.render_label(label_color))
             }
-            (_, _) => button = button.child(self.render_label()),
+            (_, _) => button = button.child(self.render_label(label_color)),
         }
 
         if let Some(width) = self.width {

crates/ui2/src/components/icon.rs 🔗

@@ -1,7 +1,7 @@
 use gpui::{rems, svg, Hsla};
 use strum::EnumIter;
 
-use crate::prelude::*;
+use crate::{prelude::*, LabelColor};
 
 #[derive(Default, PartialEq, Copy, Clone)]
 pub enum IconSize {
@@ -14,15 +14,20 @@ pub enum IconSize {
 pub enum IconColor {
     #[default]
     Default,
-    Muted,
-    Disabled,
-    Placeholder,
     Accent,
+    Created,
+    Deleted,
+    Disabled,
     Error,
-    Warning,
-    Success,
+    Hidden,
     Info,
+    Modified,
+    Muted,
+    Placeholder,
+    Player(u32),
     Selected,
+    Success,
+    Warning,
 }
 
 impl IconColor {
@@ -38,6 +43,33 @@ impl IconColor {
             IconColor::Success => cx.theme().status().success,
             IconColor::Info => cx.theme().status().info,
             IconColor::Selected => cx.theme().colors().icon_accent,
+            IconColor::Player(i) => cx.theme().styles.player.0[i.clone() as usize].cursor,
+            IconColor::Created => cx.theme().status().created,
+            IconColor::Modified => cx.theme().status().modified,
+            IconColor::Deleted => cx.theme().status().deleted,
+            IconColor::Hidden => cx.theme().status().hidden,
+        }
+    }
+}
+
+impl From<LabelColor> for IconColor {
+    fn from(label: LabelColor) -> Self {
+        match label {
+            LabelColor::Default => IconColor::Default,
+            LabelColor::Muted => IconColor::Muted,
+            LabelColor::Disabled => IconColor::Disabled,
+            LabelColor::Placeholder => IconColor::Placeholder,
+            LabelColor::Accent => IconColor::Accent,
+            LabelColor::Error => IconColor::Error,
+            LabelColor::Warning => IconColor::Warning,
+            LabelColor::Success => IconColor::Success,
+            LabelColor::Info => IconColor::Info,
+            LabelColor::Selected => IconColor::Selected,
+            LabelColor::Player(i) => IconColor::Player(i),
+            LabelColor::Created => IconColor::Created,
+            LabelColor::Modified => IconColor::Modified,
+            LabelColor::Deleted => IconColor::Deleted,
+            LabelColor::Hidden => IconColor::Hidden,
         }
     }
 }

crates/ui2/src/components/icon_button.rs 🔗

@@ -1,10 +1,7 @@
+use crate::{h_stack, prelude::*, ClickHandler, Icon, IconColor, IconElement, TextTooltip};
+use gpui::{MouseButton, VisualContext};
 use std::sync::Arc;
 
-use gpui::{rems, MouseButton, VisualContext};
-
-use crate::{h_stack, prelude::*, TextTooltip};
-use crate::{ClickHandler, Icon, IconColor, IconElement};
-
 struct IconButtonHandlers<V: 'static> {
     click: Option<ClickHandler<V>>,
 }
@@ -95,9 +92,7 @@ impl<V: 'static> IconButton<V> {
             .id(self.id.clone())
             .justify_center()
             .rounded_md()
-            // todo!("Where do these numbers come from?")
-            .py(rems(0.21875))
-            .px(rems(0.375))
+            .p_1()
             .bg(bg_color)
             .hover(|style| style.bg(bg_hover_color))
             .active(|style| style.bg(bg_active_color))

crates/ui2/src/components/label.rs 🔗

@@ -7,28 +7,40 @@ use crate::styled_ext::StyledExt;
 pub enum LabelColor {
     #[default]
     Default,
-    Muted,
+    Accent,
     Created,
-    Modified,
     Deleted,
     Disabled,
+    Error,
     Hidden,
+    Info,
+    Modified,
+    Muted,
     Placeholder,
-    Accent,
+    Player(u32),
+    Selected,
+    Success,
+    Warning,
 }
 
 impl LabelColor {
     pub fn hsla(&self, cx: &WindowContext) -> Hsla {
         match self {
-            Self::Default => cx.theme().colors().text,
-            Self::Muted => cx.theme().colors().text_muted,
-            Self::Created => cx.theme().status().created,
-            Self::Modified => cx.theme().status().modified,
-            Self::Deleted => cx.theme().status().deleted,
-            Self::Disabled => cx.theme().colors().text_disabled,
-            Self::Hidden => cx.theme().status().hidden,
-            Self::Placeholder => cx.theme().colors().text_placeholder,
-            Self::Accent => cx.theme().colors().text_accent,
+            LabelColor::Default => cx.theme().colors().text,
+            LabelColor::Muted => cx.theme().colors().text_muted,
+            LabelColor::Created => cx.theme().status().created,
+            LabelColor::Modified => cx.theme().status().modified,
+            LabelColor::Deleted => cx.theme().status().deleted,
+            LabelColor::Disabled => cx.theme().colors().text_disabled,
+            LabelColor::Hidden => cx.theme().status().hidden,
+            LabelColor::Info => cx.theme().status().info,
+            LabelColor::Placeholder => cx.theme().colors().text_placeholder,
+            LabelColor::Accent => cx.theme().colors().text_accent,
+            LabelColor::Player(i) => cx.theme().styles.player.0[i.clone() as usize].cursor,
+            LabelColor::Error => cx.theme().status().error,
+            LabelColor::Selected => cx.theme().colors().text_accent,
+            LabelColor::Success => cx.theme().status().success,
+            LabelColor::Warning => cx.theme().status().warning,
         }
     }
 }

crates/workspace2/src/workspace2.rs 🔗

@@ -69,7 +69,7 @@ use std::{
 };
 use theme2::ActiveTheme;
 pub use toolbar::{ToolbarItemLocation, ToolbarItemView};
-use ui::{h_stack, Label};
+use ui::{h_stack, Button, ButtonVariant, Label, LabelColor};
 use util::ResultExt;
 use uuid::Uuid;
 use workspace_settings::{AutosaveSetting, WorkspaceSettings};
@@ -2644,19 +2644,35 @@ impl Workspace {
         h_stack()
             .id("titlebar")
             .justify_between()
-            .w_full()
-            .h(rems(1.75))
-            .bg(cx.theme().colors().title_bar_background)
             .when(
                 !matches!(cx.window_bounds(), WindowBounds::Fullscreen),
                 |s| s.pl_20(),
             )
+            .w_full()
+            .h(rems(1.75))
+            .bg(cx.theme().colors().title_bar_background)
             .on_click(|_, event, cx| {
                 if event.up.click_count == 2 {
                     cx.zoom_window();
                 }
             })
-            .child(h_stack().child(Label::new("Left side titlebar item"))) // self.titlebar_item
+            .child(
+                h_stack()
+                    // TODO - Add player menu
+                    .child(
+                        Button::new("player")
+                            .variant(ButtonVariant::Ghost)
+                            .color(Some(LabelColor::Player(0))),
+                    )
+                    // TODO - Add project menu
+                    .child(Button::new("project_name").variant(ButtonVariant::Ghost))
+                    // TODO - Add git menu
+                    .child(
+                        Button::new("branch_name")
+                            .variant(ButtonVariant::Ghost)
+                            .color(Some(LabelColor::Muted)),
+                    ),
+            ) // self.titlebar_item
             .child(h_stack().child(Label::new("Right side titlebar item")))
     }