From 86247bf657b3643cd81999c95f1cfb6c43c3f999 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Mon, 5 Jun 2023 15:48:36 +0200 Subject: [PATCH 001/104] editor: Highlight search results Z-1292 --- assets/settings/default.json | 4 +- crates/editor/src/editor_settings.rs | 2 + crates/editor/src/element.rs | 47 ++- crates/theme/src/theme.rs | 1 + styles/src/styleTree/editor.ts | 531 ++++++++++++++------------- 5 files changed, 317 insertions(+), 268 deletions(-) diff --git a/assets/settings/default.json b/assets/settings/default.json index bd73bcbf08..8576c1ed65 100644 --- a/assets/settings/default.json +++ b/assets/settings/default.json @@ -71,7 +71,9 @@ // "never" "show": "auto", // Whether to show git diff indicators in the scrollbar. - "git_diff": true + "git_diff": true, + // Whether to show selections in the scrollbar. + "selections": true }, "project_panel": { // Whether to show the git status in the project panel. diff --git a/crates/editor/src/editor_settings.rs b/crates/editor/src/editor_settings.rs index 387d4d2c34..f4499b5651 100644 --- a/crates/editor/src/editor_settings.rs +++ b/crates/editor/src/editor_settings.rs @@ -15,6 +15,7 @@ pub struct EditorSettings { pub struct Scrollbar { pub show: ShowScrollbar, pub git_diff: bool, + pub selections: bool, } #[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)] @@ -39,6 +40,7 @@ pub struct EditorSettingsContent { pub struct ScrollbarContent { pub show: Option, pub git_diff: Option, + pub selections: Option, } impl Setting for EditorSettings { diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index d6f9a2e906..5f7843f721 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1008,6 +1008,7 @@ impl EditorElement { bounds: RectF, layout: &mut LayoutState, cx: &mut ViewContext, + editor: &Editor, ) { enum ScrollbarMouseHandlers {} if layout.mode != EditorMode::Full { @@ -1050,9 +1051,49 @@ impl EditorElement { background: style.track.background_color, ..Default::default() }); + let scrollbar_settings = settings::get::(cx).scrollbar; + let theme = theme::current(cx); + let scrollbar_theme = &theme.editor.scrollbar; + if layout.is_singleton && scrollbar_settings.selections { + let start_anchor = Anchor::min(); + let end_anchor = Anchor::max(); + for (row, _) in &editor.background_highlights_in_range( + start_anchor..end_anchor, + &layout.position_map.snapshot, + &theme, + ) { + let start_display = row.start; + let end_display = row.end; + let start_y = y_for_row(start_display.row() as f32); + let mut end_y = y_for_row((end_display.row()) as f32); + if end_y - start_y < 1. { + end_y = start_y + 1.; + } + let bounds = RectF::from_points(vec2f(left, start_y), vec2f(right, end_y)); - if layout.is_singleton && settings::get::(cx).scrollbar.git_diff { - let diff_style = theme::current(cx).editor.scrollbar.git.clone(); + let color = scrollbar_theme.selections; + + let border = Border { + width: 1., + color: style.thumb.border.color, + overlay: false, + top: false, + right: true, + bottom: false, + left: true, + }; + + scene.push_quad(Quad { + bounds, + background: Some(color), + border, + corner_radius: style.thumb.corner_radius, + }) + } + } + + if layout.is_singleton && scrollbar_settings.git_diff { + let diff_style = scrollbar_theme.git.clone(); for hunk in layout .position_map .snapshot @@ -2359,7 +2400,7 @@ impl Element for EditorElement { if !layout.blocks.is_empty() { self.paint_blocks(scene, bounds, visible_bounds, layout, editor, cx); } - self.paint_scrollbar(scene, bounds, layout, cx); + self.paint_scrollbar(scene, bounds, layout, cx, &editor); scene.pop_layer(); scene.pop_layer(); diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index c7563ec87a..95d6348c62 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -700,6 +700,7 @@ pub struct Scrollbar { pub width: f32, pub min_height_factor: f32, pub git: GitDiffColors, + pub selections: Color, } #[derive(Clone, Deserialize, Default)] diff --git a/styles/src/styleTree/editor.ts b/styles/src/styleTree/editor.ts index 55f3da6e90..859f9fe1b9 100644 --- a/styles/src/styleTree/editor.ts +++ b/styles/src/styleTree/editor.ts @@ -6,273 +6,276 @@ import hoverPopover from "./hoverPopover" import { buildSyntax } from "../theme/syntax" export default function editor(colorScheme: ColorScheme) { - const { isLight } = colorScheme + const { isLight } = colorScheme - let layer = colorScheme.highest + let layer = colorScheme.highest - const autocompleteItem = { - cornerRadius: 6, - padding: { - bottom: 2, - left: 6, - right: 6, - top: 2, - }, - } - - function diagnostic(layer: Layer, styleSet: StyleSets) { - return { - textScaleFactor: 0.857, - header: { - border: border(layer, { - top: true, - }), - }, - message: { - text: text(layer, "sans", styleSet, "default", { size: "sm" }), - highlightText: text(layer, "sans", styleSet, "default", { - size: "sm", - weight: "bold", - }), - }, - } - } - - const syntax = buildSyntax(colorScheme) + const autocompleteItem = { + cornerRadius: 6, + padding: { + bottom: 2, + left: 6, + right: 6, + top: 2, + }, + } + function diagnostic(layer: Layer, styleSet: StyleSets) { return { - textColor: syntax.primary.color, - background: background(layer), - activeLineBackground: withOpacity(background(layer, "on"), 0.75), - highlightedLineBackground: background(layer, "on"), - // Inline autocomplete suggestions, Co-pilot suggestions, etc. - suggestion: syntax.predictive, - codeActions: { - indicator: { - color: foreground(layer, "variant"), - - clicked: { - color: foreground(layer, "base"), - }, - hover: { - color: foreground(layer, "on"), - }, - active: { - color: foreground(layer, "on"), - }, - }, - verticalScale: 0.55, - }, - folds: { - iconMarginScale: 2.5, - foldedIcon: "icons/chevron_right_8.svg", - foldableIcon: "icons/chevron_down_8.svg", - indicator: { - color: foreground(layer, "variant"), - - clicked: { - color: foreground(layer, "base"), - }, - hover: { - color: foreground(layer, "on"), - }, - active: { - color: foreground(layer, "on"), - }, - }, - ellipses: { - textColor: colorScheme.ramps.neutral(0.71).hex(), - cornerRadiusFactor: 0.15, - background: { - // Copied from hover_popover highlight - color: colorScheme.ramps.neutral(0.5).alpha(0.0).hex(), - - hover: { - color: colorScheme.ramps.neutral(0.5).alpha(0.5).hex(), - }, - - clicked: { - color: colorScheme.ramps.neutral(0.5).alpha(0.7).hex(), - }, - }, - }, - foldBackground: foreground(layer, "variant"), - }, - diff: { - deleted: isLight - ? colorScheme.ramps.red(0.5).hex() - : colorScheme.ramps.red(0.4).hex(), - modified: isLight - ? colorScheme.ramps.yellow(0.5).hex() - : colorScheme.ramps.yellow(0.5).hex(), - inserted: isLight - ? colorScheme.ramps.green(0.4).hex() - : colorScheme.ramps.green(0.5).hex(), - removedWidthEm: 0.275, - widthEm: 0.15, - cornerRadius: 0.05, - }, - /** Highlights matching occurrences of what is under the cursor - * as well as matched brackets - */ - documentHighlightReadBackground: withOpacity( - foreground(layer, "accent"), - 0.1 - ), - documentHighlightWriteBackground: colorScheme.ramps - .neutral(0.5) - .alpha(0.4) - .hex(), // TODO: This was blend * 2 - errorColor: background(layer, "negative"), - gutterBackground: background(layer), - gutterPaddingFactor: 3.5, - lineNumber: withOpacity(foreground(layer), 0.35), - lineNumberActive: foreground(layer), - renameFade: 0.6, - unnecessaryCodeFade: 0.5, - selection: colorScheme.players[0], - whitespace: colorScheme.ramps.neutral(0.5).hex(), - guestSelections: [ - colorScheme.players[1], - colorScheme.players[2], - colorScheme.players[3], - colorScheme.players[4], - colorScheme.players[5], - colorScheme.players[6], - colorScheme.players[7], - ], - autocomplete: { - background: background(colorScheme.middle), - cornerRadius: 8, - padding: 4, - margin: { - left: -14, - }, - border: border(colorScheme.middle), - shadow: colorScheme.popoverShadow, - matchHighlight: foreground(colorScheme.middle, "accent"), - item: autocompleteItem, - hoveredItem: { - ...autocompleteItem, - matchHighlight: foreground( - colorScheme.middle, - "accent", - "hovered" - ), - background: background(colorScheme.middle, "hovered"), - }, - selectedItem: { - ...autocompleteItem, - matchHighlight: foreground( - colorScheme.middle, - "accent", - "active" - ), - background: background(colorScheme.middle, "active"), - }, - }, - diagnosticHeader: { - background: background(colorScheme.middle), - iconWidthFactor: 1.5, - textScaleFactor: 0.857, - border: border(colorScheme.middle, { - bottom: true, - top: true, - }), - code: { - ...text(colorScheme.middle, "mono", { size: "sm" }), - margin: { - left: 10, - }, - }, - source: { - text: text(colorScheme.middle, "sans", { - size: "sm", - weight: "bold", - }), - }, - message: { - highlightText: text(colorScheme.middle, "sans", { - size: "sm", - weight: "bold", - }), - text: text(colorScheme.middle, "sans", { size: "sm" }), - }, - }, - diagnosticPathHeader: { - background: background(colorScheme.middle), - textScaleFactor: 0.857, - filename: text(colorScheme.middle, "mono", { size: "sm" }), - path: { - ...text(colorScheme.middle, "mono", { size: "sm" }), - margin: { - left: 12, - }, - }, - }, - errorDiagnostic: diagnostic(colorScheme.middle, "negative"), - warningDiagnostic: diagnostic(colorScheme.middle, "warning"), - informationDiagnostic: diagnostic(colorScheme.middle, "accent"), - hintDiagnostic: diagnostic(colorScheme.middle, "warning"), - invalidErrorDiagnostic: diagnostic(colorScheme.middle, "base"), - invalidHintDiagnostic: diagnostic(colorScheme.middle, "base"), - invalidInformationDiagnostic: diagnostic(colorScheme.middle, "base"), - invalidWarningDiagnostic: diagnostic(colorScheme.middle, "base"), - hoverPopover: hoverPopover(colorScheme), - linkDefinition: { - color: syntax.linkUri.color, - underline: syntax.linkUri.underline, - }, - jumpIcon: { - color: foreground(layer, "on"), - iconWidth: 20, - buttonWidth: 20, - cornerRadius: 6, - padding: { - top: 6, - bottom: 6, - left: 6, - right: 6, - }, - hover: { - background: background(layer, "on", "hovered"), - }, - }, - scrollbar: { - width: 12, - minHeightFactor: 1.0, - track: { - border: border(layer, "variant", { left: true }), - }, - thumb: { - background: withOpacity(background(layer, "inverted"), 0.3), - border: { - width: 1, - color: borderColor(layer, "variant"), - top: false, - right: true, - left: true, - bottom: false, - }, - }, - git: { - deleted: isLight - ? withOpacity(colorScheme.ramps.red(0.5).hex(), 0.8) - : withOpacity(colorScheme.ramps.red(0.4).hex(), 0.8), - modified: isLight - ? withOpacity(colorScheme.ramps.yellow(0.5).hex(), 0.8) - : withOpacity(colorScheme.ramps.yellow(0.4).hex(), 0.8), - inserted: isLight - ? withOpacity(colorScheme.ramps.green(0.5).hex(), 0.8) - : withOpacity(colorScheme.ramps.green(0.4).hex(), 0.8), - }, - }, - compositionMark: { - underline: { - thickness: 1.0, - color: borderColor(layer), - }, - }, - syntax, + textScaleFactor: 0.857, + header: { + border: border(layer, { + top: true, + }), + }, + message: { + text: text(layer, "sans", styleSet, "default", { size: "sm" }), + highlightText: text(layer, "sans", styleSet, "default", { + size: "sm", + weight: "bold", + }), + }, } + } + + const syntax = buildSyntax(colorScheme) + + return { + textColor: syntax.primary.color, + background: background(layer), + activeLineBackground: withOpacity(background(layer, "on"), 0.75), + highlightedLineBackground: background(layer, "on"), + // Inline autocomplete suggestions, Co-pilot suggestions, etc. + suggestion: syntax.predictive, + codeActions: { + indicator: { + color: foreground(layer, "variant"), + + clicked: { + color: foreground(layer, "base"), + }, + hover: { + color: foreground(layer, "on"), + }, + active: { + color: foreground(layer, "on"), + }, + }, + verticalScale: 0.55, + }, + folds: { + iconMarginScale: 2.5, + foldedIcon: "icons/chevron_right_8.svg", + foldableIcon: "icons/chevron_down_8.svg", + indicator: { + color: foreground(layer, "variant"), + + clicked: { + color: foreground(layer, "base"), + }, + hover: { + color: foreground(layer, "on"), + }, + active: { + color: foreground(layer, "on"), + }, + }, + ellipses: { + textColor: colorScheme.ramps.neutral(0.71).hex(), + cornerRadiusFactor: 0.15, + background: { + // Copied from hover_popover highlight + color: colorScheme.ramps.neutral(0.5).alpha(0.0).hex(), + + hover: { + color: colorScheme.ramps.neutral(0.5).alpha(0.5).hex(), + }, + + clicked: { + color: colorScheme.ramps.neutral(0.5).alpha(0.7).hex(), + }, + }, + }, + foldBackground: foreground(layer, "variant"), + }, + diff: { + deleted: isLight + ? colorScheme.ramps.red(0.5).hex() + : colorScheme.ramps.red(0.4).hex(), + modified: isLight + ? colorScheme.ramps.yellow(0.5).hex() + : colorScheme.ramps.yellow(0.5).hex(), + inserted: isLight + ? colorScheme.ramps.green(0.4).hex() + : colorScheme.ramps.green(0.5).hex(), + removedWidthEm: 0.275, + widthEm: 0.15, + cornerRadius: 0.05, + }, + /** Highlights matching occurrences of what is under the cursor + * as well as matched brackets + */ + documentHighlightReadBackground: withOpacity( + foreground(layer, "accent"), + 0.1 + ), + documentHighlightWriteBackground: colorScheme.ramps + .neutral(0.5) + .alpha(0.4) + .hex(), // TODO: This was blend * 2 + errorColor: background(layer, "negative"), + gutterBackground: background(layer), + gutterPaddingFactor: 3.5, + lineNumber: withOpacity(foreground(layer), 0.35), + lineNumberActive: foreground(layer), + renameFade: 0.6, + unnecessaryCodeFade: 0.5, + selection: colorScheme.players[0], + whitespace: colorScheme.ramps.neutral(0.5).hex(), + guestSelections: [ + colorScheme.players[1], + colorScheme.players[2], + colorScheme.players[3], + colorScheme.players[4], + colorScheme.players[5], + colorScheme.players[6], + colorScheme.players[7], + ], + autocomplete: { + background: background(colorScheme.middle), + cornerRadius: 8, + padding: 4, + margin: { + left: -14, + }, + border: border(colorScheme.middle), + shadow: colorScheme.popoverShadow, + matchHighlight: foreground(colorScheme.middle, "accent"), + item: autocompleteItem, + hoveredItem: { + ...autocompleteItem, + matchHighlight: foreground( + colorScheme.middle, + "accent", + "hovered" + ), + background: background(colorScheme.middle, "hovered"), + }, + selectedItem: { + ...autocompleteItem, + matchHighlight: foreground( + colorScheme.middle, + "accent", + "active" + ), + background: background(colorScheme.middle, "active"), + }, + }, + diagnosticHeader: { + background: background(colorScheme.middle), + iconWidthFactor: 1.5, + textScaleFactor: 0.857, + border: border(colorScheme.middle, { + bottom: true, + top: true, + }), + code: { + ...text(colorScheme.middle, "mono", { size: "sm" }), + margin: { + left: 10, + }, + }, + source: { + text: text(colorScheme.middle, "sans", { + size: "sm", + weight: "bold", + }), + }, + message: { + highlightText: text(colorScheme.middle, "sans", { + size: "sm", + weight: "bold", + }), + text: text(colorScheme.middle, "sans", { size: "sm" }), + }, + }, + diagnosticPathHeader: { + background: background(colorScheme.middle), + textScaleFactor: 0.857, + filename: text(colorScheme.middle, "mono", { size: "sm" }), + path: { + ...text(colorScheme.middle, "mono", { size: "sm" }), + margin: { + left: 12, + }, + }, + }, + errorDiagnostic: diagnostic(colorScheme.middle, "negative"), + warningDiagnostic: diagnostic(colorScheme.middle, "warning"), + informationDiagnostic: diagnostic(colorScheme.middle, "accent"), + hintDiagnostic: diagnostic(colorScheme.middle, "warning"), + invalidErrorDiagnostic: diagnostic(colorScheme.middle, "base"), + invalidHintDiagnostic: diagnostic(colorScheme.middle, "base"), + invalidInformationDiagnostic: diagnostic(colorScheme.middle, "base"), + invalidWarningDiagnostic: diagnostic(colorScheme.middle, "base"), + hoverPopover: hoverPopover(colorScheme), + linkDefinition: { + color: syntax.linkUri.color, + underline: syntax.linkUri.underline, + }, + jumpIcon: { + color: foreground(layer, "on"), + iconWidth: 20, + buttonWidth: 20, + cornerRadius: 6, + padding: { + top: 6, + bottom: 6, + left: 6, + right: 6, + }, + hover: { + background: background(layer, "on", "hovered"), + }, + }, + scrollbar: { + width: 12, + minHeightFactor: 1.0, + track: { + border: border(layer, "variant", { left: true }), + }, + thumb: { + background: withOpacity(background(layer, "inverted"), 0.3), + border: { + width: 1, + color: borderColor(layer, "variant"), + top: false, + right: true, + left: true, + bottom: false, + }, + }, + git: { + deleted: isLight + ? withOpacity(colorScheme.ramps.red(0.5).hex(), 0.8) + : withOpacity(colorScheme.ramps.red(0.4).hex(), 0.8), + modified: isLight + ? withOpacity(colorScheme.ramps.yellow(0.5).hex(), 0.8) + : withOpacity(colorScheme.ramps.yellow(0.4).hex(), 0.8), + inserted: isLight + ? withOpacity(colorScheme.ramps.green(0.5).hex(), 0.8) + : withOpacity(colorScheme.ramps.green(0.4).hex(), 0.8), + }, + selections: isLight + ? withOpacity(colorScheme.ramps.blue(0.5).hex(), 0.8) + : withOpacity(colorScheme.ramps.blue(0.4).hex(), 0.8) + }, + compositionMark: { + underline: { + thickness: 1.0, + color: borderColor(layer), + }, + }, + syntax, + } } From 18dd3102bfbda57411153d215cae110ea8cd8617 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Wed, 28 Jun 2023 09:29:49 -0700 Subject: [PATCH 002/104] WIP: Add click out event to fix context menus --- crates/context_menu/src/context_menu.rs | 27 +++++++++++--------- crates/gpui/src/app/window.rs | 6 ++++- crates/gpui/src/scene/mouse_event.rs | 22 +++++++++++++++++ crates/gpui/src/scene/mouse_region.rs | 33 ++++++++++++++++++++++++- 4 files changed, 75 insertions(+), 13 deletions(-) diff --git a/crates/context_menu/src/context_menu.rs b/crates/context_menu/src/context_menu.rs index de78b51e9c..9bdf146da4 100644 --- a/crates/context_menu/src/context_menu.rs +++ b/crates/context_menu/src/context_menu.rs @@ -301,18 +301,23 @@ impl ContextMenu { cx: &mut ViewContext, ) { let mut items = items.into_iter().peekable(); - if items.peek().is_some() { - self.items = items.collect(); - self.anchor_position = anchor_position; - self.anchor_corner = anchor_corner; - self.visible = true; - self.show_count += 1; - if !cx.is_self_focused() { - self.previously_focused_view_id = cx.focused_view_id(); - } - cx.focus_self(); - } else { + dbg!(self.visible); + if (self.visible) { self.visible = false; + } else { + if items.peek().is_some() { + self.items = items.collect(); + self.anchor_position = anchor_position; + self.anchor_corner = anchor_corner; + self.visible = true; + self.show_count += 1; + if !cx.is_self_focused() { + self.previously_focused_view_id = cx.focused_view_id(); + } + cx.focus_self(); + } else { + self.visible = false; + } } cx.notify(); } diff --git a/crates/gpui/src/app/window.rs b/crates/gpui/src/app/window.rs index cffce6c3a6..cc6778c930 100644 --- a/crates/gpui/src/app/window.rs +++ b/crates/gpui/src/app/window.rs @@ -9,7 +9,7 @@ use crate::{ }, scene::{ CursorRegion, MouseClick, MouseDown, MouseDownOut, MouseDrag, MouseEvent, MouseHover, - MouseMove, MouseMoveOut, MouseScrollWheel, MouseUp, MouseUpOut, Scene, + MouseMove, MouseMoveOut, MouseScrollWheel, MouseUp, MouseUpOut, Scene, MouseClickOut, }, text_layout::TextLayoutCache, util::post_inc, @@ -524,6 +524,10 @@ impl<'a> WindowContext<'a> { region: Default::default(), platform_event: e.clone(), })); + mouse_events.push(MouseEvent::ClickOut(MouseClickOut { + region: Default::default(), + platform_event: e.clone(), + })); } Event::MouseMoved( diff --git a/crates/gpui/src/scene/mouse_event.rs b/crates/gpui/src/scene/mouse_event.rs index cf0a08f33e..a492da771b 100644 --- a/crates/gpui/src/scene/mouse_event.rs +++ b/crates/gpui/src/scene/mouse_event.rs @@ -99,6 +99,20 @@ impl Deref for MouseClick { } } +#[derive(Debug, Default, Clone)] +pub struct MouseClickOut { + pub region: RectF, + pub platform_event: MouseButtonEvent, +} + +impl Deref for MouseClickOut { + type Target = MouseButtonEvent; + + fn deref(&self) -> &Self::Target { + &self.platform_event + } +} + #[derive(Debug, Default, Clone)] pub struct MouseDownOut { pub region: RectF, @@ -150,6 +164,7 @@ pub enum MouseEvent { Down(MouseDown), Up(MouseUp), Click(MouseClick), + ClickOut(MouseClickOut), DownOut(MouseDownOut), UpOut(MouseUpOut), ScrollWheel(MouseScrollWheel), @@ -165,6 +180,7 @@ impl MouseEvent { MouseEvent::Down(r) => r.region = region, MouseEvent::Up(r) => r.region = region, MouseEvent::Click(r) => r.region = region, + MouseEvent::ClickOut(r) => r.region = region, MouseEvent::DownOut(r) => r.region = region, MouseEvent::UpOut(r) => r.region = region, MouseEvent::ScrollWheel(r) => r.region = region, @@ -182,6 +198,7 @@ impl MouseEvent { MouseEvent::Down(_) => true, MouseEvent::Up(_) => true, MouseEvent::Click(_) => true, + MouseEvent::ClickOut(_) => true, MouseEvent::DownOut(_) => false, MouseEvent::UpOut(_) => false, MouseEvent::ScrollWheel(_) => true, @@ -222,6 +239,10 @@ impl MouseEvent { discriminant(&MouseEvent::Click(Default::default())) } + pub fn click_out_disc() -> Discriminant { + discriminant(&MouseEvent::ClickOut(Default::default())) + } + pub fn down_out_disc() -> Discriminant { discriminant(&MouseEvent::DownOut(Default::default())) } @@ -239,6 +260,7 @@ impl MouseEvent { MouseEvent::Down(e) => HandlerKey::new(Self::down_disc(), Some(e.button)), MouseEvent::Up(e) => HandlerKey::new(Self::up_disc(), Some(e.button)), MouseEvent::Click(e) => HandlerKey::new(Self::click_disc(), Some(e.button)), + MouseEvent::ClickOut(e) => HandlerKey::new(Self::click_out_disc(), Some(e.button)), MouseEvent::UpOut(e) => HandlerKey::new(Self::up_out_disc(), Some(e.button)), MouseEvent::DownOut(e) => HandlerKey::new(Self::down_out_disc(), Some(e.button)), MouseEvent::ScrollWheel(_) => HandlerKey::new(Self::scroll_wheel_disc(), None), diff --git a/crates/gpui/src/scene/mouse_region.rs b/crates/gpui/src/scene/mouse_region.rs index 0efc794148..7e1d5d6e1e 100644 --- a/crates/gpui/src/scene/mouse_region.rs +++ b/crates/gpui/src/scene/mouse_region.rs @@ -14,7 +14,7 @@ use super::{ MouseClick, MouseDown, MouseDownOut, MouseDrag, MouseEvent, MouseHover, MouseMove, MouseUp, MouseUpOut, }, - MouseMoveOut, MouseScrollWheel, + MouseMoveOut, MouseScrollWheel, MouseClickOut, }; #[derive(Clone)] @@ -89,6 +89,15 @@ impl MouseRegion { self } + pub fn on_click_out(mut self, button: MouseButton, handler: F) -> Self + where + V: View, + F: Fn(MouseClickOut, &mut V, &mut EventContext) + 'static, + { + self.handlers = self.handlers.on_click(button, handler); + self + } + pub fn on_down_out(mut self, button: MouseButton, handler: F) -> Self where V: View, @@ -405,6 +414,28 @@ impl HandlerSet { self } + pub fn on_click_out(mut self, button: MouseButton, handler: F) -> Self + where + V: View, + F: Fn(MouseClickOut, &mut V, &mut EventContext) + 'static, + { + self.insert(MouseEvent::click_out_disc(), Some(button), + Rc::new(move |region_event, view, cx, view_id| { + if let MouseEvent::ClickOut(e) = region_event { + let view = view.downcast_mut().unwrap(); + let mut cx = ViewContext::mutable(cx, view_id); + let mut cx = EventContext::new(&mut cx); + handler(e, view, &mut cx); + cx.handled + } else { + panic!( + "Mouse Region Event incorrectly called with mismatched event type. Expected MouseRegionEvent::ClickOut, found {:?}", + region_event); + } + })); + self + } + pub fn on_down_out(mut self, button: MouseButton, handler: F) -> Self where V: View, From e0d618862c410741b65200ed3e7058184bef58d3 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Wed, 28 Jun 2023 16:23:07 -0700 Subject: [PATCH 003/104] Add click out handler Make all context menus on button click toggles instead of re-shows --- crates/context_menu/src/context_menu.rs | 31 ++++++++----------- crates/gpui/src/app/window.rs | 2 +- .../gpui/src/elements/mouse_event_handler.rs | 12 ++++++- crates/gpui/src/scene/mouse_region.rs | 6 +++- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/crates/context_menu/src/context_menu.rs b/crates/context_menu/src/context_menu.rs index 9bdf146da4..a603b3578a 100644 --- a/crates/context_menu/src/context_menu.rs +++ b/crates/context_menu/src/context_menu.rs @@ -301,23 +301,18 @@ impl ContextMenu { cx: &mut ViewContext, ) { let mut items = items.into_iter().peekable(); - dbg!(self.visible); - if (self.visible) { - self.visible = false; - } else { - if items.peek().is_some() { - self.items = items.collect(); - self.anchor_position = anchor_position; - self.anchor_corner = anchor_corner; - self.visible = true; - self.show_count += 1; - if !cx.is_self_focused() { - self.previously_focused_view_id = cx.focused_view_id(); - } - cx.focus_self(); - } else { - self.visible = false; + if items.peek().is_some() { + self.items = items.collect(); + self.anchor_position = anchor_position; + self.anchor_corner = anchor_corner; + self.visible = true; + self.show_count += 1; + if !cx.is_self_focused() { + self.previously_focused_view_id = cx.focused_view_id(); } + cx.focus_self(); + } else { + self.visible = false; } cx.notify(); } @@ -482,10 +477,10 @@ impl ContextMenu { .contained() .with_style(style.container) }) - .on_down_out(MouseButton::Left, |_, this, cx| { + .on_click_out(MouseButton::Left, |_, this, cx| { this.cancel(&Default::default(), cx); }) - .on_down_out(MouseButton::Right, |_, this, cx| { + .on_click_out(MouseButton::Right, |_, this, cx| { this.cancel(&Default::default(), cx); }) } diff --git a/crates/gpui/src/app/window.rs b/crates/gpui/src/app/window.rs index cc6778c930..5b15e62efa 100644 --- a/crates/gpui/src/app/window.rs +++ b/crates/gpui/src/app/window.rs @@ -716,7 +716,7 @@ impl<'a> WindowContext<'a> { } } - MouseEvent::MoveOut(_) | MouseEvent::UpOut(_) | MouseEvent::DownOut(_) => { + MouseEvent::MoveOut(_) | MouseEvent::UpOut(_) | MouseEvent::DownOut(_) | MouseEvent::ClickOut(_) => { for (mouse_region, _) in self.window.mouse_regions.iter().rev() { // NOT contains if !mouse_region diff --git a/crates/gpui/src/elements/mouse_event_handler.rs b/crates/gpui/src/elements/mouse_event_handler.rs index 6f2762db66..03f481b071 100644 --- a/crates/gpui/src/elements/mouse_event_handler.rs +++ b/crates/gpui/src/elements/mouse_event_handler.rs @@ -8,7 +8,7 @@ use crate::{ platform::MouseButton, scene::{ CursorRegion, HandlerSet, MouseClick, MouseDown, MouseDownOut, MouseDrag, MouseHover, - MouseMove, MouseMoveOut, MouseScrollWheel, MouseUp, MouseUpOut, + MouseMove, MouseMoveOut, MouseScrollWheel, MouseUp, MouseUpOut, MouseClickOut, }, AnyElement, Element, EventContext, LayoutContext, MouseRegion, MouseState, SceneBuilder, SizeConstraint, View, ViewContext, @@ -136,6 +136,16 @@ impl MouseEventHandler { self } + pub fn on_click_out( + mut self, + button: MouseButton, + handler: impl Fn(MouseClickOut, &mut V, &mut EventContext) + 'static, + ) -> Self { + self.handlers = self.handlers.on_click_out(button, handler); + self + } + + pub fn on_down_out( mut self, button: MouseButton, diff --git a/crates/gpui/src/scene/mouse_region.rs b/crates/gpui/src/scene/mouse_region.rs index 7e1d5d6e1e..3576529eec 100644 --- a/crates/gpui/src/scene/mouse_region.rs +++ b/crates/gpui/src/scene/mouse_region.rs @@ -94,7 +94,7 @@ impl MouseRegion { V: View, F: Fn(MouseClickOut, &mut V, &mut EventContext) + 'static, { - self.handlers = self.handlers.on_click(button, handler); + self.handlers = self.handlers.on_click_out(button, handler); self } @@ -255,6 +255,10 @@ impl HandlerSet { HandlerKey::new(MouseEvent::click_disc(), Some(button)), SmallVec::from_buf([Rc::new(|_, _, _, _| true)]), ); + set.insert( + HandlerKey::new(MouseEvent::click_out_disc(), Some(button)), + SmallVec::from_buf([Rc::new(|_, _, _, _| true)]), + ); set.insert( HandlerKey::new(MouseEvent::down_out_disc(), Some(button)), SmallVec::from_buf([Rc::new(|_, _, _, _| true)]), From 6ffa6afd20c693dadcc0cd5ca733c809cf465e7e Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Wed, 28 Jun 2023 16:35:57 -0700 Subject: [PATCH 004/104] fmt --- crates/gpui/src/app/window.rs | 9 ++++++--- crates/gpui/src/elements/mouse_event_handler.rs | 5 ++--- crates/gpui/src/scene/mouse_region.rs | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/crates/gpui/src/app/window.rs b/crates/gpui/src/app/window.rs index 5b15e62efa..23fbb33fe1 100644 --- a/crates/gpui/src/app/window.rs +++ b/crates/gpui/src/app/window.rs @@ -8,8 +8,8 @@ use crate::{ MouseButton, MouseMovedEvent, PromptLevel, WindowBounds, }, scene::{ - CursorRegion, MouseClick, MouseDown, MouseDownOut, MouseDrag, MouseEvent, MouseHover, - MouseMove, MouseMoveOut, MouseScrollWheel, MouseUp, MouseUpOut, Scene, MouseClickOut, + CursorRegion, MouseClick, MouseClickOut, MouseDown, MouseDownOut, MouseDrag, MouseEvent, + MouseHover, MouseMove, MouseMoveOut, MouseScrollWheel, MouseUp, MouseUpOut, Scene, }, text_layout::TextLayoutCache, util::post_inc, @@ -716,7 +716,10 @@ impl<'a> WindowContext<'a> { } } - MouseEvent::MoveOut(_) | MouseEvent::UpOut(_) | MouseEvent::DownOut(_) | MouseEvent::ClickOut(_) => { + MouseEvent::MoveOut(_) + | MouseEvent::UpOut(_) + | MouseEvent::DownOut(_) + | MouseEvent::ClickOut(_) => { for (mouse_region, _) in self.window.mouse_regions.iter().rev() { // NOT contains if !mouse_region diff --git a/crates/gpui/src/elements/mouse_event_handler.rs b/crates/gpui/src/elements/mouse_event_handler.rs index 03f481b071..1b8142d964 100644 --- a/crates/gpui/src/elements/mouse_event_handler.rs +++ b/crates/gpui/src/elements/mouse_event_handler.rs @@ -7,8 +7,8 @@ use crate::{ platform::CursorStyle, platform::MouseButton, scene::{ - CursorRegion, HandlerSet, MouseClick, MouseDown, MouseDownOut, MouseDrag, MouseHover, - MouseMove, MouseMoveOut, MouseScrollWheel, MouseUp, MouseUpOut, MouseClickOut, + CursorRegion, HandlerSet, MouseClick, MouseClickOut, MouseDown, MouseDownOut, MouseDrag, + MouseHover, MouseMove, MouseMoveOut, MouseScrollWheel, MouseUp, MouseUpOut, }, AnyElement, Element, EventContext, LayoutContext, MouseRegion, MouseState, SceneBuilder, SizeConstraint, View, ViewContext, @@ -145,7 +145,6 @@ impl MouseEventHandler { self } - pub fn on_down_out( mut self, button: MouseButton, diff --git a/crates/gpui/src/scene/mouse_region.rs b/crates/gpui/src/scene/mouse_region.rs index 3576529eec..ca2cc04b9d 100644 --- a/crates/gpui/src/scene/mouse_region.rs +++ b/crates/gpui/src/scene/mouse_region.rs @@ -14,7 +14,7 @@ use super::{ MouseClick, MouseDown, MouseDownOut, MouseDrag, MouseEvent, MouseHover, MouseMove, MouseUp, MouseUpOut, }, - MouseMoveOut, MouseScrollWheel, MouseClickOut, + MouseClickOut, MouseMoveOut, MouseScrollWheel, }; #[derive(Clone)] From 53666311733e591caf5b712ff10954fd40ea8c87 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Thu, 29 Jun 2023 17:10:51 -0700 Subject: [PATCH 005/104] Remove on_click_out handler from context menu Add 'delay_cancel()' method and on_down handler to relevant buttons --- crates/collab_ui/src/collab_titlebar_item.rs | 5 +- crates/context_menu/src/context_menu.rs | 58 ++++++++++++++++---- crates/copilot_button/src/copilot_button.rs | 7 ++- crates/terminal_view/src/terminal_element.rs | 21 +++---- crates/terminal_view/src/terminal_panel.rs | 2 + crates/workspace/src/pane.rs | 13 +++-- 6 files changed, 79 insertions(+), 27 deletions(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 2ab8928166..5caebb9f0c 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -317,7 +317,7 @@ impl CollabTitlebarItem { ), ] }; - user_menu.show(Default::default(), AnchorCorner::TopRight, items, cx); + user_menu.toggle(Default::default(), AnchorCorner::TopRight, items, cx); }); } @@ -683,6 +683,9 @@ impl CollabTitlebarItem { .into_any() }) .with_cursor_style(CursorStyle::PointingHand) + .on_down(MouseButton::Left, move |_, this, cx| { + this.user_menu.update(cx, |menu, _| menu.delay_cancel()); + }) .on_click(MouseButton::Left, move |_, this, cx| { this.toggle_user_menu(&Default::default(), cx) }) diff --git a/crates/context_menu/src/context_menu.rs b/crates/context_menu/src/context_menu.rs index a603b3578a..296f6bc04a 100644 --- a/crates/context_menu/src/context_menu.rs +++ b/crates/context_menu/src/context_menu.rs @@ -124,6 +124,7 @@ pub struct ContextMenu { items: Vec, selected_index: Option, visible: bool, + delay_cancel: bool, previously_focused_view_id: Option, parent_view_id: usize, _actions_observation: Subscription, @@ -178,6 +179,7 @@ impl ContextMenu { pub fn new(parent_view_id: usize, cx: &mut ViewContext) -> Self { Self { show_count: 0, + delay_cancel: false, anchor_position: Default::default(), anchor_corner: AnchorCorner::TopLeft, position_mode: OverlayPositionMode::Window, @@ -232,15 +234,23 @@ impl ContextMenu { } } + pub fn delay_cancel(&mut self) { + self.delay_cancel = true; + } + fn cancel(&mut self, _: &Cancel, cx: &mut ViewContext) { - self.reset(cx); - let show_count = self.show_count; - cx.defer(move |this, cx| { - if cx.handle().is_focused(cx) && this.show_count == show_count { - let window_id = cx.window_id(); - (**cx).focus(window_id, this.previously_focused_view_id.take()); - } - }); + if !self.delay_cancel { + self.reset(cx); + let show_count = self.show_count; + cx.defer(move |this, cx| { + if cx.handle().is_focused(cx) && this.show_count == show_count { + let window_id = cx.window_id(); + (**cx).focus(window_id, this.previously_focused_view_id.take()); + } + }); + } else { + self.delay_cancel = false; + } } fn reset(&mut self, cx: &mut ViewContext) { @@ -293,6 +303,34 @@ impl ContextMenu { } } + pub fn toggle( + &mut self, + anchor_position: Vector2F, + anchor_corner: AnchorCorner, + items: Vec, + cx: &mut ViewContext, + ) { + if self.visible() { + self.cancel(&Cancel, cx); + } else { + let mut items = items.into_iter().peekable(); + if items.peek().is_some() { + self.items = items.collect(); + self.anchor_position = anchor_position; + self.anchor_corner = anchor_corner; + self.visible = true; + self.show_count += 1; + if !cx.is_self_focused() { + self.previously_focused_view_id = cx.focused_view_id(); + } + cx.focus_self(); + } else { + self.visible = false; + } + } + cx.notify(); + } + pub fn show( &mut self, anchor_position: Vector2F, @@ -477,10 +515,10 @@ impl ContextMenu { .contained() .with_style(style.container) }) - .on_click_out(MouseButton::Left, |_, this, cx| { + .on_down_out(MouseButton::Left, |_, this, cx| { this.cancel(&Default::default(), cx); }) - .on_click_out(MouseButton::Right, |_, this, cx| { + .on_down_out(MouseButton::Right, |_, this, cx| { this.cancel(&Default::default(), cx); }) } diff --git a/crates/copilot_button/src/copilot_button.rs b/crates/copilot_button/src/copilot_button.rs index 9b0581492f..5576451b1b 100644 --- a/crates/copilot_button/src/copilot_button.rs +++ b/crates/copilot_button/src/copilot_button.rs @@ -102,6 +102,9 @@ impl View for CopilotButton { } }) .with_cursor_style(CursorStyle::PointingHand) + .on_down(MouseButton::Left, |_, this, cx| { + this.popup_menu.update(cx, |menu, _| menu.delay_cancel()); + }) .on_click(MouseButton::Left, { let status = status.clone(); move |_, this, cx| match status { @@ -186,7 +189,7 @@ impl CopilotButton { })); self.popup_menu.update(cx, |menu, cx| { - menu.show( + menu.toggle( Default::default(), AnchorCorner::BottomRight, menu_options, @@ -266,7 +269,7 @@ impl CopilotButton { menu_options.push(ContextMenuItem::action("Sign Out", SignOut)); self.popup_menu.update(cx, |menu, cx| { - menu.show( + menu.toggle( Default::default(), AnchorCorner::BottomRight, menu_options, diff --git a/crates/terminal_view/src/terminal_element.rs b/crates/terminal_view/src/terminal_element.rs index 2f2ff2cdc3..b92059f5d6 100644 --- a/crates/terminal_view/src/terminal_element.rs +++ b/crates/terminal_view/src/terminal_element.rs @@ -395,16 +395,17 @@ impl TerminalElement { // Terminal Emulator controlled behavior: region = region // Start selections - .on_down( - MouseButton::Left, - TerminalElement::generic_button_handler( - connection, - origin, - move |terminal, origin, e, _cx| { - terminal.mouse_down(&e, origin); - }, - ), - ) + .on_down(MouseButton::Left, move |event, v: &mut TerminalView, cx| { + cx.focus_parent(); + v.context_menu.update(cx, |menu, _cx| menu.delay_cancel()); + if let Some(conn_handle) = connection.upgrade(cx) { + conn_handle.update(cx, |terminal, cx| { + terminal.mouse_down(&event, origin); + + cx.notify(); + }) + } + }) // Update drag selections .on_drag(MouseButton::Left, move |event, _: &mut TerminalView, cx| { if cx.is_self_focused() { diff --git a/crates/terminal_view/src/terminal_panel.rs b/crates/terminal_view/src/terminal_panel.rs index 6de6527a26..11f8f7abde 100644 --- a/crates/terminal_view/src/terminal_panel.rs +++ b/crates/terminal_view/src/terminal_panel.rs @@ -87,6 +87,7 @@ impl TerminalPanel { } }) }, + |_, _| {}, None, )) .with_child(Pane::render_tab_bar_button( @@ -100,6 +101,7 @@ impl TerminalPanel { Some(("Toggle Zoom".into(), Some(Box::new(workspace::ToggleZoom)))), cx, move |pane, cx| pane.toggle_zoom(&Default::default(), cx), + |_, _| {}, None, )) .into_any() diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index 9776fede2c..e61e60d68f 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -273,6 +273,7 @@ impl Pane { Some(("New...".into(), None)), cx, |pane, cx| pane.deploy_new_menu(cx), + |pane, cx| pane.tab_bar_context_menu.handle.update(cx, |menu, _| menu.delay_cancel()), pane.tab_bar_context_menu .handle_if_kind(TabBarContextMenuKind::New), )) @@ -283,6 +284,7 @@ impl Pane { Some(("Split Pane".into(), None)), cx, |pane, cx| pane.deploy_split_menu(cx), + |pane, cx| pane.tab_bar_context_menu.handle.update(cx, |menu, _| menu.delay_cancel()), pane.tab_bar_context_menu .handle_if_kind(TabBarContextMenuKind::Split), )) @@ -304,6 +306,7 @@ impl Pane { Some((tooltip_label, Some(Box::new(ToggleZoom)))), cx, move |pane, cx| pane.toggle_zoom(&Default::default(), cx), + move |_, _| {}, None, ) }) @@ -988,7 +991,7 @@ impl Pane { fn deploy_split_menu(&mut self, cx: &mut ViewContext) { self.tab_bar_context_menu.handle.update(cx, |menu, cx| { - menu.show( + menu.toggle( Default::default(), AnchorCorner::TopRight, vec![ @@ -1006,7 +1009,7 @@ impl Pane { fn deploy_new_menu(&mut self, cx: &mut ViewContext) { self.tab_bar_context_menu.handle.update(cx, |menu, cx| { - menu.show( + menu.toggle( Default::default(), AnchorCorner::TopRight, vec![ @@ -1416,13 +1419,14 @@ impl Pane { .into_any() } - pub fn render_tab_bar_button)>( + pub fn render_tab_bar_button), F2: 'static + Fn(&mut Pane, &mut EventContext)>( index: usize, icon: &'static str, is_active: bool, tooltip: Option<(String, Option>)>, cx: &mut ViewContext, - on_click: F, + on_click: F1, + on_down: F2, context_menu: Option>, ) -> AnyElement { enum TabBarButton {} @@ -1440,6 +1444,7 @@ impl Pane { .with_height(style.button_width) }) .with_cursor_style(CursorStyle::PointingHand) + .on_down(MouseButton::Left, move |_, pane, cx| on_down(pane, cx)) .on_click(MouseButton::Left, move |_, pane, cx| on_click(pane, cx)) .into_any(); if let Some((tooltip, action)) = tooltip { From 73b0f3b23d126a9f06eec8cbf3fbcd15a4c3745f Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Thu, 29 Jun 2023 17:19:35 -0700 Subject: [PATCH 006/104] fmt --- crates/workspace/src/pane.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index e61e60d68f..6a20fab9a2 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -273,7 +273,11 @@ impl Pane { Some(("New...".into(), None)), cx, |pane, cx| pane.deploy_new_menu(cx), - |pane, cx| pane.tab_bar_context_menu.handle.update(cx, |menu, _| menu.delay_cancel()), + |pane, cx| { + pane.tab_bar_context_menu + .handle + .update(cx, |menu, _| menu.delay_cancel()) + }, pane.tab_bar_context_menu .handle_if_kind(TabBarContextMenuKind::New), )) @@ -284,7 +288,11 @@ impl Pane { Some(("Split Pane".into(), None)), cx, |pane, cx| pane.deploy_split_menu(cx), - |pane, cx| pane.tab_bar_context_menu.handle.update(cx, |menu, _| menu.delay_cancel()), + |pane, cx| { + pane.tab_bar_context_menu + .handle + .update(cx, |menu, _| menu.delay_cancel()) + }, pane.tab_bar_context_menu .handle_if_kind(TabBarContextMenuKind::Split), )) @@ -1419,7 +1427,10 @@ impl Pane { .into_any() } - pub fn render_tab_bar_button), F2: 'static + Fn(&mut Pane, &mut EventContext)>( + pub fn render_tab_bar_button< + F1: 'static + Fn(&mut Pane, &mut EventContext), + F2: 'static + Fn(&mut Pane, &mut EventContext), + >( index: usize, icon: &'static str, is_active: bool, From 33f5248d4f6c2395f8633aa307571e3b69dc7ff6 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Wed, 21 Jun 2023 15:23:52 -0700 Subject: [PATCH 007/104] Add the ability to make new directories by adding slashes to a file name --- Cargo.lock | 1 + Cargo.toml | 1 + crates/collab/Cargo.toml | 2 +- crates/fs/src/fs.rs | 6 + crates/project/Cargo.toml | 2 +- crates/project/src/worktree.rs | 23 +++- crates/project/src/worktree_tests.rs | 77 +++++++++++ crates/project_panel/Cargo.toml | 1 + crates/project_panel/src/project_panel.rs | 152 +++++++++++++++++++++- crates/settings/Cargo.toml | 2 +- 10 files changed, 259 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a9b2e29ea0..3748f24933 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5033,6 +5033,7 @@ dependencies = [ "language", "menu", "postage", + "pretty_assertions", "project", "schemars", "serde", diff --git a/Cargo.toml b/Cargo.toml index 3f3953096e..26555f32cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -101,6 +101,7 @@ time = { version = "0.3", features = ["serde", "serde-well-known"] } toml = { version = "0.5" } tree-sitter = "0.20" unindent = { version = "0.1.7" } +pretty_assertions = "1.3.0" [patch.crates-io] tree-sitter = { git = "https://github.com/tree-sitter/tree-sitter", rev = "49226023693107fba9a1191136a4f47f38cdca73" } diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index a87234ded7..0c752a2047 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -67,7 +67,7 @@ fs = { path = "../fs", features = ["test-support"] } git = { path = "../git", features = ["test-support"] } live_kit_client = { path = "../live_kit_client", features = ["test-support"] } lsp = { path = "../lsp", features = ["test-support"] } -pretty_assertions = "1.3.0" +pretty_assertions = "*" project = { path = "../project", features = ["test-support"] } rpc = { path = "../rpc", features = ["test-support"] } settings = { path = "../settings", features = ["test-support"] } diff --git a/crates/fs/src/fs.rs b/crates/fs/src/fs.rs index 592e6c9a53..ec8a249ff4 100644 --- a/crates/fs/src/fs.rs +++ b/crates/fs/src/fs.rs @@ -279,6 +279,9 @@ impl Fs for RealFs { async fn save(&self, path: &Path, text: &Rope, line_ending: LineEnding) -> Result<()> { let buffer_size = text.summary().len.min(10 * 1024); + if let Some(path) = path.parent() { + self.create_dir(path).await?; + } let file = smol::fs::File::create(path).await?; let mut writer = smol::io::BufWriter::with_capacity(buffer_size, file); for chunk in chunks(text, line_ending) { @@ -1077,6 +1080,9 @@ impl Fs for FakeFs { self.simulate_random_delay().await; let path = normalize_path(path); let content = chunks(text, line_ending).collect(); + if let Some(path) = path.parent() { + self.create_dir(path).await?; + } self.write_file_internal(path, content)?; Ok(()) } diff --git a/crates/project/Cargo.toml b/crates/project/Cargo.toml index d6578c87ba..dbc0c617f2 100644 --- a/crates/project/Cargo.toml +++ b/crates/project/Cargo.toml @@ -64,7 +64,7 @@ itertools = "0.10" [dev-dependencies] ctor.workspace = true env_logger.workspace = true -pretty_assertions = "1.3.0" +pretty_assertions = "*" client = { path = "../client", features = ["test-support"] } collections = { path = "../collections", features = ["test-support"] } db = { path = "../db", features = ["test-support"] } diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 20e693770f..a0497fa677 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -1001,10 +1001,25 @@ impl LocalWorktree { cx.spawn(|this, mut cx| async move { write.await?; - this.update(&mut cx, |this, cx| { - this.as_local_mut().unwrap().refresh_entry(path, None, cx) - }) - .await + let (result, refreshes) = this.update(&mut cx, |this, cx| { + let mut refreshes = Vec::new(); + for path in path.ancestors().skip(1) { + refreshes.push(this.as_local_mut().unwrap().refresh_entry( + path.into(), + None, + cx, + )); + } + ( + this.as_local_mut().unwrap().refresh_entry(path, None, cx), + refreshes, + ) + }); + for refresh in refreshes { + refresh.await.log_err(); + } + + result.await }) } diff --git a/crates/project/src/worktree_tests.rs b/crates/project/src/worktree_tests.rs index f908d702eb..efc5f42369 100644 --- a/crates/project/src/worktree_tests.rs +++ b/crates/project/src/worktree_tests.rs @@ -936,6 +936,83 @@ async fn test_create_directory_during_initial_scan(cx: &mut TestAppContext) { ); } +#[gpui::test] +async fn test_create_dir_all_on_create_entry(cx: &mut TestAppContext) { + let client_fake = cx.read(|cx| Client::new(FakeHttpClient::with_404_response(), cx)); + + let fs_fake = FakeFs::new(cx.background()); + fs_fake.insert_tree( + "/root", + json!({ + "a": {}, + }), + ) + .await; + + let tree_fake = Worktree::local( + client_fake, + "/root".as_ref(), + true, + fs_fake, + Default::default(), + &mut cx.to_async(), + ) + .await + .unwrap(); + + let entry = tree_fake + .update(cx, |tree, cx| { + tree.as_local_mut() + .unwrap() + .create_entry("a/b/c/d.txt".as_ref(), false, cx) + }) + .await + .unwrap(); + assert!(entry.is_file()); + + cx.foreground().run_until_parked(); + tree_fake.read_with(cx, |tree, _| { + assert!(tree.entry_for_path("a/b/c/d.txt").unwrap().is_file()); + assert!(tree.entry_for_path("a/b/c/").unwrap().is_dir()); + assert!(tree.entry_for_path("a/b/").unwrap().is_dir()); + }); + + let client_real = cx.read(|cx| Client::new(FakeHttpClient::with_404_response(), cx)); + + let fs_real = Arc::new(RealFs); + let temp_root = temp_tree(json!({ + "a": {} + })); + + let tree_real = Worktree::local( + client_real, + temp_root.path(), + true, + fs_real, + Default::default(), + &mut cx.to_async(), + ) + .await + .unwrap(); + + let entry = tree_real + .update(cx, |tree, cx| { + tree.as_local_mut() + .unwrap() + .create_entry("a/b/c/d.txt".as_ref(), false, cx) + }) + .await + .unwrap(); + assert!(entry.is_file()); + + cx.foreground().run_until_parked(); + tree_real.read_with(cx, |tree, _| { + assert!(tree.entry_for_path("a/b/c/d.txt").unwrap().is_file()); + assert!(tree.entry_for_path("a/b/c/").unwrap().is_dir()); + assert!(tree.entry_for_path("a/b/").unwrap().is_dir()); + }); +} + #[gpui::test(iterations = 100)] async fn test_random_worktree_operations_during_initial_scan( cx: &mut TestAppContext, diff --git a/crates/project_panel/Cargo.toml b/crates/project_panel/Cargo.toml index 55efc09deb..33606fccc4 100644 --- a/crates/project_panel/Cargo.toml +++ b/crates/project_panel/Cargo.toml @@ -27,6 +27,7 @@ serde_derive.workspace = true serde_json.workspace = true anyhow.workspace = true schemars.workspace = true +pretty_assertions.workspace = true unicase = "2.6" [dev-dependencies] diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index 3f80e02317..57a45ddb16 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -64,7 +64,7 @@ pub struct ProjectPanel { pending_serialization: Task>, } -#[derive(Copy, Clone)] +#[derive(Copy, Clone, Debug)] struct Selection { worktree_id: WorktreeId, entry_id: ProjectEntryId, @@ -588,6 +588,7 @@ impl ProjectPanel { if selection.entry_id == edited_entry_id { selection.worktree_id = worktree_id; selection.entry_id = new_entry.id; + this.expand_to_selection(cx); } } this.update_visible_entries(None, cx); @@ -965,6 +966,25 @@ impl ProjectPanel { Some((worktree, entry)) } + fn expand_to_selection(&mut self, cx: &mut ViewContext) -> Option<()> { + let (worktree, entry) = self.selected_entry(cx)?; + let expanded_dir_ids = self.expanded_dir_ids.entry(worktree.id()).or_default(); + + for path in entry.path.ancestors() { + let Some(entry) = worktree.entry_for_path(path) else { + continue; + }; + if entry.is_dir() { + if let Err(idx) = expanded_dir_ids.binary_search(&entry.id) { + expanded_dir_ids.insert(idx, entry.id); + } + } + } + + + Some(()) + } + fn update_visible_entries( &mut self, new_selected_entry: Option<(WorktreeId, ProjectEntryId)>, @@ -1139,6 +1159,7 @@ impl ProjectPanel { for entry in visible_worktree_entries[entry_range].iter() { let status = git_status_setting.then(|| entry.git_status).flatten(); + let mut details = EntryDetails { filename: entry .path @@ -1592,6 +1613,7 @@ impl ClipboardEntry { mod tests { use super::*; use gpui::{TestAppContext, ViewHandle}; + use pretty_assertions::assert_eq; use project::FakeFs; use serde_json::json; use settings::SettingsStore; @@ -2002,6 +2024,134 @@ mod tests { ); } + #[gpui::test(iterations = 30)] + async fn test_adding_directories_via_file(cx: &mut gpui::TestAppContext) { + init_test(cx); + + let fs = FakeFs::new(cx.background()); + fs.insert_tree( + "/root1", + json!({ + ".dockerignore": "", + ".git": { + "HEAD": "", + }, + "a": { + "0": { "q": "", "r": "", "s": "" }, + "1": { "t": "", "u": "" }, + "2": { "v": "", "w": "", "x": "", "y": "" }, + }, + "b": { + "3": { "Q": "" }, + "4": { "R": "", "S": "", "T": "", "U": "" }, + }, + "C": { + "5": {}, + "6": { "V": "", "W": "" }, + "7": { "X": "" }, + "8": { "Y": {}, "Z": "" } + } + }), + ) + .await; + fs.insert_tree( + "/root2", + json!({ + "d": { + "9": "" + }, + "e": {} + }), + ) + .await; + + let project = Project::test(fs.clone(), ["/root1".as_ref(), "/root2".as_ref()], cx).await; + let (window_id, workspace) = cx.add_window(|cx| Workspace::test_new(project.clone(), cx)); + let panel = workspace.update(cx, |workspace, cx| ProjectPanel::new(workspace, cx)); + + select_path(&panel, "root1", cx); + assert_eq!( + visible_entries_as_strings(&panel, 0..10, cx), + &[ + "v root1 <== selected", + " > .git", + " > a", + " > b", + " > C", + " .dockerignore", + "v root2", + " > d", + " > e", + ] + ); + + // Add a file with the root folder selected. The filename editor is placed + // before the first file in the root folder. + panel.update(cx, |panel, cx| panel.new_file(&NewFile, cx)); + cx.read_window(window_id, |cx| { + let panel = panel.read(cx); + assert!(panel.filename_editor.is_focused(cx)); + }); + assert_eq!( + visible_entries_as_strings(&panel, 0..10, cx), + &[ + "v root1", + " > .git", + " > a", + " > b", + " > C", + " [EDITOR: ''] <== selected", + " .dockerignore", + "v root2", + " > d", + " > e", + ] + ); + + + let confirm = panel.update(cx, |panel, cx| { + panel.filename_editor.update(cx, |editor, cx| { + editor.set_text("bdir1/dir2/the-new-filename", cx) + }); + panel.confirm(&Confirm, cx).unwrap() + }); + + assert_eq!( + visible_entries_as_strings(&panel, 0..10, cx), + &[ + "v root1", + " > .git", + " > a", + " > b", + " > C", + " [PROCESSING: 'bdir1/dir2/the-new-filename'] <== selected", + " .dockerignore", + "v root2", + " > d", + " > e", + ] + ); + + confirm.await.unwrap(); + assert_eq!( + visible_entries_as_strings(&panel, 0..13, cx), + &[ + "v root1", + " > .git", + " > a", + " > b", + " v bdir1", + " v dir2", + " the-new-filename <== selected", + " > C", + " .dockerignore", + "v root2", + " > d", + " > e", + ] + ); + } + #[gpui::test] async fn test_copy_paste(cx: &mut gpui::TestAppContext) { init_test(cx); diff --git a/crates/settings/Cargo.toml b/crates/settings/Cargo.toml index b5dc301a5c..6c1ded805b 100644 --- a/crates/settings/Cargo.toml +++ b/crates/settings/Cargo.toml @@ -38,5 +38,5 @@ tree-sitter-json = "*" gpui = { path = "../gpui", features = ["test-support"] } fs = { path = "../fs", features = ["test-support"] } indoc.workspace = true -pretty_assertions = "1.3.0" +pretty_assertions = "*" unindent.workspace = true From cd670e340fa4a7e5c6d452a87ceee6329ae0ee21 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Thu, 29 Jun 2023 17:48:01 -0700 Subject: [PATCH 008/104] Fix edge case with absolute file paths --- crates/project_panel/src/project_panel.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index 57a45ddb16..fe8c649420 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -547,7 +547,7 @@ impl ProjectPanel { worktree_id, entry_id: NEW_ENTRY_ID, }); - let new_path = entry.path.join(&filename); + let new_path = entry.path.join(&filename.trim_start_matches("/")); if path_already_exists(new_path.as_path()) { return None; } @@ -2111,7 +2111,7 @@ mod tests { let confirm = panel.update(cx, |panel, cx| { panel.filename_editor.update(cx, |editor, cx| { - editor.set_text("bdir1/dir2/the-new-filename", cx) + editor.set_text("/bdir1/dir2/the-new-filename", cx) }); panel.confirm(&Confirm, cx).unwrap() }); @@ -2124,7 +2124,7 @@ mod tests { " > a", " > b", " > C", - " [PROCESSING: 'bdir1/dir2/the-new-filename'] <== selected", + " [PROCESSING: '/bdir1/dir2/the-new-filename'] <== selected", " .dockerignore", "v root2", " > d", From 787412b545cd6e9e4cb0f40f5d33d3b9a4480a22 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Thu, 29 Jun 2023 17:49:42 -0700 Subject: [PATCH 009/104] fmt and update dependency --- crates/collab/Cargo.toml | 2 +- crates/project/Cargo.toml | 2 +- crates/project/src/worktree_tests.rs | 15 ++++++++------- crates/project_panel/src/project_panel.rs | 3 --- crates/settings/Cargo.toml | 2 +- 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index 0c752a2047..c787287a0c 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -67,7 +67,7 @@ fs = { path = "../fs", features = ["test-support"] } git = { path = "../git", features = ["test-support"] } live_kit_client = { path = "../live_kit_client", features = ["test-support"] } lsp = { path = "../lsp", features = ["test-support"] } -pretty_assertions = "*" +pretty_assertions.workspace = true project = { path = "../project", features = ["test-support"] } rpc = { path = "../rpc", features = ["test-support"] } settings = { path = "../settings", features = ["test-support"] } diff --git a/crates/project/Cargo.toml b/crates/project/Cargo.toml index dbc0c617f2..bfe5f89f68 100644 --- a/crates/project/Cargo.toml +++ b/crates/project/Cargo.toml @@ -64,7 +64,7 @@ itertools = "0.10" [dev-dependencies] ctor.workspace = true env_logger.workspace = true -pretty_assertions = "*" +pretty_assertions.workspace = true client = { path = "../client", features = ["test-support"] } collections = { path = "../collections", features = ["test-support"] } db = { path = "../db", features = ["test-support"] } diff --git a/crates/project/src/worktree_tests.rs b/crates/project/src/worktree_tests.rs index efc5f42369..63f1f28eea 100644 --- a/crates/project/src/worktree_tests.rs +++ b/crates/project/src/worktree_tests.rs @@ -941,13 +941,14 @@ async fn test_create_dir_all_on_create_entry(cx: &mut TestAppContext) { let client_fake = cx.read(|cx| Client::new(FakeHttpClient::with_404_response(), cx)); let fs_fake = FakeFs::new(cx.background()); - fs_fake.insert_tree( - "/root", - json!({ - "a": {}, - }), - ) - .await; + fs_fake + .insert_tree( + "/root", + json!({ + "a": {}, + }), + ) + .await; let tree_fake = Worktree::local( client_fake, diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index fe8c649420..c329ae4e51 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -981,7 +981,6 @@ impl ProjectPanel { } } - Some(()) } @@ -1159,7 +1158,6 @@ impl ProjectPanel { for entry in visible_worktree_entries[entry_range].iter() { let status = git_status_setting.then(|| entry.git_status).flatten(); - let mut details = EntryDetails { filename: entry .path @@ -2108,7 +2106,6 @@ mod tests { ] ); - let confirm = panel.update(cx, |panel, cx| { panel.filename_editor.update(cx, |editor, cx| { editor.set_text("/bdir1/dir2/the-new-filename", cx) diff --git a/crates/settings/Cargo.toml b/crates/settings/Cargo.toml index 6c1ded805b..06b81a0c61 100644 --- a/crates/settings/Cargo.toml +++ b/crates/settings/Cargo.toml @@ -38,5 +38,5 @@ tree-sitter-json = "*" gpui = { path = "../gpui", features = ["test-support"] } fs = { path = "../fs", features = ["test-support"] } indoc.workspace = true -pretty_assertions = "*" +pretty_assertions.workspace = true unindent.workspace = true From a6dabf7acfef0f235bdd41d81daf8433b1955f59 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Thu, 29 Jun 2023 18:15:40 -0700 Subject: [PATCH 010/104] Make path updates minimal --- crates/project/src/worktree.rs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index a0497fa677..2b166bf6ef 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -981,6 +981,19 @@ impl LocalWorktree { }) } + /// Find the lowest path in the worktree's datastructures that is an ancestor + pub fn lowest_ancestor(&self, path: &Path) -> PathBuf { + let mut lowest_ancestor = None; + for path in path.ancestors() { + if self.entry_for_path(path).is_some() { + lowest_ancestor = Some(path.to_path_buf()); + break; + } + } + + lowest_ancestor.unwrap_or_else(|| PathBuf::from("")) + } + pub fn create_entry( &self, path: impl Into>, @@ -988,6 +1001,7 @@ impl LocalWorktree { cx: &mut ModelContext, ) -> Task> { let path = path.into(); + let lowest_ancestor = self.lowest_ancestor(&path); let abs_path = self.absolutize(&path); let fs = self.fs.clone(); let write = cx.background().spawn(async move { @@ -1003,9 +1017,14 @@ impl LocalWorktree { write.await?; let (result, refreshes) = this.update(&mut cx, |this, cx| { let mut refreshes = Vec::new(); - for path in path.ancestors().skip(1) { + let refresh_paths = path.strip_prefix(&lowest_ancestor).unwrap(); + for refresh_path in refresh_paths.ancestors() { + let refresh_full_path = lowest_ancestor.join(refresh_path); + if refresh_full_path.as_path() == path.deref() { + continue; + } refreshes.push(this.as_local_mut().unwrap().refresh_entry( - path.into(), + refresh_full_path.into(), None, cx, )); From a9a51ab3addfda7c97a96d3194099077d13fc7a1 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Thu, 29 Jun 2023 18:21:35 -0700 Subject: [PATCH 011/104] Added more tests and minimal file updates --- crates/project/src/worktree_tests.rs | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/crates/project/src/worktree_tests.rs b/crates/project/src/worktree_tests.rs index 63f1f28eea..8f130f648a 100644 --- a/crates/project/src/worktree_tests.rs +++ b/crates/project/src/worktree_tests.rs @@ -1012,6 +1012,41 @@ async fn test_create_dir_all_on_create_entry(cx: &mut TestAppContext) { assert!(tree.entry_for_path("a/b/c/").unwrap().is_dir()); assert!(tree.entry_for_path("a/b/").unwrap().is_dir()); }); + + // Test smallest change + let entry = tree_real + .update(cx, |tree, cx| { + tree.as_local_mut() + .unwrap() + .create_entry("a/b/c/e.txt".as_ref(), false, cx) + }) + .await + .unwrap(); + assert!(entry.is_file()); + + cx.foreground().run_until_parked(); + tree_real.read_with(cx, |tree, _| { + assert!(tree.entry_for_path("a/b/c/e.txt").unwrap().is_file()); + }); + + // Test largest change + let entry = tree_real + .update(cx, |tree, cx| { + tree.as_local_mut() + .unwrap() + .create_entry("d/e/f/g.txt".as_ref(), false, cx) + }) + .await + .unwrap(); + assert!(entry.is_file()); + + cx.foreground().run_until_parked(); + tree_real.read_with(cx, |tree, _| { + assert!(tree.entry_for_path("d/e/f/g.txt").unwrap().is_file()); + assert!(tree.entry_for_path("d/e/f").unwrap().is_dir()); + assert!(tree.entry_for_path("d/e/").unwrap().is_dir()); + assert!(tree.entry_for_path("d/").unwrap().is_dir()); + }); } #[gpui::test(iterations = 100)] From 9ee2707d43c877e8f2f9f7efa7b0d26e90d48833 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Thu, 29 Jun 2023 22:45:54 -0600 Subject: [PATCH 012/104] vim: Add }/{ for start/end of paragraph Fixes: zed-industries/community#470 --- assets/keymaps/vim.json | 2 + crates/editor/src/editor.rs | 14 ++-- crates/editor/src/movement.rs | 24 +++++-- crates/vim/src/motion.rs | 118 +++++++++++++++++++++++++++++++++- 4 files changed, 149 insertions(+), 9 deletions(-) diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json index afee6fcd2e..e4c489c5b5 100644 --- a/assets/keymaps/vim.json +++ b/assets/keymaps/vim.json @@ -37,6 +37,8 @@ "$": "vim::EndOfLine", "shift-g": "vim::EndOfDocument", "w": "vim::NextWordStart", + "{": "vim::StartOfParagraph", + "}": "vim::EndOfParagraph", "shift-w": [ "vim::NextWordStart", { diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 64332c102a..824802630d 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -5120,7 +5120,7 @@ impl Editor { self.change_selections(Some(Autoscroll::fit()), cx, |s| { s.move_with(|map, selection| { selection.collapse_to( - movement::start_of_paragraph(map, selection.head()), + movement::start_of_paragraph(map, selection.head(), 1), SelectionGoal::None, ) }); @@ -5140,7 +5140,7 @@ impl Editor { self.change_selections(Some(Autoscroll::fit()), cx, |s| { s.move_with(|map, selection| { selection.collapse_to( - movement::end_of_paragraph(map, selection.head()), + movement::end_of_paragraph(map, selection.head(), 1), SelectionGoal::None, ) }); @@ -5159,7 +5159,10 @@ impl Editor { self.change_selections(Some(Autoscroll::fit()), cx, |s| { s.move_heads_with(|map, head, _| { - (movement::start_of_paragraph(map, head), SelectionGoal::None) + ( + movement::start_of_paragraph(map, head, 1), + SelectionGoal::None, + ) }); }) } @@ -5176,7 +5179,10 @@ impl Editor { self.change_selections(Some(Autoscroll::fit()), cx, |s| { s.move_heads_with(|map, head, _| { - (movement::end_of_paragraph(map, head), SelectionGoal::None) + ( + movement::end_of_paragraph(map, head, 1), + SelectionGoal::None, + ) }); }) } diff --git a/crates/editor/src/movement.rs b/crates/editor/src/movement.rs index 523a0af964..8f1e6172e9 100644 --- a/crates/editor/src/movement.rs +++ b/crates/editor/src/movement.rs @@ -193,7 +193,11 @@ pub fn next_subword_end(map: &DisplaySnapshot, point: DisplayPoint) -> DisplayPo }) } -pub fn start_of_paragraph(map: &DisplaySnapshot, display_point: DisplayPoint) -> DisplayPoint { +pub fn start_of_paragraph( + map: &DisplaySnapshot, + display_point: DisplayPoint, + mut count: usize, +) -> DisplayPoint { let point = display_point.to_point(map); if point.row == 0 { return map.max_point(); @@ -203,7 +207,11 @@ pub fn start_of_paragraph(map: &DisplaySnapshot, display_point: DisplayPoint) -> for row in (0..point.row + 1).rev() { let blank = map.buffer_snapshot.is_line_blank(row); if found_non_blank_line && blank { - return Point::new(row, 0).to_display_point(map); + if count <= 1 { + return Point::new(row, 0).to_display_point(map); + } + count -= 1; + found_non_blank_line = false; } found_non_blank_line |= !blank; @@ -212,7 +220,11 @@ pub fn start_of_paragraph(map: &DisplaySnapshot, display_point: DisplayPoint) -> DisplayPoint::zero() } -pub fn end_of_paragraph(map: &DisplaySnapshot, display_point: DisplayPoint) -> DisplayPoint { +pub fn end_of_paragraph( + map: &DisplaySnapshot, + display_point: DisplayPoint, + mut count: usize, +) -> DisplayPoint { let point = display_point.to_point(map); if point.row == map.max_buffer_row() { return DisplayPoint::zero(); @@ -222,7 +234,11 @@ pub fn end_of_paragraph(map: &DisplaySnapshot, display_point: DisplayPoint) -> D for row in point.row..map.max_buffer_row() + 1 { let blank = map.buffer_snapshot.is_line_blank(row); if found_non_blank_line && blank { - return Point::new(row, 0).to_display_point(map); + if count <= 1 { + return Point::new(row, 0).to_display_point(map); + } + count -= 1; + found_non_blank_line = false; } found_non_blank_line |= !blank; diff --git a/crates/vim/src/motion.rs b/crates/vim/src/motion.rs index faf69d9473..f39cd82fc1 100644 --- a/crates/vim/src/motion.rs +++ b/crates/vim/src/motion.rs @@ -31,6 +31,8 @@ pub enum Motion { CurrentLine, StartOfLine, EndOfLine, + StartOfParagraph, + EndOfParagraph, StartOfDocument, EndOfDocument, Matching, @@ -72,6 +74,8 @@ actions!( StartOfLine, EndOfLine, CurrentLine, + StartOfParagraph, + EndOfParagraph, StartOfDocument, EndOfDocument, Matching, @@ -92,6 +96,12 @@ pub fn init(cx: &mut AppContext) { cx.add_action(|_: &mut Workspace, _: &StartOfLine, cx: _| motion(Motion::StartOfLine, cx)); cx.add_action(|_: &mut Workspace, _: &EndOfLine, cx: _| motion(Motion::EndOfLine, cx)); cx.add_action(|_: &mut Workspace, _: &CurrentLine, cx: _| motion(Motion::CurrentLine, cx)); + cx.add_action(|_: &mut Workspace, _: &StartOfParagraph, cx: _| { + motion(Motion::StartOfParagraph, cx) + }); + cx.add_action(|_: &mut Workspace, _: &EndOfParagraph, cx: _| { + motion(Motion::EndOfParagraph, cx) + }); cx.add_action(|_: &mut Workspace, _: &StartOfDocument, cx: _| { motion(Motion::StartOfDocument, cx) }); @@ -142,7 +152,8 @@ impl Motion { pub fn linewise(&self) -> bool { use Motion::*; match self { - Down | Up | StartOfDocument | EndOfDocument | CurrentLine | NextLineStart => true, + Down | Up | StartOfDocument | EndOfDocument | CurrentLine | NextLineStart + | StartOfParagraph | EndOfParagraph => true, EndOfLine | NextWordEnd { .. } | Matching @@ -172,6 +183,8 @@ impl Motion { | Backspace | Right | StartOfLine + | StartOfParagraph + | EndOfParagraph | NextWordStart { .. } | PreviousWordStart { .. } | FirstNonWhitespace @@ -197,6 +210,8 @@ impl Motion { | Backspace | Right | StartOfLine + | StartOfParagraph + | EndOfParagraph | NextWordStart { .. } | PreviousWordStart { .. } | FirstNonWhitespace @@ -235,6 +250,14 @@ impl Motion { FirstNonWhitespace => (first_non_whitespace(map, point), SelectionGoal::None), StartOfLine => (start_of_line(map, point), SelectionGoal::None), EndOfLine => (end_of_line(map, point), SelectionGoal::None), + StartOfParagraph => ( + movement::start_of_paragraph(map, point, times), + SelectionGoal::None, + ), + EndOfParagraph => ( + movement::end_of_paragraph(map, point, times), + SelectionGoal::None, + ), CurrentLine => (end_of_line(map, point), SelectionGoal::None), StartOfDocument => (start_of_document(map, point, times), SelectionGoal::None), EndOfDocument => ( @@ -590,3 +613,96 @@ fn next_line_start(map: &DisplaySnapshot, point: DisplayPoint, times: usize) -> let new_row = (point.row() + times as u32).min(map.max_buffer_row()); map.clip_point(DisplayPoint::new(new_row, 0), Bias::Left) } + +#[cfg(test)] + +mod test { + + use crate::{state::Mode, test::VimTestContext}; + use indoc::indoc; + + #[gpui::test] + async fn test_start_end_of_paragraph(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + + let initial_state = indoc! {r"ˇabc + def + + paragraph + the second + + + + third and + final"}; + + // goes down once + cx.set_state(initial_state, Mode::Normal); + cx.simulate_keystrokes(["}"]); + cx.assert_state( + indoc! {r"abc + def + ˇ + paragraph + the second + + + + third and + final"}, + Mode::Normal, + ); + + // goes up once + cx.simulate_keystrokes(["{"]); + cx.assert_state(initial_state, Mode::Normal); + + // goes down twice + cx.simulate_keystrokes(["2", "}"]); + cx.assert_state( + indoc! {r"abc + def + + paragraph + the second + ˇ + + + third and + final"}, + Mode::Normal, + ); + + // goes down over multiple blanks + cx.simulate_keystrokes(["}"]); + cx.assert_state( + indoc! {r"abc + def + + paragraph + the second + + + + third and + finalˇ"}, + Mode::Normal, + ); + + // goes up twice + cx.simulate_keystrokes(["2", "{"]); + cx.assert_state( + indoc! {r"abc + def + ˇ + paragraph + the second + + + + third and + final"}, + Mode::Normal, + ) + } +} From abb58c41dbc8b31c02873ba294daf7530ff51e5e Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Thu, 29 Jun 2023 23:24:51 -0600 Subject: [PATCH 013/104] vim: Fix edge-case in } when trailing newline is absent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added .assert_shared_state() to NeovimBackedTestContext – although it's not strictly necessary to show the expected behaviour in the test file (as we can just compare to neovim's JSON recording), it makes it much easier to understand what we're testing. --- crates/editor/src/test/editor_test_context.rs | 26 ++++++---- crates/vim/src/motion.rs | 52 ++++++++----------- .../src/test/neovim_backed_test_context.rs | 51 ++++++++++++++---- .../test_start_end_of_paragraph.json | 13 +++++ 4 files changed, 94 insertions(+), 48 deletions(-) create mode 100644 crates/vim/test_data/test_start_end_of_paragraph.json diff --git a/crates/editor/src/test/editor_test_context.rs b/crates/editor/src/test/editor_test_context.rs index 95da7ff297..bac70f139a 100644 --- a/crates/editor/src/test/editor_test_context.rs +++ b/crates/editor/src/test/editor_test_context.rs @@ -210,6 +210,10 @@ impl<'a> EditorTestContext<'a> { self.assert_selections(expected_selections, marked_text.to_string()) } + pub fn editor_state(&mut self) -> String { + generate_marked_text(self.buffer_text().as_str(), &self.editor_selections(), true) + } + #[track_caller] pub fn assert_editor_background_highlights(&mut self, marked_text: &str) { let expected_ranges = self.ranges(marked_text); @@ -248,14 +252,8 @@ impl<'a> EditorTestContext<'a> { self.assert_selections(expected_selections, expected_marked_text) } - #[track_caller] - fn assert_selections( - &mut self, - expected_selections: Vec>, - expected_marked_text: String, - ) { - let actual_selections = self - .editor + fn editor_selections(&self) -> Vec> { + self.editor .read_with(self.cx, |editor, cx| editor.selections.all::(cx)) .into_iter() .map(|s| { @@ -265,12 +263,22 @@ impl<'a> EditorTestContext<'a> { s.start..s.end } }) - .collect::>(); + .collect::>() + } + + #[track_caller] + fn assert_selections( + &mut self, + expected_selections: Vec>, + expected_marked_text: String, + ) { + let actual_selections = self.editor_selections(); let actual_marked_text = generate_marked_text(&self.buffer_text(), &actual_selections, true); if expected_selections != actual_selections { panic!( indoc! {" + {}Editor has unexpected selections. Expected selections: diff --git a/crates/vim/src/motion.rs b/crates/vim/src/motion.rs index f39cd82fc1..e8084cb4be 100644 --- a/crates/vim/src/motion.rs +++ b/crates/vim/src/motion.rs @@ -255,7 +255,7 @@ impl Motion { SelectionGoal::None, ), EndOfParagraph => ( - movement::end_of_paragraph(map, point, times), + map.clip_at_line_end(movement::end_of_paragraph(map, point, times)), SelectionGoal::None, ), CurrentLine => (end_of_line(map, point), SelectionGoal::None), @@ -618,12 +618,12 @@ fn next_line_start(map: &DisplaySnapshot, point: DisplayPoint, times: usize) -> mod test { - use crate::{state::Mode, test::VimTestContext}; + use crate::test::NeovimBackedTestContext; use indoc::indoc; #[gpui::test] async fn test_start_end_of_paragraph(cx: &mut gpui::TestAppContext) { - let mut cx = VimTestContext::new(cx, true).await; + let mut cx = NeovimBackedTestContext::new(cx).await; let initial_state = indoc! {r"ˇabc def @@ -637,10 +637,9 @@ mod test { final"}; // goes down once - cx.set_state(initial_state, Mode::Normal); - cx.simulate_keystrokes(["}"]); - cx.assert_state( - indoc! {r"abc + cx.set_shared_state(initial_state).await; + cx.simulate_shared_keystrokes(["}"]).await; + cx.assert_shared_state(indoc! {r"abc def ˇ paragraph @@ -649,18 +648,16 @@ mod test { third and - final"}, - Mode::Normal, - ); + final"}) + .await; // goes up once - cx.simulate_keystrokes(["{"]); - cx.assert_state(initial_state, Mode::Normal); + cx.simulate_shared_keystrokes(["{"]).await; + cx.assert_shared_state(initial_state).await; // goes down twice - cx.simulate_keystrokes(["2", "}"]); - cx.assert_state( - indoc! {r"abc + cx.simulate_shared_keystrokes(["2", "}"]).await; + cx.assert_shared_state(indoc! {r"abc def paragraph @@ -669,14 +666,12 @@ mod test { third and - final"}, - Mode::Normal, - ); + final"}) + .await; // goes down over multiple blanks - cx.simulate_keystrokes(["}"]); - cx.assert_state( - indoc! {r"abc + cx.simulate_shared_keystrokes(["}"]).await; + cx.assert_shared_state(indoc! {r"abc def paragraph @@ -685,14 +680,12 @@ mod test { third and - finalˇ"}, - Mode::Normal, - ); + finaˇl"}) + .await; // goes up twice - cx.simulate_keystrokes(["2", "{"]); - cx.assert_state( - indoc! {r"abc + cx.simulate_shared_keystrokes(["2", "{"]).await; + cx.assert_shared_state(indoc! {r"abc def ˇ paragraph @@ -701,8 +694,7 @@ mod test { third and - final"}, - Mode::Normal, - ) + final"}) + .await } } diff --git a/crates/vim/src/test/neovim_backed_test_context.rs b/crates/vim/src/test/neovim_backed_test_context.rs index 9b6bf976ca..7f9a84b666 100644 --- a/crates/vim/src/test/neovim_backed_test_context.rs +++ b/crates/vim/src/test/neovim_backed_test_context.rs @@ -1,9 +1,10 @@ -use std::ops::{Deref, DerefMut}; +use indoc::indoc; +use std::ops::{Deref, DerefMut, Range}; use collections::{HashMap, HashSet}; use gpui::ContextHandle; use language::OffsetRangeExt; -use util::test::marked_text_offsets; +use util::test::{generate_marked_text, marked_text_offsets}; use super::{neovim_connection::NeovimConnection, NeovimBackedBindingTestContext, VimTestContext}; use crate::state::Mode; @@ -112,6 +113,43 @@ impl<'a> NeovimBackedTestContext<'a> { context_handle } + pub async fn assert_shared_state(&mut self, marked_text: &str) { + let neovim = self.neovim_state().await; + if neovim != marked_text { + panic!( + indoc! {"Test is incorrect (currently expected != neovim state) + + # currently expected: + {} + # neovim state: + {} + # zed state: + {}"}, + marked_text, + neovim, + self.editor_state(), + ) + } + self.assert_editor_state(marked_text) + } + + pub async fn neovim_state(&mut self) -> String { + generate_marked_text( + self.neovim.text().await.as_str(), + &vec![self.neovim_selection().await], + true, + ) + } + + async fn neovim_selection(&mut self) -> Range { + let mut neovim_selection = self.neovim.selection().await; + // Zed selections adjust themselves to make the end point visually make sense + if neovim_selection.start > neovim_selection.end { + neovim_selection.start.column += 1; + } + neovim_selection.to_offset(&self.buffer_snapshot()) + } + pub async fn assert_state_matches(&mut self) { assert_eq!( self.neovim.text().await, @@ -120,13 +158,8 @@ impl<'a> NeovimBackedTestContext<'a> { self.assertion_context() ); - let mut neovim_selection = self.neovim.selection().await; - // Zed selections adjust themselves to make the end point visually make sense - if neovim_selection.start > neovim_selection.end { - neovim_selection.start.column += 1; - } - let neovim_selection = neovim_selection.to_offset(&self.buffer_snapshot()); - self.assert_editor_selections(vec![neovim_selection]); + let selections = vec![self.neovim_selection().await]; + self.assert_editor_selections(selections); if let Some(neovim_mode) = self.neovim.mode().await { assert_eq!(neovim_mode, self.mode(), "{}", self.assertion_context(),); diff --git a/crates/vim/test_data/test_start_end_of_paragraph.json b/crates/vim/test_data/test_start_end_of_paragraph.json new file mode 100644 index 0000000000..0de4d84f50 --- /dev/null +++ b/crates/vim/test_data/test_start_end_of_paragraph.json @@ -0,0 +1,13 @@ +{"Put":{"state":"ˇabc\ndef\n\nparagraph\nthe second\n\n\n\nthird and\nfinal"}} +{"Key":"}"} +{"Get":{"state":"abc\ndef\nˇ\nparagraph\nthe second\n\n\n\nthird and\nfinal","mode":"Normal"}} +{"Key":"{"} +{"Get":{"state":"ˇabc\ndef\n\nparagraph\nthe second\n\n\n\nthird and\nfinal","mode":"Normal"}} +{"Key":"2"} +{"Key":"}"} +{"Get":{"state":"abc\ndef\n\nparagraph\nthe second\nˇ\n\n\nthird and\nfinal","mode":"Normal"}} +{"Key":"}"} +{"Get":{"state":"abc\ndef\n\nparagraph\nthe second\n\n\n\nthird and\nfinaˇl","mode":"Normal"}} +{"Key":"2"} +{"Key":"{"} +{"Get":{"state":"abc\ndef\nˇ\nparagraph\nthe second\n\n\n\nthird and\nfinal","mode":"Normal"}} From d22a576f5e05f0a3b1a83e67b40489f9068c4e74 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Thu, 29 Jun 2023 23:50:24 -0700 Subject: [PATCH 014/104] fix failing test --- crates/project/src/worktree.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 2b166bf6ef..7596b0fcb7 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -1016,13 +1016,14 @@ impl LocalWorktree { cx.spawn(|this, mut cx| async move { write.await?; let (result, refreshes) = this.update(&mut cx, |this, cx| { - let mut refreshes = Vec::new(); + let mut refreshes = Vec::>>::new(); let refresh_paths = path.strip_prefix(&lowest_ancestor).unwrap(); for refresh_path in refresh_paths.ancestors() { - let refresh_full_path = lowest_ancestor.join(refresh_path); - if refresh_full_path.as_path() == path.deref() { + if refresh_path == Path::new("") { continue; } + let refresh_full_path = lowest_ancestor.join(refresh_path); + refreshes.push(this.as_local_mut().unwrap().refresh_entry( refresh_full_path.into(), None, From 3d6e063a6dcabe7644a10891417dc648793afa70 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Thu, 29 Jun 2023 23:53:57 -0700 Subject: [PATCH 015/104] Fix method header --- crates/project/src/worktree.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 7596b0fcb7..d86b98e0ec 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -982,7 +982,7 @@ impl LocalWorktree { } /// Find the lowest path in the worktree's datastructures that is an ancestor - pub fn lowest_ancestor(&self, path: &Path) -> PathBuf { + fn lowest_ancestor(&self, path: &Path) -> PathBuf { let mut lowest_ancestor = None; for path in path.ancestors() { if self.entry_for_path(path).is_some() { From d8d0bdc479ce926512697bc04a6c0a485b611ad4 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 27 Jun 2023 12:02:30 +0200 Subject: [PATCH 016/104] WIP: git menu --- crates/collab_ui/src/branch_list.rs | 178 +++++++++++++++++++ crates/collab_ui/src/collab_titlebar_item.rs | 123 ++++++++++--- crates/collab_ui/src/collab_ui.rs | 2 + crates/fs/src/repository.rs | 32 +++- 4 files changed, 311 insertions(+), 24 deletions(-) create mode 100644 crates/collab_ui/src/branch_list.rs diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs new file mode 100644 index 0000000000..8d755e8aa4 --- /dev/null +++ b/crates/collab_ui/src/branch_list.rs @@ -0,0 +1,178 @@ +use client::{ContactRequestStatus, User, UserStore}; +use fuzzy::{StringMatch, StringMatchCandidate}; +use gpui::{elements::*, AppContext, ModelHandle, MouseState, Task, ViewContext}; +use picker::{Picker, PickerDelegate, PickerEvent}; +use project::Project; +use std::sync::Arc; +use util::{ResultExt, TryFutureExt}; + +pub fn init(cx: &mut AppContext) { + Picker::::init(cx); +} + +pub type BranchList = Picker; + +pub fn build_branch_list( + project: ModelHandle, + cx: &mut ViewContext, +) -> BranchList { + Picker::new( + BranchListDelegate { + branches: vec!["Foo".into(), "bar/baz".into()], + matches: vec![], + project, + selected_index: 0, + }, + cx, + ) + .with_theme(|theme| theme.picker.clone()) +} + +pub struct BranchListDelegate { + branches: Vec, + matches: Vec, + project: ModelHandle, + selected_index: usize, +} + +impl PickerDelegate for BranchListDelegate { + fn placeholder_text(&self) -> Arc { + "Select branch...".into() + } + + fn match_count(&self) -> usize { + self.matches.len() + } + + fn selected_index(&self) -> usize { + self.selected_index + } + + fn set_selected_index(&mut self, ix: usize, _: &mut ViewContext>) { + self.selected_index = ix; + } + + fn update_matches(&mut self, query: String, cx: &mut ViewContext>) -> Task<()> { + cx.spawn(move |picker, mut cx| async move { + let candidates = picker + .read_with(&mut cx, |view, cx| { + let delegate = view.delegate(); + let project = delegate.project.read(&cx); + let mut cwd = project + .visible_worktrees(cx) + .next() + .unwrap() + .read(cx) + .root_entry() + .unwrap() + .path + .to_path_buf(); + cwd.push(".git"); + let branches = project.fs().open_repo(&cwd).unwrap().lock().branches(); + branches + .unwrap() + .iter() + .cloned() + .enumerate() + .map(|(ix, command)| StringMatchCandidate { + id: ix, + string: command.clone(), + char_bag: command.chars().collect(), + }) + .collect::>() + }) + .unwrap(); + let matches = if query.is_empty() { + candidates + .into_iter() + .enumerate() + .map(|(index, candidate)| StringMatch { + candidate_id: index, + string: candidate.string, + positions: Vec::new(), + score: 0.0, + }) + .collect() + } else { + fuzzy::match_strings( + &candidates, + &query, + true, + 10000, + &Default::default(), + cx.background(), + ) + .await + }; + picker + .update(&mut cx, |picker, _| { + let delegate = picker.delegate_mut(); + //delegate.branches = actions; + delegate.matches = matches; + if delegate.matches.is_empty() { + delegate.selected_index = 0; + } else { + delegate.selected_index = + core::cmp::min(delegate.selected_index, delegate.matches.len() - 1); + } + }) + .log_err(); + }) + } + + fn confirm(&mut self, cx: &mut ViewContext>) { + log::error!("confirm {}", self.selected_index()); + let current_pick = self.selected_index(); + let current_pick = self.matches[current_pick].string.clone(); + log::error!("Hi? {current_pick}"); + let project = self.project.read(cx); + let mut cwd = project + .visible_worktrees(cx) + .next() + .unwrap() + .read(cx) + .root_entry() + .unwrap() + .path + .to_path_buf(); + cwd.push(".git"); + log::error!("{current_pick}"); + project + .fs() + .open_repo(&cwd) + .unwrap() + .lock() + .change_branch(¤t_pick) + .log_err(); + cx.emit(PickerEvent::Dismiss); + } + + fn dismissed(&mut self, cx: &mut ViewContext>) { + cx.emit(PickerEvent::Dismiss); + } + + fn render_match( + &self, + ix: usize, + mouse_state: &mut MouseState, + selected: bool, + cx: &gpui::AppContext, + ) -> AnyElement> { + let theme = &theme::current(cx); + let user = &self.matches[ix]; + let style = theme.picker.item.in_state(selected).style_for(mouse_state); + Flex::row() + .with_child( + Label::new(user.string.clone(), style.label.clone()) + .with_highlights(user.positions.clone()) + .contained() + .aligned() + .left(), + ) + .contained() + .with_style(style.container) + .constrained() + .with_height(theme.contact_finder.row_height) + .into_any() + } +} diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 5caebb9f0c..338ba6cf27 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -1,5 +1,8 @@ use crate::{ - contact_notification::ContactNotification, contacts_popover, face_pile::FacePile, + branch_list::{build_branch_list, BranchList}, + contact_notification::ContactNotification, + contacts_popover, + face_pile::FacePile, toggle_deafen, toggle_mute, toggle_screen_sharing, LeaveCall, ToggleDeafen, ToggleMute, ToggleScreenSharing, }; @@ -12,12 +15,14 @@ use gpui::{ actions, color::Color, elements::*, + fonts::TextStyle, geometry::{rect::RectF, vector::vec2f, PathBuilder}, json::{self, ToJson}, platform::{CursorStyle, MouseButton}, AppContext, Entity, ImageData, LayoutContext, ModelHandle, SceneBuilder, Subscription, View, ViewContext, ViewHandle, WeakViewHandle, }; +use picker::PickerEvent; use project::{Project, RepositoryEntry}; use std::{ops::Range, sync::Arc}; use theme::{AvatarStyle, Theme}; @@ -31,6 +36,8 @@ actions!( [ ToggleContactsMenu, ToggleUserMenu, + ToggleVcsMenu, + SwitchBranch, ShareProject, UnshareProject, ] @@ -41,6 +48,7 @@ pub fn init(cx: &mut AppContext) { cx.add_action(CollabTitlebarItem::share_project); cx.add_action(CollabTitlebarItem::unshare_project); cx.add_action(CollabTitlebarItem::toggle_user_menu); + cx.add_action(CollabTitlebarItem::toggle_vcs_menu); } pub struct CollabTitlebarItem { @@ -49,6 +57,7 @@ pub struct CollabTitlebarItem { client: Arc, workspace: WeakViewHandle, contacts_popover: Option>, + branch_popover: Option>, user_menu: ViewHandle, _subscriptions: Vec, } @@ -69,12 +78,11 @@ impl View for CollabTitlebarItem { return Empty::new().into_any(); }; - let project = self.project.read(cx); let theme = theme::current(cx).clone(); let mut left_container = Flex::row(); let mut right_container = Flex::row().align_children_center(); - left_container.add_child(self.collect_title_root_names(&project, theme.clone(), cx)); + left_container.add_child(self.collect_title_root_names(theme.clone(), cx)); let user = self.user_store.read(cx).current_user(); let peer_id = self.client.peer_id(); @@ -182,22 +190,28 @@ impl CollabTitlebarItem { menu.set_position_mode(OverlayPositionMode::Local); menu }), + branch_popover: None, _subscriptions: subscriptions, } } fn collect_title_root_names( &self, - project: &Project, theme: Arc, - cx: &ViewContext, + cx: &mut ViewContext, ) -> AnyElement { - let mut names_and_branches = project.visible_worktrees(cx).map(|worktree| { - let worktree = worktree.read(cx); - (worktree.root_name(), worktree.root_git_entry()) - }); + let project = self.project.read(cx); - let (name, entry) = names_and_branches.next().unwrap_or(("", None)); + let (name, entry) = { + let mut names_and_branches = project.visible_worktrees(cx).map(|worktree| { + let worktree = worktree.read(cx); + (worktree.root_name(), worktree.root_git_entry()) + }); + + names_and_branches.next().unwrap_or(("", None)) + }; + + let name = name.to_owned(); let branch_prepended = entry .as_ref() .and_then(RepositoryEntry::branch) @@ -212,22 +226,37 @@ impl CollabTitlebarItem { text: text_style, highlight_text: Some(highlight), }; + let highlights = (0..name.len()).into_iter().collect(); 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"), + Stack::new().with_child( + Label::new(name, style.clone()) + .with_highlights(highlights) + .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"), + Stack::new() + .with_child( + MouseEventHandler::::new(0, cx, |state, _| { + Label::new(git_branch, style) + .contained() + .with_margin_right(item_spacing) + .aligned() + .left() + .into_any_named("title-project-branch") + }) + .with_cursor_style(CursorStyle::PointingHand) + .on_click(MouseButton::Left, move |_, this, cx| { + this.toggle_vcs_menu(&Default::default(), cx) + }), + ) + .with_children( + self.render_branches_popover_host(&theme.workspace.titlebar, cx), + ), ) } ret.into_any() @@ -320,7 +349,55 @@ impl CollabTitlebarItem { user_menu.toggle(Default::default(), AnchorCorner::TopRight, items, cx); }); } + fn render_branches_popover_host<'a>( + &'a self, + _theme: &'a theme::Titlebar, + cx: &'a mut ViewContext, + ) -> Option> { + self.branch_popover.as_ref().map(|child| { + let theme = theme::current(cx).clone(); + let child = ChildView::new(child, cx); + let child = MouseEventHandler::::new(0, cx, |_, _| { + Flex::column() + .with_child(child.flex(1., true)) + .contained() + .with_style(theme.contacts_popover.container) + .constrained() + .with_width(theme.contacts_popover.width) + .with_height(theme.contacts_popover.height) + }) + .on_click(MouseButton::Left, |_, _, _| {}) + .on_down_out(MouseButton::Left, move |_, _, cx| cx.emit(())) + .into_any(); + Overlay::new(child) + .with_fit_mode(OverlayFitMode::SwitchAnchor) + .with_anchor_corner(AnchorCorner::TopLeft) + .with_z_index(999) + .aligned() + .bottom() + .left() + .into_any() + }) + } + pub fn toggle_vcs_menu(&mut self, _: &ToggleVcsMenu, cx: &mut ViewContext) { + if self.branch_popover.take().is_none() { + let view = cx.add_view(|cx| build_branch_list(self.project.clone(), cx)); + cx.subscribe(&view, |this, _, event, cx| { + match event { + PickerEvent::Dismiss => { + this.contacts_popover = None; + } + } + + cx.notify(); + }) + .detach(); + self.branch_popover = Some(view); + } + + cx.notify(); + } fn render_toggle_contacts_button( &self, theme: &Theme, @@ -733,7 +810,7 @@ impl CollabTitlebarItem { self.contacts_popover.as_ref().map(|popover| { Overlay::new(ChildView::new(popover, cx)) .with_fit_mode(OverlayFitMode::SwitchAnchor) - .with_anchor_corner(AnchorCorner::TopRight) + .with_anchor_corner(AnchorCorner::TopLeft) .with_z_index(999) .aligned() .bottom() diff --git a/crates/collab_ui/src/collab_ui.rs b/crates/collab_ui/src/collab_ui.rs index a809b9c7e6..26d9c70a43 100644 --- a/crates/collab_ui/src/collab_ui.rs +++ b/crates/collab_ui/src/collab_ui.rs @@ -1,3 +1,4 @@ +mod branch_list; mod collab_titlebar_item; mod contact_finder; mod contact_list; @@ -28,6 +29,7 @@ actions!( ); pub fn init(app_state: &Arc, cx: &mut AppContext) { + branch_list::init(cx); collab_titlebar_item::init(cx); contact_list::init(cx); contact_finder::init(cx); diff --git a/crates/fs/src/repository.rs b/crates/fs/src/repository.rs index 488262887f..af6198eda4 100644 --- a/crates/fs/src/repository.rs +++ b/crates/fs/src/repository.rs @@ -1,6 +1,6 @@ use anyhow::Result; use collections::HashMap; -use git2::ErrorCode; +use git2::{BranchType, ErrorCode}; use parking_lot::Mutex; use rpc::proto; use serde_derive::{Deserialize, Serialize}; @@ -27,6 +27,12 @@ pub trait GitRepository: Send { fn statuses(&self) -> Option>; fn status(&self, path: &RepoPath) -> Result>; + fn branches(&self) -> Result> { + Ok(vec![]) + } + fn change_branch(&self, _: &str) -> Result<()> { + Ok(()) + } } impl std::fmt::Debug for dyn GitRepository { @@ -106,6 +112,30 @@ impl GitRepository for LibGitRepository { } } } + fn branches(&self) -> Result> { + let local_branches = self.branches(Some(BranchType::Local))?; + let valid_branches = local_branches + .filter_map(|branch| { + branch + .ok() + .map(|(branch, _)| branch.name().ok().flatten().map(String::from)) + .flatten() + }) + .collect(); + Ok(valid_branches) + } + fn change_branch(&self, name: &str) -> Result<()> { + let revision = self.find_branch(name, BranchType::Local)?; + let revision = revision.get(); + let as_tree = revision.peel_to_tree()?; + self.checkout_tree(as_tree.as_object(), None)?; + self.set_head( + revision + .name() + .ok_or_else(|| anyhow::anyhow!("Branch name could not be retrieved"))?, + )?; + Ok(()) + } } fn read_status(status: git2::Status) -> Option { From ac6e9c88e9400da223e2d0996c11c40d58ee24cd Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 27 Jun 2023 12:22:44 +0200 Subject: [PATCH 017/104] Render header and footer of git menu --- crates/collab_ui/src/branch_list.rs | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 8d755e8aa4..d946b9da3d 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -22,6 +22,7 @@ pub fn build_branch_list( matches: vec![], project, selected_index: 0, + last_query: String::default(), }, cx, ) @@ -33,6 +34,7 @@ pub struct BranchListDelegate { matches: Vec, project: ModelHandle, selected_index: usize, + last_query: String, } impl PickerDelegate for BranchListDelegate { @@ -109,6 +111,7 @@ impl PickerDelegate for BranchListDelegate { let delegate = picker.delegate_mut(); //delegate.branches = actions; delegate.matches = matches; + delegate.last_query = query; if delegate.matches.is_empty() { delegate.selected_index = 0; } else { @@ -175,4 +178,34 @@ impl PickerDelegate for BranchListDelegate { .with_height(theme.contact_finder.row_height) .into_any() } + fn render_header(&self, cx: &AppContext) -> Option>> { + let theme = &theme::current(cx); + let style = theme.picker.no_matches.label.clone(); + if self.last_query.is_empty() { + Some( + Flex::row() + .with_child(Label::new("Recent branches", style)) + .into_any(), + ) + } else { + Some( + Flex::row() + .with_child(Label::new("Branches", style)) + .into_any(), + ) + } + } + fn render_footer(&self, cx: &AppContext) -> Option>> { + if !self.last_query.is_empty() && !self.matches.is_empty() { + let theme = &theme::current(cx); + let style = theme.picker.no_matches.label.clone(); + Some( + Flex::row() + .with_child(Label::new(format!("{} matches", self.matches.len()), style)) + .into_any(), + ) + } else { + None + } + } } From 6747acbb84e9787fa530ba015fd4f17a4f085877 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 27 Jun 2023 12:40:53 +0200 Subject: [PATCH 018/104] Trail off branch names --- crates/collab_ui/src/branch_list.rs | 25 +++++++++++++------- crates/collab_ui/src/collab_titlebar_item.rs | 1 - 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index d946b9da3d..ddd884523a 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -1,4 +1,3 @@ -use client::{ContactRequestStatus, User, UserStore}; use fuzzy::{StringMatch, StringMatchCandidate}; use gpui::{elements::*, AppContext, ModelHandle, MouseState, Task, ViewContext}; use picker::{Picker, PickerDelegate, PickerEvent}; @@ -124,10 +123,8 @@ impl PickerDelegate for BranchListDelegate { } fn confirm(&mut self, cx: &mut ViewContext>) { - log::error!("confirm {}", self.selected_index()); let current_pick = self.selected_index(); let current_pick = self.matches[current_pick].string.clone(); - log::error!("Hi? {current_pick}"); let project = self.project.read(cx); let mut cwd = project .visible_worktrees(cx) @@ -139,7 +136,6 @@ impl PickerDelegate for BranchListDelegate { .path .to_path_buf(); cwd.push(".git"); - log::error!("{current_pick}"); project .fs() .open_repo(&cwd) @@ -161,13 +157,21 @@ impl PickerDelegate for BranchListDelegate { selected: bool, cx: &gpui::AppContext, ) -> AnyElement> { + const DISPLAYED_MATCH_LEN: usize = 29; let theme = &theme::current(cx); - let user = &self.matches[ix]; + let hit = &self.matches[ix]; + let shortened_branch_name = util::truncate_and_trailoff(&hit.string, DISPLAYED_MATCH_LEN); + let highlights = hit + .positions + .iter() + .copied() + .filter(|index| index < &DISPLAYED_MATCH_LEN) + .collect(); let style = theme.picker.item.in_state(selected).style_for(mouse_state); Flex::row() .with_child( - Label::new(user.string.clone(), style.label.clone()) - .with_highlights(user.positions.clone()) + Label::new(shortened_branch_name.clone(), style.label.clone()) + .with_highlights(highlights) .contained() .aligned() .left(), @@ -199,9 +203,14 @@ impl PickerDelegate for BranchListDelegate { if !self.last_query.is_empty() && !self.matches.is_empty() { let theme = &theme::current(cx); let style = theme.picker.no_matches.label.clone(); + // Render "1 match" and "0 matches", "42 matches"etc. + let suffix = if self.matches.len() == 1 { "" } else { "es" }; Some( Flex::row() - .with_child(Label::new(format!("{} matches", self.matches.len()), style)) + .with_child(Label::new( + format!("{} match{}", self.matches.len(), suffix), + style, + )) .into_any(), ) } else { diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 338ba6cf27..e306aa20b3 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -361,7 +361,6 @@ impl CollabTitlebarItem { Flex::column() .with_child(child.flex(1., true)) .contained() - .with_style(theme.contacts_popover.container) .constrained() .with_width(theme.contacts_popover.width) .with_height(theme.contacts_popover.height) From 3027e4729abf2d9c83fe0d06683fa9834a4180f4 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 27 Jun 2023 13:28:50 +0200 Subject: [PATCH 019/104] Add timestamps to branches --- Cargo.lock | 1 + crates/collab_ui/src/branch_list.rs | 6 ++---- crates/fs/Cargo.toml | 1 + crates/fs/src/repository.rs | 21 +++++++++++++++------ 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a9b2e29ea0..a59332520b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2549,6 +2549,7 @@ dependencies = [ "smol", "sum_tree", "tempfile", + "time 0.3.21", "util", ] diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index ddd884523a..7da984a599 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -17,7 +17,6 @@ pub fn build_branch_list( ) -> BranchList { Picker::new( BranchListDelegate { - branches: vec!["Foo".into(), "bar/baz".into()], matches: vec![], project, selected_index: 0, @@ -29,7 +28,6 @@ pub fn build_branch_list( } pub struct BranchListDelegate { - branches: Vec, matches: Vec, project: ModelHandle, selected_index: usize, @@ -77,8 +75,8 @@ impl PickerDelegate for BranchListDelegate { .enumerate() .map(|(ix, command)| StringMatchCandidate { id: ix, - string: command.clone(), - char_bag: command.chars().collect(), + char_bag: command.name.chars().collect(), + string: command.name.into(), }) .collect::>() }) diff --git a/crates/fs/Cargo.toml b/crates/fs/Cargo.toml index cb738f567c..b3ebd224b0 100644 --- a/crates/fs/Cargo.toml +++ b/crates/fs/Cargo.toml @@ -31,6 +31,7 @@ serde_derive.workspace = true serde_json.workspace = true log.workspace = true libc = "0.2" +time.workspace = true [dev-dependencies] gpui = { path = "../gpui", features = ["test-support"] } diff --git a/crates/fs/src/repository.rs b/crates/fs/src/repository.rs index af6198eda4..36df0dfb98 100644 --- a/crates/fs/src/repository.rs +++ b/crates/fs/src/repository.rs @@ -16,6 +16,12 @@ use util::ResultExt; pub use git2::Repository as LibGitRepository; +#[derive(Clone, Debug, Hash, PartialEq)] +pub struct Branch { + pub name: Box, + /// Timestamp of most recent commit, normalized to Unix Epoch format. + pub unix_timestamp: Option, +} #[async_trait::async_trait] pub trait GitRepository: Send { fn reload_index(&self); @@ -27,7 +33,7 @@ pub trait GitRepository: Send { fn statuses(&self) -> Option>; fn status(&self, path: &RepoPath) -> Result>; - fn branches(&self) -> Result> { + fn branches(&self) -> Result> { Ok(vec![]) } fn change_branch(&self, _: &str) -> Result<()> { @@ -112,14 +118,17 @@ impl GitRepository for LibGitRepository { } } } - fn branches(&self) -> Result> { + fn branches(&self) -> Result> { let local_branches = self.branches(Some(BranchType::Local))?; let valid_branches = local_branches .filter_map(|branch| { - branch - .ok() - .map(|(branch, _)| branch.name().ok().flatten().map(String::from)) - .flatten() + branch.ok().and_then(|(branch, _)| { + let name = branch.name().ok().flatten().map(Box::from)?; + Some(Branch { + name, + unix_timestamp: None, + }) + }) }) .collect(); Ok(valid_branches) From 54fad5969f5f0aa649cccb27493e48d7cf99f5b3 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 27 Jun 2023 14:20:36 +0200 Subject: [PATCH 020/104] List recent branches --- crates/collab_ui/src/branch_list.rs | 23 ++++++++++++++++++----- crates/fs/src/repository.rs | 9 ++++++++- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 7da984a599..146e4c8041 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -2,7 +2,7 @@ use fuzzy::{StringMatch, StringMatchCandidate}; use gpui::{elements::*, AppContext, ModelHandle, MouseState, Task, ViewContext}; use picker::{Picker, PickerDelegate, PickerEvent}; use project::Project; -use std::sync::Arc; +use std::{cmp::Ordering, sync::Arc}; use util::{ResultExt, TryFutureExt}; pub fn init(cx: &mut AppContext) { @@ -67,9 +67,23 @@ impl PickerDelegate for BranchListDelegate { .path .to_path_buf(); cwd.push(".git"); - let branches = project.fs().open_repo(&cwd).unwrap().lock().branches(); - branches + let mut branches = project + .fs() + .open_repo(&cwd) .unwrap() + .lock() + .branches() + .unwrap(); + if query.is_empty() { + const RECENT_BRANCHES_COUNT: usize = 10; + // Do a partial sort to show recent-ish branches first. + branches.select_nth_unstable_by(RECENT_BRANCHES_COUNT, |lhs, rhs| { + rhs.unix_timestamp.cmp(&lhs.unix_timestamp) + }); + branches.truncate(RECENT_BRANCHES_COUNT); + branches.sort_unstable_by(|lhs, rhs| lhs.name.cmp(&rhs.name)); + } + branches .iter() .cloned() .enumerate() @@ -106,15 +120,14 @@ impl PickerDelegate for BranchListDelegate { picker .update(&mut cx, |picker, _| { let delegate = picker.delegate_mut(); - //delegate.branches = actions; delegate.matches = matches; - delegate.last_query = query; if delegate.matches.is_empty() { delegate.selected_index = 0; } else { delegate.selected_index = core::cmp::min(delegate.selected_index, delegate.matches.len() - 1); } + delegate.last_query = query; }) .log_err(); }) diff --git a/crates/fs/src/repository.rs b/crates/fs/src/repository.rs index 36df0dfb98..0e5fd8343f 100644 --- a/crates/fs/src/repository.rs +++ b/crates/fs/src/repository.rs @@ -124,9 +124,16 @@ impl GitRepository for LibGitRepository { .filter_map(|branch| { branch.ok().and_then(|(branch, _)| { let name = branch.name().ok().flatten().map(Box::from)?; + let timestamp = branch.get().peel_to_commit().ok()?.time(); + let unix_timestamp = timestamp.seconds(); + let timezone_offset = timestamp.offset_minutes(); + let utc_offset = + time::UtcOffset::from_whole_seconds(timezone_offset * 60).ok()?; + let unix_timestamp = + time::OffsetDateTime::from_unix_timestamp(unix_timestamp).ok()?; Some(Branch { name, - unix_timestamp: None, + unix_timestamp: Some(unix_timestamp.to_offset(utc_offset).unix_timestamp()), }) }) }) From c84f3b3bfc2a2434017ab23e3bcaeae98424623f Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 27 Jun 2023 20:12:20 +0200 Subject: [PATCH 021/104] Add toast for git checkout failure --- crates/collab_ui/src/branch_list.rs | 31 ++++++++++++++------ crates/collab_ui/src/collab_titlebar_item.rs | 22 +++++++------- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 146e4c8041..2558b24ae8 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -1,9 +1,10 @@ use fuzzy::{StringMatch, StringMatchCandidate}; -use gpui::{elements::*, AppContext, ModelHandle, MouseState, Task, ViewContext}; +use gpui::{elements::*, AppContext, ModelHandle, MouseState, Task, ViewContext, ViewHandle}; use picker::{Picker, PickerDelegate, PickerEvent}; use project::Project; use std::{cmp::Ordering, sync::Arc}; use util::{ResultExt, TryFutureExt}; +use workspace::{Toast, Workspace}; pub fn init(cx: &mut AppContext) { Picker::::init(cx); @@ -12,13 +13,13 @@ pub fn init(cx: &mut AppContext) { pub type BranchList = Picker; pub fn build_branch_list( - project: ModelHandle, + workspace: ViewHandle, cx: &mut ViewContext, ) -> BranchList { Picker::new( BranchListDelegate { matches: vec![], - project, + workspace, selected_index: 0, last_query: String::default(), }, @@ -29,7 +30,7 @@ pub fn build_branch_list( pub struct BranchListDelegate { matches: Vec, - project: ModelHandle, + workspace: ViewHandle, selected_index: usize, last_query: String, } @@ -56,7 +57,7 @@ impl PickerDelegate for BranchListDelegate { let candidates = picker .read_with(&mut cx, |view, cx| { let delegate = view.delegate(); - let project = delegate.project.read(&cx); + let project = delegate.workspace.read(cx).project().read(&cx); let mut cwd = project .visible_worktrees(cx) .next() @@ -136,7 +137,7 @@ impl PickerDelegate for BranchListDelegate { fn confirm(&mut self, cx: &mut ViewContext>) { let current_pick = self.selected_index(); let current_pick = self.matches[current_pick].string.clone(); - let project = self.project.read(cx); + let project = self.workspace.read(cx).project().read(cx); let mut cwd = project .visible_worktrees(cx) .next() @@ -147,13 +148,25 @@ impl PickerDelegate for BranchListDelegate { .path .to_path_buf(); cwd.push(".git"); - project + let status = project .fs() .open_repo(&cwd) .unwrap() .lock() - .change_branch(¤t_pick) - .log_err(); + .change_branch(¤t_pick); + if let Err(err) = &status { + const GIT_CHECKOUT_FAILURE_ID: usize = 2048; + self.workspace.update(cx, |model, ctx| { + model.show_toast( + Toast::new( + GIT_CHECKOUT_FAILURE_ID, + format!("Failed to check out branch `{current_pick}`, error: `{err}`"), + ), + ctx, + ) + }); + } + status.log_err(); cx.emit(PickerEvent::Dismiss); } diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index e306aa20b3..b38ac39798 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -381,18 +381,20 @@ impl CollabTitlebarItem { } pub fn toggle_vcs_menu(&mut self, _: &ToggleVcsMenu, cx: &mut ViewContext) { if self.branch_popover.take().is_none() { - let view = cx.add_view(|cx| build_branch_list(self.project.clone(), cx)); - cx.subscribe(&view, |this, _, event, cx| { - match event { - PickerEvent::Dismiss => { - this.contacts_popover = None; + if let Some(workspace) = self.workspace.upgrade(cx) { + let view = cx.add_view(|cx| build_branch_list(workspace, cx)); + cx.subscribe(&view, |this, _, event, cx| { + match event { + PickerEvent::Dismiss => { + this.contacts_popover = None; + } } - } - cx.notify(); - }) - .detach(); - self.branch_popover = Some(view); + cx.notify(); + }) + .detach(); + self.branch_popover = Some(view); + } } cx.notify(); From aeafa6f6d6242dd81c0162e6528b240f3c4b61c2 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 29 Jun 2023 11:40:10 +0200 Subject: [PATCH 022/104] Fix build after rebase --- crates/collab_ui/src/collab_titlebar_item.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index b38ac39798..48a4e12ff5 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -254,9 +254,7 @@ impl CollabTitlebarItem { this.toggle_vcs_menu(&Default::default(), cx) }), ) - .with_children( - self.render_branches_popover_host(&theme.workspace.titlebar, cx), - ), + .with_children(self.render_branches_popover_host(&theme.titlebar, cx)), ) } ret.into_any() From e57364ede6d4e3f89a560934ed814e9ec93138a0 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 29 Jun 2023 11:42:20 +0200 Subject: [PATCH 023/104] Remove unnecessary imports --- crates/collab_ui/src/branch_list.rs | 7 +++---- crates/collab_ui/src/collab_titlebar_item.rs | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 2558b24ae8..2fb8721c94 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -1,9 +1,8 @@ use fuzzy::{StringMatch, StringMatchCandidate}; -use gpui::{elements::*, AppContext, ModelHandle, MouseState, Task, ViewContext, ViewHandle}; +use gpui::{elements::*, AppContext, MouseState, Task, ViewContext, ViewHandle}; use picker::{Picker, PickerDelegate, PickerEvent}; -use project::Project; -use std::{cmp::Ordering, sync::Arc}; -use util::{ResultExt, TryFutureExt}; +use std::sync::Arc; +use util::ResultExt; use workspace::{Toast, Workspace}; pub fn init(cx: &mut AppContext) { diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 48a4e12ff5..e6a0c98265 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -15,7 +15,6 @@ use gpui::{ actions, color::Color, elements::*, - fonts::TextStyle, geometry::{rect::RectF, vector::vec2f, PathBuilder}, json::{self, ToJson}, platform::{CursorStyle, MouseButton}, @@ -241,7 +240,7 @@ impl CollabTitlebarItem { ret = ret.with_child( Stack::new() .with_child( - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::::new(0, cx, |_, _| { Label::new(git_branch, style) .contained() .with_margin_right(item_spacing) From 98f71a7fa3822840665c5fe7a1e25909b12d98ed Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 29 Jun 2023 11:47:50 +0200 Subject: [PATCH 024/104] Trail off project/branch name --- crates/collab_ui/src/collab_titlebar_item.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index e6a0c98265..5bef89d1ee 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -28,7 +28,8 @@ use theme::{AvatarStyle, Theme}; use util::ResultExt; use workspace::{FollowNextCollaborator, Workspace}; -// const MAX_TITLE_LENGTH: usize = 75; +const MAX_PROJECT_NAME_LENGTH: usize = 40; +const MAX_BRANCH_NAME_LENGTH: usize = 40; actions!( collab, @@ -210,11 +211,16 @@ impl CollabTitlebarItem { names_and_branches.next().unwrap_or(("", None)) }; - let name = name.to_owned(); + let name = util::truncate_and_trailoff(name, MAX_PROJECT_NAME_LENGTH); let branch_prepended = entry .as_ref() .and_then(RepositoryEntry::branch) - .map(|branch| format!("/{branch}")); + .map(|branch| { + format!( + "/{}", + util::truncate_and_trailoff(&branch, MAX_BRANCH_NAME_LENGTH) + ) + }); let text_style = theme.titlebar.title.clone(); let item_spacing = theme.titlebar.item_spacing; From 1eb0f3d09156f01c280793d080702e3c0b78a7fb Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 29 Jun 2023 12:12:35 +0200 Subject: [PATCH 025/104] Update toast for checkout failure --- crates/collab_ui/src/branch_list.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 2fb8721c94..eb6b9c6f54 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -159,7 +159,7 @@ impl PickerDelegate for BranchListDelegate { model.show_toast( Toast::new( GIT_CHECKOUT_FAILURE_ID, - format!("Failed to check out branch `{current_pick}`, error: `{err}`"), + format!("Failed to checkout branch '{current_pick}', check for conflicts or unstashed files"), ), ctx, ) From d000ea97398d64613056a4dba9f6602257bb1e36 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 29 Jun 2023 12:57:49 +0200 Subject: [PATCH 026/104] Fix warning about unused variable --- crates/collab_ui/src/branch_list.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index eb6b9c6f54..2d014cc1b9 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -153,7 +153,7 @@ impl PickerDelegate for BranchListDelegate { .unwrap() .lock() .change_branch(¤t_pick); - if let Err(err) = &status { + if status.is_err() { const GIT_CHECKOUT_FAILURE_ID: usize = 2048; self.workspace.update(cx, |model, ctx| { model.show_toast( From 888d3b3fd620722a44483222cd4c3201153b15a4 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 29 Jun 2023 18:03:01 +0200 Subject: [PATCH 027/104] Project dropdown menu --- Cargo.lock | 2 + crates/collab_ui/Cargo.toml | 2 + crates/collab_ui/src/collab_titlebar_item.rs | 79 +++++++++++++++++-- crates/recent_projects/Cargo.toml | 1 + crates/recent_projects/src/recent_projects.rs | 21 ++++- 5 files changed, 95 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a59332520b..d16248c85a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1415,6 +1415,7 @@ dependencies = [ "picker", "postage", "project", + "recent_projects", "serde", "serde_derive", "settings", @@ -5376,6 +5377,7 @@ version = "0.1.0" dependencies = [ "db", "editor", + "futures 0.3.28", "fuzzy", "gpui", "language", diff --git a/crates/collab_ui/Cargo.toml b/crates/collab_ui/Cargo.toml index ee410ccba7..f81885c07a 100644 --- a/crates/collab_ui/Cargo.toml +++ b/crates/collab_ui/Cargo.toml @@ -35,6 +35,7 @@ gpui = { path = "../gpui" } menu = { path = "../menu" } picker = { path = "../picker" } project = { path = "../project" } +recent_projects = {path = "../recent_projects"} settings = { path = "../settings" } theme = { path = "../theme" } theme_selector = { path = "../theme_selector" } @@ -42,6 +43,7 @@ util = { path = "../util" } workspace = { path = "../workspace" } zed-actions = {path = "../zed-actions"} + anyhow.workspace = true futures.workspace = true log.workspace = true diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 5bef89d1ee..8dccf2a71a 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -23,6 +23,7 @@ use gpui::{ }; use picker::PickerEvent; use project::{Project, RepositoryEntry}; +use recent_projects::{build_recent_projects, RecentProjects}; use std::{ops::Range, sync::Arc}; use theme::{AvatarStyle, Theme}; use util::ResultExt; @@ -37,6 +38,7 @@ actions!( ToggleContactsMenu, ToggleUserMenu, ToggleVcsMenu, + ToggleProjectMenu, SwitchBranch, ShareProject, UnshareProject, @@ -49,6 +51,7 @@ pub fn init(cx: &mut AppContext) { cx.add_action(CollabTitlebarItem::unshare_project); cx.add_action(CollabTitlebarItem::toggle_user_menu); cx.add_action(CollabTitlebarItem::toggle_vcs_menu); + cx.add_action(CollabTitlebarItem::toggle_project_menu); } pub struct CollabTitlebarItem { @@ -58,6 +61,7 @@ pub struct CollabTitlebarItem { workspace: WeakViewHandle, contacts_popover: Option>, branch_popover: Option>, + project_popover: Option>, user_menu: ViewHandle, _subscriptions: Vec, } @@ -191,6 +195,7 @@ impl CollabTitlebarItem { menu }), branch_popover: None, + project_popover: None, _subscriptions: subscriptions, } } @@ -233,14 +238,22 @@ impl CollabTitlebarItem { }; let highlights = (0..name.len()).into_iter().collect(); let mut ret = Flex::row().with_child( - Stack::new().with_child( - Label::new(name, style.clone()) - .with_highlights(highlights) - .contained() - .aligned() - .left() - .into_any_named("title-project-name"), - ), + Stack::new() + .with_child( + MouseEventHandler::::new(0, cx, |_, _| { + Label::new(name, style.clone()) + .with_highlights(highlights) + .contained() + .aligned() + .left() + .into_any_named("title-project-name") + }) + .with_cursor_style(CursorStyle::PointingHand) + .on_click(MouseButton::Left, move |_, this, cx| { + this.toggle_project_menu(&Default::default(), cx) + }), + ) + .with_children(self.render_project_popover_host(&theme.titlebar, cx)), ); if let Some(git_branch) = branch_prepended { ret = ret.with_child( @@ -382,6 +395,36 @@ impl CollabTitlebarItem { .into_any() }) } + fn render_project_popover_host<'a>( + &'a self, + _theme: &'a theme::Titlebar, + cx: &'a mut ViewContext, + ) -> Option> { + self.project_popover.as_ref().map(|child| { + let theme = theme::current(cx).clone(); + let child = ChildView::new(child, cx); + let child = MouseEventHandler::::new(0, cx, |_, _| { + Flex::column() + .with_child(child.flex(1., true)) + .contained() + .constrained() + .with_width(theme.contacts_popover.width) + .with_height(theme.contacts_popover.height) + }) + .on_click(MouseButton::Left, |_, _, _| {}) + .on_down_out(MouseButton::Left, move |_, _, cx| cx.emit(())) + .into_any(); + + Overlay::new(child) + .with_fit_mode(OverlayFitMode::SwitchAnchor) + .with_anchor_corner(AnchorCorner::TopLeft) + .with_z_index(999) + .aligned() + .bottom() + .left() + .into_any() + }) + } pub fn toggle_vcs_menu(&mut self, _: &ToggleVcsMenu, cx: &mut ViewContext) { if self.branch_popover.take().is_none() { if let Some(workspace) = self.workspace.upgrade(cx) { @@ -402,6 +445,26 @@ impl CollabTitlebarItem { cx.notify(); } + + pub fn toggle_project_menu(&mut self, _: &ToggleProjectMenu, cx: &mut ViewContext) { + log::error!("Toggling project menu"); + if self.project_popover.take().is_none() { + let view = cx.add_view(|cx| build_recent_projects(self.workspace.clone(), cx)); + cx.subscribe(&view, |this, _, event, cx| { + match event { + PickerEvent::Dismiss => { + this.project_popover = None; + } + } + + cx.notify(); + }) + .detach(); + self.project_popover = Some(view); + } + + cx.notify(); + } fn render_toggle_contacts_button( &self, theme: &Theme, diff --git a/crates/recent_projects/Cargo.toml b/crates/recent_projects/Cargo.toml index 14f8853c9c..51774e8feb 100644 --- a/crates/recent_projects/Cargo.toml +++ b/crates/recent_projects/Cargo.toml @@ -21,6 +21,7 @@ util = { path = "../util"} theme = { path = "../theme" } workspace = { path = "../workspace" } +futures.workspace = true ordered-float.workspace = true postage.workspace = true smol.workspace = true diff --git a/crates/recent_projects/src/recent_projects.rs b/crates/recent_projects/src/recent_projects.rs index b13f72da0b..ed901a7da8 100644 --- a/crates/recent_projects/src/recent_projects.rs +++ b/crates/recent_projects/src/recent_projects.rs @@ -64,9 +64,26 @@ fn toggle( })) } -type RecentProjects = Picker; +pub fn build_recent_projects( + workspace: WeakViewHandle, + cx: &mut ViewContext, +) -> RecentProjects { + let workspaces = futures::executor::block_on(async { + WORKSPACE_DB + .recent_workspaces_on_disk() + .await + .unwrap_or_default() + .into_iter() + .map(|(_, location)| location) + .collect() + }); + Picker::new(RecentProjectsDelegate::new(workspace, workspaces), cx) + .with_theme(|theme| theme.picker.clone()) +} -struct RecentProjectsDelegate { +pub type RecentProjects = Picker; + +pub struct RecentProjectsDelegate { workspace: WeakViewHandle, workspace_locations: Vec, selected_match_index: usize, From 818ddbc7031f764a444e103b77eecd4eb2aba91b Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 29 Jun 2023 18:04:58 +0200 Subject: [PATCH 028/104] Make project dropdown exclusive wrt git menu --- crates/collab_ui/src/collab_titlebar_item.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 8dccf2a71a..c78ce2f4e1 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -439,6 +439,7 @@ impl CollabTitlebarItem { cx.notify(); }) .detach(); + self.project_popover.take(); self.branch_popover = Some(view); } } @@ -447,7 +448,6 @@ impl CollabTitlebarItem { } pub fn toggle_project_menu(&mut self, _: &ToggleProjectMenu, cx: &mut ViewContext) { - log::error!("Toggling project menu"); if self.project_popover.take().is_none() { let view = cx.add_view(|cx| build_recent_projects(self.workspace.clone(), cx)); cx.subscribe(&view, |this, _, event, cx| { @@ -460,6 +460,7 @@ impl CollabTitlebarItem { cx.notify(); }) .detach(); + self.branch_popover.take(); self.project_popover = Some(view); } From 081e340d26285692785871fe3c754153463d54e7 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 29 Jun 2023 19:07:51 +0200 Subject: [PATCH 029/104] Do not query db on foreground thread. Co-authored-by: Mikayla --- crates/collab_ui/src/collab_titlebar_item.rs | 42 +++++++++++++------ crates/recent_projects/src/recent_projects.rs | 10 +---- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index c78ce2f4e1..511113a360 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -27,7 +27,7 @@ use recent_projects::{build_recent_projects, RecentProjects}; use std::{ops::Range, sync::Arc}; use theme::{AvatarStyle, Theme}; use util::ResultExt; -use workspace::{FollowNextCollaborator, Workspace}; +use workspace::{FollowNextCollaborator, Workspace, WORKSPACE_DB}; const MAX_PROJECT_NAME_LENGTH: usize = 40; const MAX_BRANCH_NAME_LENGTH: usize = 40; @@ -448,23 +448,39 @@ impl CollabTitlebarItem { } pub fn toggle_project_menu(&mut self, _: &ToggleProjectMenu, cx: &mut ViewContext) { + let workspace = self.workspace.clone(); if self.project_popover.take().is_none() { - let view = cx.add_view(|cx| build_recent_projects(self.workspace.clone(), cx)); - cx.subscribe(&view, |this, _, event, cx| { - match event { - PickerEvent::Dismiss => { - this.project_popover = None; - } - } + cx.spawn(|this, mut cx| async move { + let workspaces = WORKSPACE_DB + .recent_workspaces_on_disk() + .await + .unwrap_or_default() + .into_iter() + .map(|(_, location)| location) + .collect(); - cx.notify(); + let workspace = workspace.clone(); + this.update(&mut cx, move |this, cx| { + let view = cx.add_view(|cx| build_recent_projects(workspace, workspaces, cx)); + + cx.subscribe(&view, |this, _, event, cx| { + match event { + PickerEvent::Dismiss => { + this.project_popover = None; + } + } + + cx.notify(); + }) + .detach(); + this.branch_popover.take(); + this.project_popover = Some(view); + cx.notify(); + }) + .log_err(); }) .detach(); - self.branch_popover.take(); - self.project_popover = Some(view); } - - cx.notify(); } fn render_toggle_contacts_button( &self, diff --git a/crates/recent_projects/src/recent_projects.rs b/crates/recent_projects/src/recent_projects.rs index ed901a7da8..b3c9655645 100644 --- a/crates/recent_projects/src/recent_projects.rs +++ b/crates/recent_projects/src/recent_projects.rs @@ -66,17 +66,9 @@ fn toggle( pub fn build_recent_projects( workspace: WeakViewHandle, + workspaces: Vec, cx: &mut ViewContext, ) -> RecentProjects { - let workspaces = futures::executor::block_on(async { - WORKSPACE_DB - .recent_workspaces_on_disk() - .await - .unwrap_or_default() - .into_iter() - .map(|(_, location)| location) - .collect() - }); Picker::new(RecentProjectsDelegate::new(workspace, workspaces), cx) .with_theme(|theme| theme.picker.clone()) } From c1a629215269b255b75629866fa79e229dd037fc Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Fri, 30 Jun 2023 12:15:47 +0200 Subject: [PATCH 030/104] Add missing call to cx.notify --- crates/collab_ui/src/collab_titlebar_item.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 511113a360..1fdce6f186 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -481,6 +481,7 @@ impl CollabTitlebarItem { }) .detach(); } + cx.notify(); } fn render_toggle_contacts_button( &self, From 3be8977ee86a3fb86ff27fbeb9c39e4797e28c9f Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Fri, 30 Jun 2023 14:00:37 +0200 Subject: [PATCH 031/104] Switch branches within spawn() --- crates/collab_ui/src/branch_list.rs | 87 +++++++++++++++-------------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 2d014cc1b9..038180b671 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -1,3 +1,4 @@ +use anyhow::{anyhow, bail}; use fuzzy::{StringMatch, StringMatchCandidate}; use gpui::{elements::*, AppContext, MouseState, Task, ViewContext, ViewHandle}; use picker::{Picker, PickerDelegate, PickerEvent}; @@ -53,7 +54,7 @@ impl PickerDelegate for BranchListDelegate { fn update_matches(&mut self, query: String, cx: &mut ViewContext>) -> Task<()> { cx.spawn(move |picker, mut cx| async move { - let candidates = picker + let Some(candidates) = picker .read_with(&mut cx, |view, cx| { let delegate = view.delegate(); let project = delegate.workspace.read(cx).project().read(&cx); @@ -67,13 +68,10 @@ impl PickerDelegate for BranchListDelegate { .path .to_path_buf(); cwd.push(".git"); - let mut branches = project - .fs() - .open_repo(&cwd) - .unwrap() + let Some(repo) = project.fs().open_repo(&cwd) else {bail!("Project does not have associated git repository.")}; + let mut branches = repo .lock() - .branches() - .unwrap(); + .branches()?; if query.is_empty() { const RECENT_BRANCHES_COUNT: usize = 10; // Do a partial sort to show recent-ish branches first. @@ -83,7 +81,7 @@ impl PickerDelegate for BranchListDelegate { branches.truncate(RECENT_BRANCHES_COUNT); branches.sort_unstable_by(|lhs, rhs| lhs.name.cmp(&rhs.name)); } - branches + Ok(branches .iter() .cloned() .enumerate() @@ -92,9 +90,10 @@ impl PickerDelegate for BranchListDelegate { char_bag: command.name.chars().collect(), string: command.name.into(), }) - .collect::>() + .collect::>()) }) - .unwrap(); + .log_err() else { return; }; + let Some(candidates) = candidates.log_err() else {return;}; let matches = if query.is_empty() { candidates .into_iter() @@ -136,37 +135,43 @@ impl PickerDelegate for BranchListDelegate { fn confirm(&mut self, cx: &mut ViewContext>) { let current_pick = self.selected_index(); let current_pick = self.matches[current_pick].string.clone(); - let project = self.workspace.read(cx).project().read(cx); - let mut cwd = project - .visible_worktrees(cx) - .next() - .unwrap() - .read(cx) - .root_entry() - .unwrap() - .path - .to_path_buf(); - cwd.push(".git"); - let status = project - .fs() - .open_repo(&cwd) - .unwrap() - .lock() - .change_branch(¤t_pick); - if status.is_err() { - const GIT_CHECKOUT_FAILURE_ID: usize = 2048; - self.workspace.update(cx, |model, ctx| { - model.show_toast( - Toast::new( - GIT_CHECKOUT_FAILURE_ID, - format!("Failed to checkout branch '{current_pick}', check for conflicts or unstashed files"), - ), - ctx, - ) - }); - } - status.log_err(); - cx.emit(PickerEvent::Dismiss); + cx.spawn(|picker, mut cx| async move { + picker.update(&mut cx, |this, cx| { + let project = this.delegate().workspace.read(cx).project().read(cx); + let mut cwd = project + .visible_worktrees(cx) + .next() + .ok_or_else(|| anyhow!("There are no visisible worktrees."))? + .read(cx) + .root_entry() + .ok_or_else(|| anyhow!("Worktree has no root entry."))? + .path + .to_path_buf(); + cwd.push(".git"); + let status = project + .fs() + .open_repo(&cwd) + .ok_or_else(|| anyhow!("Could not open repository at path `{}`", cwd.as_os_str().to_string_lossy()))? + .lock() + .change_branch(¤t_pick); + if status.is_err() { + const GIT_CHECKOUT_FAILURE_ID: usize = 2048; + this.delegate().workspace.update(cx, |model, ctx| { + model.show_toast( + Toast::new( + GIT_CHECKOUT_FAILURE_ID, + format!("Failed to checkout branch '{current_pick}', check for conflicts or unstashed files"), + ), + ctx, + ) + }); + status?; + } + cx.emit(PickerEvent::Dismiss); + + Ok::<(), anyhow::Error>(()) + }).log_err(); + }).detach(); } fn dismissed(&mut self, cx: &mut ViewContext>) { From b699e5c142f900ae0e38574ec2ad1e11e1a693cf Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:23:27 +0200 Subject: [PATCH 032/104] Add styles to git menu --- crates/collab_ui/src/branch_list.rs | 40 +++++++++++-------------- crates/theme/src/theme.rs | 2 ++ styles/src/style_tree/contact_finder.ts | 2 ++ styles/src/style_tree/picker.ts | 29 ++++++++++++++++++ 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 038180b671..95e418e67f 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -2,7 +2,7 @@ use anyhow::{anyhow, bail}; use fuzzy::{StringMatch, StringMatchCandidate}; use gpui::{elements::*, AppContext, MouseState, Task, ViewContext, ViewHandle}; use picker::{Picker, PickerDelegate, PickerEvent}; -use std::sync::Arc; +use std::{ops::Not, sync::Arc}; use util::ResultExt; use workspace::{Toast, Workspace}; @@ -212,7 +212,7 @@ impl PickerDelegate for BranchListDelegate { } fn render_header(&self, cx: &AppContext) -> Option>> { let theme = &theme::current(cx); - let style = theme.picker.no_matches.label.clone(); + let style = theme.picker.header.clone(); if self.last_query.is_empty() { Some( Flex::row() @@ -221,28 +221,24 @@ impl PickerDelegate for BranchListDelegate { ) } else { Some( - Flex::row() - .with_child(Label::new("Branches", style)) + Stack::new() + .with_child( + Flex::row() + .with_child(Label::new("Branches", style.clone()).aligned().left()), + ) + .with_children(self.matches.is_empty().not().then(|| { + let suffix = if self.matches.len() == 1 { "" } else { "es" }; + Flex::row() + .align_children_center() + .with_child(Label::new( + format!("{} match{}", self.matches.len(), suffix), + style, + )) + .aligned() + .right() + })) .into_any(), ) } } - fn render_footer(&self, cx: &AppContext) -> Option>> { - if !self.last_query.is_empty() && !self.matches.is_empty() { - let theme = &theme::current(cx); - let style = theme.picker.no_matches.label.clone(); - // Render "1 match" and "0 matches", "42 matches"etc. - let suffix = if self.matches.len() == 1 { "" } else { "es" }; - Some( - Flex::row() - .with_child(Label::new( - format!("{} match{}", self.matches.len(), suffix), - style, - )) - .into_any(), - ) - } else { - None - } - } } diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index e54dcdfd1e..687547a306 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -585,6 +585,8 @@ pub struct Picker { pub empty_input_editor: FieldEditor, pub no_matches: ContainedLabel, pub item: Toggleable>, + pub header: LabelStyle, + pub footer: LabelStyle, } #[derive(Clone, Debug, Deserialize, Default, JsonSchema)] diff --git a/styles/src/style_tree/contact_finder.ts b/styles/src/style_tree/contact_finder.ts index e61d100264..4815a4e98e 100644 --- a/styles/src/style_tree/contact_finder.ts +++ b/styles/src/style_tree/contact_finder.ts @@ -44,6 +44,8 @@ export default function contact_finder(theme: ColorScheme): any { no_matches: picker_style.no_matches, input_editor: picker_input, empty_input_editor: picker_input, + header: picker_style.header, + footer: picker_style.footer, }, row_height: 28, contact_avatar: { diff --git a/styles/src/style_tree/picker.ts b/styles/src/style_tree/picker.ts index 7ca76cd85f..9918d1a2d6 100644 --- a/styles/src/style_tree/picker.ts +++ b/styles/src/style_tree/picker.ts @@ -108,5 +108,34 @@ export default function picker(theme: ColorScheme): any { top: 8, }, }, + header: { + text: text(theme.lowest, "sans", "variant", { size: "xs" }), + padding: { + bottom: 4, + left: 12, + right: 12, + top: 4, + }, + margin: { + top: 1, + left: 4, + right: 4, + }, + }, + footer: { + text: text(theme.lowest, "sans", "variant", { size: "xs" }), + padding: { + bottom: 4, + left: 12, + right: 12, + top: 4, + }, + margin: { + top: 1, + left: 4, + right: 4, + }, + + } } } From ed75c316405814d2d06c96affb0d07de292ec3ad Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Fri, 30 Jun 2023 16:38:38 +0200 Subject: [PATCH 033/104] Improve styling of git menu --- crates/collab_ui/src/branch_list.rs | 23 +++++++++++++++++++---- crates/theme/src/theme.rs | 4 ++-- styles/src/style_tree/picker.ts | 21 +++++---------------- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 95e418e67f..0abe83f766 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -215,8 +215,16 @@ impl PickerDelegate for BranchListDelegate { let style = theme.picker.header.clone(); if self.last_query.is_empty() { Some( - Flex::row() - .with_child(Label::new("Recent branches", style)) + Stack::new() + .with_child( + Flex::row() + .with_child(Label::new("Recent branches", style.label.clone())) + .contained() + .with_style(style.container) + .into_any(), + ) + .contained() + .with_style(style.container) .into_any(), ) } else { @@ -224,7 +232,11 @@ impl PickerDelegate for BranchListDelegate { Stack::new() .with_child( Flex::row() - .with_child(Label::new("Branches", style.clone()).aligned().left()), + .with_child( + Label::new("Branches", style.label.clone()).aligned().left(), + ) + .contained() + .with_style(style.container), ) .with_children(self.matches.is_empty().not().then(|| { let suffix = if self.matches.len() == 1 { "" } else { "es" }; @@ -232,11 +244,14 @@ impl PickerDelegate for BranchListDelegate { .align_children_center() .with_child(Label::new( format!("{} match{}", self.matches.len(), suffix), - style, + style.label, )) .aligned() .right() })) + .contained() + .with_style(style.container) + .constrained() .into_any(), ) } diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index 687547a306..c224131d1e 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -585,8 +585,8 @@ pub struct Picker { pub empty_input_editor: FieldEditor, pub no_matches: ContainedLabel, pub item: Toggleable>, - pub header: LabelStyle, - pub footer: LabelStyle, + pub header: ContainedLabel, + pub footer: ContainedLabel, } #[derive(Clone, Debug, Deserialize, Default, JsonSchema)] diff --git a/styles/src/style_tree/picker.ts b/styles/src/style_tree/picker.ts index 9918d1a2d6..6a7221efb0 100644 --- a/styles/src/style_tree/picker.ts +++ b/styles/src/style_tree/picker.ts @@ -110,30 +110,19 @@ export default function picker(theme: ColorScheme): any { }, header: { text: text(theme.lowest, "sans", "variant", { size: "xs" }), - padding: { - bottom: 4, - left: 12, - right: 12, - top: 4, - }, + margin: { top: 1, - left: 4, - right: 4, + left: 8, + right: 8, }, }, footer: { text: text(theme.lowest, "sans", "variant", { size: "xs" }), - padding: { - bottom: 4, - left: 12, - right: 12, - top: 4, - }, margin: { top: 1, - left: 4, - right: 4, + left: 8, + right: 8, }, } From 4a654f52527bb2431478a778bc5771a45c489a04 Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Fri, 30 Jun 2023 13:27:48 -0400 Subject: [PATCH 034/104] Fix bug preventing the assist command from working in certain keymaps --- assets/keymaps/atom.json | 4 +--- assets/keymaps/sublime_text.json | 4 +--- assets/keymaps/textmate.json | 6 +++--- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/assets/keymaps/atom.json b/assets/keymaps/atom.json index 60acf5ea6f..af845ae4f2 100644 --- a/assets/keymaps/atom.json +++ b/assets/keymaps/atom.json @@ -24,9 +24,7 @@ ], "ctrl-shift-down": "editor::AddSelectionBelow", "ctrl-shift-up": "editor::AddSelectionAbove", - "cmd-shift-backspace": "editor::DeleteToBeginningOfLine", - "cmd-shift-enter": "editor::NewlineAbove", - "cmd-enter": "editor::NewlineBelow" + "cmd-shift-backspace": "editor::DeleteToBeginningOfLine" } }, { diff --git a/assets/keymaps/sublime_text.json b/assets/keymaps/sublime_text.json index 2d32b77d58..ca20802295 100644 --- a/assets/keymaps/sublime_text.json +++ b/assets/keymaps/sublime_text.json @@ -24,9 +24,7 @@ "ctrl-.": "editor::GoToHunk", "ctrl-,": "editor::GoToPrevHunk", "ctrl-backspace": "editor::DeleteToPreviousWordStart", - "ctrl-delete": "editor::DeleteToNextWordEnd", - "cmd-shift-enter": "editor::NewlineAbove", - "cmd-enter": "editor::NewlineBelow" + "ctrl-delete": "editor::DeleteToNextWordEnd" } }, { diff --git a/assets/keymaps/textmate.json b/assets/keymaps/textmate.json index 06be727429..591d6e443f 100644 --- a/assets/keymaps/textmate.json +++ b/assets/keymaps/textmate.json @@ -12,8 +12,6 @@ "ctrl-shift-d": "editor::DuplicateLine", "cmd-b": "editor::GoToDefinition", "cmd-j": "editor::ScrollCursorCenter", - "cmd-alt-enter": "editor::NewlineAbove", - "cmd-enter": "editor::NewlineBelow", "cmd-shift-l": "editor::SelectLine", "cmd-shift-t": "outline::Toggle", "alt-backspace": "editor::DeleteToPreviousWordStart", @@ -56,7 +54,9 @@ }, { "context": "Editor && mode == full", - "bindings": {} + "bindings": { + "cmd-alt-enter": "editor::NewlineAbove" + } }, { "context": "BufferSearchBar", From a5d9a10d7bf423b44bf43064b1a2dbb57ab235ea Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Fri, 30 Jun 2023 19:48:28 +0200 Subject: [PATCH 035/104] Focus dropdowns on open --- crates/collab_ui/src/collab_titlebar_item.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 1fdce6f186..b68095878d 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -440,6 +440,7 @@ impl CollabTitlebarItem { }) .detach(); self.project_popover.take(); + cx.focus(&view); self.branch_popover = Some(view); } } @@ -473,6 +474,7 @@ impl CollabTitlebarItem { cx.notify(); }) .detach(); + cx.focus(&view); this.branch_popover.take(); this.project_popover = Some(view); cx.notify(); From cec884b5a52f076029b1e7851531ebce593ae555 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Fri, 30 Jun 2023 20:07:44 +0200 Subject: [PATCH 036/104] Add styles for project name/git menu --- crates/collab_ui/src/collab_titlebar_item.rs | 67 ++++++++++---------- styles/src/style_tree/titlebar.ts | 5 +- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index b68095878d..0857b2b79a 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -220,29 +220,17 @@ impl CollabTitlebarItem { let branch_prepended = entry .as_ref() .and_then(RepositoryEntry::branch) - .map(|branch| { - format!( - "/{}", - util::truncate_and_trailoff(&branch, MAX_BRANCH_NAME_LENGTH) - ) - }); - let text_style = theme.titlebar.title.clone(); + .map(|branch| util::truncate_and_trailoff(&branch, MAX_BRANCH_NAME_LENGTH)); + let project_style = theme.titlebar.title.clone(); + let git_style = theme.titlebar.git_branch.clone(); + let divider_style = theme.titlebar.project_name_divider.clone(); let item_spacing = theme.titlebar.item_spacing; - let mut highlight = text_style.clone(); - highlight.color = theme.titlebar.highlight_color; - - let style = LabelStyle { - text: text_style, - highlight_text: Some(highlight), - }; - let highlights = (0..name.len()).into_iter().collect(); let mut ret = Flex::row().with_child( Stack::new() .with_child( MouseEventHandler::::new(0, cx, |_, _| { - Label::new(name, style.clone()) - .with_highlights(highlights) + Label::new(name, project_style.text.clone()) .contained() .aligned() .left() @@ -251,28 +239,43 @@ impl CollabTitlebarItem { .with_cursor_style(CursorStyle::PointingHand) .on_click(MouseButton::Left, move |_, this, cx| { this.toggle_project_menu(&Default::default(), cx) - }), + }) + .contained() + .with_style(project_style.container), ) .with_children(self.render_project_popover_host(&theme.titlebar, cx)), ); if let Some(git_branch) = branch_prepended { ret = ret.with_child( - Stack::new() + Flex::row() .with_child( - MouseEventHandler::::new(0, cx, |_, _| { - Label::new(git_branch, style) - .contained() - .with_margin_right(item_spacing) - .aligned() - .left() - .into_any_named("title-project-branch") - }) - .with_cursor_style(CursorStyle::PointingHand) - .on_click(MouseButton::Left, move |_, this, cx| { - this.toggle_vcs_menu(&Default::default(), cx) - }), + Label::new("/", divider_style.text) + .contained() + .with_style(divider_style.container) + .aligned() + .left(), ) - .with_children(self.render_branches_popover_host(&theme.titlebar, cx)), + .with_child( + Stack::new() + .with_child( + MouseEventHandler::::new(0, cx, |_, _| { + Label::new(git_branch, git_style.text) + .contained() + .with_margin_right(item_spacing) + .aligned() + .left() + .into_any_named("title-project-branch") + }) + .with_cursor_style(CursorStyle::PointingHand) + .on_click( + MouseButton::Left, + move |_, this, cx| { + this.toggle_vcs_menu(&Default::default(), cx) + }, + ), + ) + .with_children(self.render_branches_popover_host(&theme.titlebar, cx)), + ), ) } ret.into_any() diff --git a/styles/src/style_tree/titlebar.ts b/styles/src/style_tree/titlebar.ts index 067d619bb5..686f814a5d 100644 --- a/styles/src/style_tree/titlebar.ts +++ b/styles/src/style_tree/titlebar.ts @@ -173,8 +173,9 @@ export function titlebar(theme: ColorScheme): any { }, // Project - title: text(theme.lowest, "sans", "variant"), - highlight_color: text(theme.lowest, "sans", "active").color, + title: text(theme.lowest, "sans", "active"), + project_name_divider: text(theme.lowest, "sans", "variant"), + git_branch: text(theme.lowest, "sans", "variant"), // Collaborators leader_avatar: { From 7c2c1a279b2b78f9703707339781cd6ecc6f0bca Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Fri, 30 Jun 2023 20:09:30 +0200 Subject: [PATCH 037/104] Add missing rust-side definitions --- crates/theme/src/theme.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index c224131d1e..a4fbcedd32 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -118,8 +118,9 @@ pub struct Titlebar { #[serde(flatten)] pub container: ContainerStyle, pub height: f32, - pub title: TextStyle, - pub highlight_color: Color, + pub title: ContainedText, + pub project_name_divider: ContainedText, + pub git_branch: ContainedText, pub item_spacing: f32, pub face_pile_spacing: f32, pub avatar_ribbon: AvatarRibbon, From 92df76e632f7f76a5f064043d67ed09c4bf931b5 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 30 Jun 2023 11:20:50 -0700 Subject: [PATCH 038/104] Fix accidental ignoring of git FS events --- crates/project/src/worktree.rs | 80 +++++++++++++++------------- crates/project/src/worktree_tests.rs | 50 ++++++++--------- 2 files changed, 69 insertions(+), 61 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 20e693770f..2f793c84c9 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -2140,6 +2140,7 @@ impl LocalSnapshot { impl BackgroundScannerState { fn should_scan_directory(&self, entry: &Entry) -> bool { (!entry.is_external && !entry.is_ignored) + || entry.path.file_name() == Some(&*DOT_GIT) || self.scanned_dirs.contains(&entry.id) // If we've ever scanned it, keep scanning || self .paths_to_scan @@ -2319,6 +2320,7 @@ impl BackgroundScannerState { .entry_for_id(entry_id) .map(|entry| RepositoryWorkDirectory(entry.path.clone())) else { continue }; + log::info!("reload git repository {:?}", dot_git_dir); let repository = repository.repo_ptr.lock(); let branch = repository.branch_name(); repository.reload_index(); @@ -2359,6 +2361,8 @@ impl BackgroundScannerState { } fn build_repository(&mut self, dot_git_path: Arc, fs: &dyn Fs) -> Option<()> { + log::info!("build git repository {:?}", dot_git_path); + let work_dir_path: Arc = dot_git_path.parent().unwrap().into(); // Guard against repositories inside the repository metadata @@ -3138,8 +3142,6 @@ impl BackgroundScanner { } async fn process_events(&mut self, mut abs_paths: Vec) { - log::debug!("received fs events {:?}", abs_paths); - let root_path = self.state.lock().snapshot.abs_path.clone(); let root_canonical_path = match self.fs.canonicalize(&root_path).await { Ok(path) => path, @@ -3150,7 +3152,6 @@ impl BackgroundScanner { }; let mut relative_paths = Vec::with_capacity(abs_paths.len()); - let mut unloaded_relative_paths = Vec::new(); abs_paths.sort_unstable(); abs_paths.dedup_by(|a, b| a.starts_with(&b)); abs_paths.retain(|abs_path| { @@ -3173,7 +3174,6 @@ impl BackgroundScanner { }); if !parent_dir_is_loaded { log::debug!("ignoring event {relative_path:?} within unloaded directory"); - unloaded_relative_paths.push(relative_path); return false; } @@ -3182,27 +3182,30 @@ impl BackgroundScanner { } }); - if !relative_paths.is_empty() { - let (scan_job_tx, scan_job_rx) = channel::unbounded(); - self.reload_entries_for_paths( - root_path, - root_canonical_path, - &relative_paths, - abs_paths, - Some(scan_job_tx.clone()), - ) - .await; - drop(scan_job_tx); - self.scan_dirs(false, scan_job_rx).await; - - let (scan_job_tx, scan_job_rx) = channel::unbounded(); - self.update_ignore_statuses(scan_job_tx).await; - self.scan_dirs(false, scan_job_rx).await; + if relative_paths.is_empty() { + return; } + log::debug!("received fs events {:?}", relative_paths); + + let (scan_job_tx, scan_job_rx) = channel::unbounded(); + self.reload_entries_for_paths( + root_path, + root_canonical_path, + &relative_paths, + abs_paths, + Some(scan_job_tx.clone()), + ) + .await; + drop(scan_job_tx); + self.scan_dirs(false, scan_job_rx).await; + + let (scan_job_tx, scan_job_rx) = channel::unbounded(); + self.update_ignore_statuses(scan_job_tx).await; + self.scan_dirs(false, scan_job_rx).await; + { let mut state = self.state.lock(); - relative_paths.extend(unloaded_relative_paths); state.reload_repositories(&relative_paths, self.fs.as_ref()); state.snapshot.completed_scan_id = state.snapshot.scan_id; for (_, entry_id) in mem::take(&mut state.removed_entry_ids) { @@ -3610,23 +3613,28 @@ impl BackgroundScanner { } } - let fs_entry = state.insert_entry(fs_entry, self.fs.as_ref()); - - if let Some(scan_queue_tx) = &scan_queue_tx { - let mut ancestor_inodes = state.snapshot.ancestor_inodes_for_path(&path); - if metadata.is_dir && !ancestor_inodes.contains(&metadata.inode) { - ancestor_inodes.insert(metadata.inode); - smol::block_on(scan_queue_tx.send(ScanJob { - abs_path, - path: path.clone(), - ignore_stack, - ancestor_inodes, - is_external: fs_entry.is_external, - scan_queue: scan_queue_tx.clone(), - })) - .unwrap(); + if let (Some(scan_queue_tx), true) = (&scan_queue_tx, fs_entry.is_dir()) { + if state.should_scan_directory(&fs_entry) { + let mut ancestor_inodes = + state.snapshot.ancestor_inodes_for_path(&path); + if !ancestor_inodes.contains(&metadata.inode) { + ancestor_inodes.insert(metadata.inode); + smol::block_on(scan_queue_tx.send(ScanJob { + abs_path, + path: path.clone(), + ignore_stack, + ancestor_inodes, + is_external: fs_entry.is_external, + scan_queue: scan_queue_tx.clone(), + })) + .unwrap(); + } + } else { + fs_entry.kind = EntryKind::UnloadedDir; } } + + state.insert_entry(fs_entry, self.fs.as_ref()); } Ok(None) => { self.remove_repo_path(&path, &mut state.snapshot); diff --git a/crates/project/src/worktree_tests.rs b/crates/project/src/worktree_tests.rs index f908d702eb..c9ed06dea7 100644 --- a/crates/project/src/worktree_tests.rs +++ b/crates/project/src/worktree_tests.rs @@ -1654,6 +1654,23 @@ async fn test_git_status(deterministic: Arc, cx: &mut TestAppCont })); + const A_TXT: &'static str = "a.txt"; + const B_TXT: &'static str = "b.txt"; + const E_TXT: &'static str = "c/d/e.txt"; + const F_TXT: &'static str = "f.txt"; + const DOTGITIGNORE: &'static str = ".gitignore"; + const BUILD_FILE: &'static str = "target/build_file"; + let project_path = Path::new("project"); + + // Set up git repository before creating the worktree. + let work_dir = root.path().join("project"); + let mut repo = git_init(work_dir.as_path()); + repo.add_ignore_rule(IGNORE_RULE).unwrap(); + git_add(A_TXT, &repo); + git_add(E_TXT, &repo); + git_add(DOTGITIGNORE, &repo); + git_commit("Initial commit", &repo); + let tree = Worktree::local( build_client(cx), root.path(), @@ -1665,26 +1682,9 @@ async fn test_git_status(deterministic: Arc, cx: &mut TestAppCont .await .unwrap(); + tree.flush_fs_events(cx).await; cx.read(|cx| tree.read(cx).as_local().unwrap().scan_complete()) .await; - - const A_TXT: &'static str = "a.txt"; - const B_TXT: &'static str = "b.txt"; - const E_TXT: &'static str = "c/d/e.txt"; - const F_TXT: &'static str = "f.txt"; - const DOTGITIGNORE: &'static str = ".gitignore"; - const BUILD_FILE: &'static str = "target/build_file"; - let project_path: &Path = &Path::new("project"); - - let work_dir = root.path().join("project"); - let mut repo = git_init(work_dir.as_path()); - repo.add_ignore_rule(IGNORE_RULE).unwrap(); - git_add(Path::new(A_TXT), &repo); - git_add(Path::new(E_TXT), &repo); - git_add(Path::new(DOTGITIGNORE), &repo); - git_commit("Initial commit", &repo); - - tree.flush_fs_events(cx).await; deterministic.run_until_parked(); // Check that the right git state is observed on startup @@ -1704,39 +1704,39 @@ async fn test_git_status(deterministic: Arc, cx: &mut TestAppCont ); }); + // Modify a file in the working copy. std::fs::write(work_dir.join(A_TXT), "aa").unwrap(); - tree.flush_fs_events(cx).await; deterministic.run_until_parked(); + // The worktree detects that the file's git status has changed. tree.read_with(cx, |tree, _cx| { let snapshot = tree.snapshot(); - assert_eq!( snapshot.status_for_file(project_path.join(A_TXT)), Some(GitFileStatus::Modified) ); }); - git_add(Path::new(A_TXT), &repo); - git_add(Path::new(B_TXT), &repo); + // Create a commit in the git repository. + git_add(A_TXT, &repo); + git_add(B_TXT, &repo); git_commit("Committing modified and added", &repo); tree.flush_fs_events(cx).await; deterministic.run_until_parked(); - // Check that repo only changes are tracked + // The worktree detects that the files' git status have changed. tree.read_with(cx, |tree, _cx| { let snapshot = tree.snapshot(); - assert_eq!( snapshot.status_for_file(project_path.join(F_TXT)), Some(GitFileStatus::Added) ); - assert_eq!(snapshot.status_for_file(project_path.join(B_TXT)), None); assert_eq!(snapshot.status_for_file(project_path.join(A_TXT)), None); }); + // Modify files in the working copy and perform git operations on other files. git_reset(0, &repo); git_remove_index(Path::new(B_TXT), &repo); git_stash(&mut repo); From ae54e1d224e747ca9a997530184913adb3fe2b79 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Fri, 30 Jun 2023 08:19:57 +0300 Subject: [PATCH 039/104] Remove excessive hint update queries * Filter out queries for outdated buffers just before hint tasks spawn: multicared edits might empit standalone events simultaneously * Only spawn inlay update tasks for visible buffers with corresponding language * Do not spawn tasks for local projects' buffers without LSP servers --- crates/editor/src/editor.rs | 71 ++++- crates/editor/src/inlay_hint_cache.rs | 434 ++++++++++++++++++++------ crates/text/src/text.rs | 7 +- 3 files changed, 405 insertions(+), 107 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 64332c102a..81f073ed62 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -26,7 +26,7 @@ use aho_corasick::AhoCorasick; use anyhow::{anyhow, Result}; use blink_manager::BlinkManager; use client::{ClickhouseEvent, TelemetrySettings}; -use clock::ReplicaId; +use clock::{Global, ReplicaId}; use collections::{BTreeMap, Bound, HashMap, HashSet, VecDeque}; use copilot::Copilot; pub use display_map::DisplayPoint; @@ -1195,11 +1195,11 @@ enum GotoDefinitionKind { Type, } -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Clone)] enum InlayRefreshReason { SettingsChange(InlayHintSettings), NewLinesShown, - ExcerptEdited, + BufferEdited(HashSet>), RefreshRequested, } @@ -2617,7 +2617,7 @@ impl Editor { return; } - let invalidate_cache = match reason { + let (invalidate_cache, required_languages) = match reason { InlayRefreshReason::SettingsChange(new_settings) => { match self.inlay_hint_cache.update_settings( &self.buffer, @@ -2633,16 +2633,18 @@ impl Editor { return; } ControlFlow::Break(None) => return, - ControlFlow::Continue(()) => InvalidationStrategy::RefreshRequested, + ControlFlow::Continue(()) => (InvalidationStrategy::RefreshRequested, None), } } - InlayRefreshReason::NewLinesShown => InvalidationStrategy::None, - InlayRefreshReason::ExcerptEdited => InvalidationStrategy::ExcerptEdited, - InlayRefreshReason::RefreshRequested => InvalidationStrategy::RefreshRequested, + InlayRefreshReason::NewLinesShown => (InvalidationStrategy::None, None), + InlayRefreshReason::BufferEdited(buffer_languages) => { + (InvalidationStrategy::BufferEdited, Some(buffer_languages)) + } + InlayRefreshReason::RefreshRequested => (InvalidationStrategy::RefreshRequested, None), }; self.inlay_hint_cache.refresh_inlay_hints( - self.excerpt_visible_offsets(cx), + self.excerpt_visible_offsets(required_languages.as_ref(), cx), invalidate_cache, cx, ) @@ -2661,8 +2663,9 @@ impl Editor { fn excerpt_visible_offsets( &self, + restrict_to_languages: Option<&HashSet>>, cx: &mut ViewContext<'_, '_, Editor>, - ) -> HashMap, Range)> { + ) -> HashMap, Global, Range)> { let multi_buffer = self.buffer().read(cx); let multi_buffer_snapshot = multi_buffer.snapshot(cx); let multi_buffer_visible_start = self @@ -2680,8 +2683,22 @@ impl Editor { .range_to_buffer_ranges(multi_buffer_visible_range, cx) .into_iter() .filter(|(_, excerpt_visible_range, _)| !excerpt_visible_range.is_empty()) - .map(|(buffer, excerpt_visible_range, excerpt_id)| { - (excerpt_id, (buffer, excerpt_visible_range)) + .filter_map(|(buffer_handle, excerpt_visible_range, excerpt_id)| { + let buffer = buffer_handle.read(cx); + let language = buffer.language()?; + if let Some(restrict_to_languages) = restrict_to_languages { + if !restrict_to_languages.contains(language) { + return None; + } + } + Some(( + excerpt_id, + ( + buffer_handle, + buffer.version().clone(), + excerpt_visible_range, + ), + )) }) .collect() } @@ -7256,7 +7273,7 @@ impl Editor { fn on_buffer_event( &mut self, - _: ModelHandle, + multibuffer: ModelHandle, event: &multi_buffer::Event, cx: &mut ViewContext, ) { @@ -7268,7 +7285,33 @@ impl Editor { self.update_visible_copilot_suggestion(cx); } cx.emit(Event::BufferEdited); - self.refresh_inlays(InlayRefreshReason::ExcerptEdited, cx); + + if let Some(project) = &self.project { + let project = project.read(cx); + let languages_affected = multibuffer + .read(cx) + .all_buffers() + .into_iter() + .filter_map(|buffer| { + let buffer = buffer.read(cx); + let language = buffer.language()?; + if project.is_local() + && project.language_servers_for_buffer(buffer, cx).count() == 0 + { + None + } else { + Some(language) + } + }) + .cloned() + .collect::>(); + if !languages_affected.is_empty() { + self.refresh_inlays( + InlayRefreshReason::BufferEdited(languages_affected), + cx, + ); + } + } } multi_buffer::Event::ExcerptsAdded { buffer, diff --git a/crates/editor/src/inlay_hint_cache.rs b/crates/editor/src/inlay_hint_cache.rs index af7bf3e4c5..3f9f8e4288 100644 --- a/crates/editor/src/inlay_hint_cache.rs +++ b/crates/editor/src/inlay_hint_cache.rs @@ -38,7 +38,7 @@ pub struct CachedExcerptHints { #[derive(Debug, Clone, Copy)] pub enum InvalidationStrategy { RefreshRequested, - ExcerptEdited, + BufferEdited, None, } @@ -94,7 +94,7 @@ impl InvalidationStrategy { fn should_invalidate(&self) -> bool { matches!( self, - InvalidationStrategy::RefreshRequested | InvalidationStrategy::ExcerptEdited + InvalidationStrategy::RefreshRequested | InvalidationStrategy::BufferEdited ) } } @@ -197,7 +197,7 @@ impl InlayHintCache { pub fn refresh_inlay_hints( &mut self, - mut excerpts_to_query: HashMap, Range)>, + mut excerpts_to_query: HashMap, Global, Range)>, invalidate: InvalidationStrategy, cx: &mut ViewContext, ) { @@ -342,104 +342,113 @@ impl InlayHintCache { fn spawn_new_update_tasks( editor: &mut Editor, - excerpts_to_query: HashMap, Range)>, + excerpts_to_query: HashMap, Global, Range)>, invalidate: InvalidationStrategy, update_cache_version: usize, cx: &mut ViewContext<'_, '_, Editor>, ) { let visible_hints = Arc::new(editor.visible_inlay_hints(cx)); - for (excerpt_id, (buffer_handle, excerpt_visible_range)) in excerpts_to_query { - if !excerpt_visible_range.is_empty() { - let buffer = buffer_handle.read(cx); - let buffer_snapshot = buffer.snapshot(); - let cached_excerpt_hints = editor.inlay_hint_cache.hints.get(&excerpt_id).cloned(); - if let Some(cached_excerpt_hints) = &cached_excerpt_hints { - let new_task_buffer_version = buffer_snapshot.version(); - let cached_excerpt_hints = cached_excerpt_hints.read(); - let cached_buffer_version = &cached_excerpt_hints.buffer_version; - if cached_excerpt_hints.version > update_cache_version - || cached_buffer_version.changed_since(new_task_buffer_version) - { - return; - } - if !new_task_buffer_version.changed_since(&cached_buffer_version) - && !matches!(invalidate, InvalidationStrategy::RefreshRequested) - { - return; - } + for (excerpt_id, (buffer_handle, new_task_buffer_version, excerpt_visible_range)) in + excerpts_to_query + { + if excerpt_visible_range.is_empty() { + continue; + } + let buffer = buffer_handle.read(cx); + let buffer_snapshot = buffer.snapshot(); + if buffer_snapshot + .version() + .changed_since(&new_task_buffer_version) + { + continue; + } + + let cached_excerpt_hints = editor.inlay_hint_cache.hints.get(&excerpt_id).cloned(); + if let Some(cached_excerpt_hints) = &cached_excerpt_hints { + let cached_excerpt_hints = cached_excerpt_hints.read(); + let cached_buffer_version = &cached_excerpt_hints.buffer_version; + if cached_excerpt_hints.version > update_cache_version + || cached_buffer_version.changed_since(&new_task_buffer_version) + { + continue; + } + if !new_task_buffer_version.changed_since(&cached_buffer_version) + && !matches!(invalidate, InvalidationStrategy::RefreshRequested) + { + continue; + } + }; + + let buffer_id = buffer.remote_id(); + let excerpt_visible_range_start = buffer.anchor_before(excerpt_visible_range.start); + let excerpt_visible_range_end = buffer.anchor_after(excerpt_visible_range.end); + + let (multi_buffer_snapshot, full_excerpt_range) = + editor.buffer.update(cx, |multi_buffer, cx| { + let multi_buffer_snapshot = multi_buffer.snapshot(cx); + ( + multi_buffer_snapshot, + multi_buffer + .excerpts_for_buffer(&buffer_handle, cx) + .into_iter() + .find(|(id, _)| id == &excerpt_id) + .map(|(_, range)| range.context), + ) + }); + + if let Some(full_excerpt_range) = full_excerpt_range { + let query = ExcerptQuery { + buffer_id, + excerpt_id, + dimensions: ExcerptDimensions { + excerpt_range_start: full_excerpt_range.start, + excerpt_range_end: full_excerpt_range.end, + excerpt_visible_range_start, + excerpt_visible_range_end, + }, + cache_version: update_cache_version, + invalidate, }; - let buffer_id = buffer.remote_id(); - let excerpt_visible_range_start = buffer.anchor_before(excerpt_visible_range.start); - let excerpt_visible_range_end = buffer.anchor_after(excerpt_visible_range.end); - - let (multi_buffer_snapshot, full_excerpt_range) = - editor.buffer.update(cx, |multi_buffer, cx| { - let multi_buffer_snapshot = multi_buffer.snapshot(cx); - ( - multi_buffer_snapshot, - multi_buffer - .excerpts_for_buffer(&buffer_handle, cx) - .into_iter() - .find(|(id, _)| id == &excerpt_id) - .map(|(_, range)| range.context), - ) - }); - - if let Some(full_excerpt_range) = full_excerpt_range { - let query = ExcerptQuery { - buffer_id, - excerpt_id, - dimensions: ExcerptDimensions { - excerpt_range_start: full_excerpt_range.start, - excerpt_range_end: full_excerpt_range.end, - excerpt_visible_range_start, - excerpt_visible_range_end, - }, - cache_version: update_cache_version, - invalidate, - }; - - let new_update_task = |is_refresh_after_regular_task| { - new_update_task( - query, - multi_buffer_snapshot, - buffer_snapshot, - Arc::clone(&visible_hints), - cached_excerpt_hints, - is_refresh_after_regular_task, - cx, - ) - }; - match editor.inlay_hint_cache.update_tasks.entry(excerpt_id) { - hash_map::Entry::Occupied(mut o) => { - let update_task = o.get_mut(); - match (update_task.invalidate, invalidate) { - (_, InvalidationStrategy::None) => {} - ( - InvalidationStrategy::ExcerptEdited, - InvalidationStrategy::RefreshRequested, - ) if !update_task.task.is_running_rx.is_closed() => { - update_task.pending_refresh = Some(query); - } - _ => { - o.insert(UpdateTask { - invalidate, - cache_version: query.cache_version, - task: new_update_task(false), - pending_refresh: None, - }); - } + let new_update_task = |is_refresh_after_regular_task| { + new_update_task( + query, + multi_buffer_snapshot, + buffer_snapshot, + Arc::clone(&visible_hints), + cached_excerpt_hints, + is_refresh_after_regular_task, + cx, + ) + }; + match editor.inlay_hint_cache.update_tasks.entry(excerpt_id) { + hash_map::Entry::Occupied(mut o) => { + let update_task = o.get_mut(); + match (update_task.invalidate, invalidate) { + (_, InvalidationStrategy::None) => {} + ( + InvalidationStrategy::BufferEdited, + InvalidationStrategy::RefreshRequested, + ) if !update_task.task.is_running_rx.is_closed() => { + update_task.pending_refresh = Some(query); + } + _ => { + o.insert(UpdateTask { + invalidate, + cache_version: query.cache_version, + task: new_update_task(false), + pending_refresh: None, + }); } } - hash_map::Entry::Vacant(v) => { - v.insert(UpdateTask { - invalidate, - cache_version: query.cache_version, - task: new_update_task(false), - pending_refresh: None, - }); - } + } + hash_map::Entry::Vacant(v) => { + v.insert(UpdateTask { + invalidate, + cache_version: query.cache_version, + task: new_update_task(false), + pending_refresh: None, + }); } } } @@ -961,6 +970,247 @@ mod tests { }); } + #[gpui::test] + async fn test_no_hint_updates_for_unrelated_language_files(cx: &mut gpui::TestAppContext) { + let allowed_hint_kinds = HashSet::from_iter([None, Some(InlayHintKind::Type)]); + init_test(cx, |settings| { + settings.defaults.inlay_hints = Some(InlayHintSettings { + enabled: true, + show_type_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), + show_parameter_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Parameter)), + show_other_hints: allowed_hint_kinds.contains(&None), + }) + }); + + let fs = FakeFs::new(cx.background()); + fs.insert_tree( + "/a", + json!({ + "main.rs": "fn main() { a } // and some long comment to ensure inlays are not trimmed out", + "other.md": "Test md file with some text", + }), + ) + .await; + let project = Project::test(fs, ["/a".as_ref()], cx).await; + let (_, workspace) = cx.add_window(|cx| Workspace::test_new(project.clone(), cx)); + let worktree_id = workspace.update(cx, |workspace, cx| { + workspace.project().read_with(cx, |project, cx| { + project.worktrees(cx).next().unwrap().read(cx).id() + }) + }); + + let mut rs_fake_servers = None; + let mut md_fake_servers = None; + for (name, path_suffix) in [("Rust", "rs"), ("Markdown", "md")] { + let mut language = Language::new( + LanguageConfig { + name: name.into(), + path_suffixes: vec![path_suffix.to_string()], + ..Default::default() + }, + Some(tree_sitter_rust::language()), + ); + let fake_servers = language + .set_fake_lsp_adapter(Arc::new(FakeLspAdapter { + name, + capabilities: lsp::ServerCapabilities { + inlay_hint_provider: Some(lsp::OneOf::Left(true)), + ..Default::default() + }, + ..Default::default() + })) + .await; + match name { + "Rust" => rs_fake_servers = Some(fake_servers), + "Markdown" => md_fake_servers = Some(fake_servers), + _ => unreachable!(), + } + project.update(cx, |project, _| { + project.languages().add(Arc::new(language)); + }); + } + + let _rs_buffer = project + .update(cx, |project, cx| { + project.open_local_buffer("/a/main.rs", cx) + }) + .await + .unwrap(); + cx.foreground().run_until_parked(); + cx.foreground().start_waiting(); + let rs_fake_server = rs_fake_servers.unwrap().next().await.unwrap(); + let rs_editor = workspace + .update(cx, |workspace, cx| { + workspace.open_path((worktree_id, "main.rs"), None, true, cx) + }) + .await + .unwrap() + .downcast::() + .unwrap(); + let rs_lsp_request_count = Arc::new(AtomicU32::new(0)); + rs_fake_server + .handle_request::(move |params, _| { + let task_lsp_request_count = Arc::clone(&rs_lsp_request_count); + async move { + assert_eq!( + params.text_document.uri, + lsp::Url::from_file_path("/a/main.rs").unwrap(), + ); + let i = Arc::clone(&task_lsp_request_count).fetch_add(1, Ordering::SeqCst); + Ok(Some(vec![lsp::InlayHint { + position: lsp::Position::new(0, i), + label: lsp::InlayHintLabel::String(i.to_string()), + kind: None, + text_edits: None, + tooltip: None, + padding_left: None, + padding_right: None, + data: None, + }])) + } + }) + .next() + .await; + cx.foreground().run_until_parked(); + rs_editor.update(cx, |editor, cx| { + let expected_layers = vec!["0".to_string()]; + assert_eq!( + expected_layers, + cached_hint_labels(editor), + "Should get its first hints when opening the editor" + ); + assert_eq!(expected_layers, visible_hint_labels(editor, cx)); + let inlay_cache = editor.inlay_hint_cache(); + assert_eq!( + inlay_cache.allowed_hint_kinds, allowed_hint_kinds, + "Cache should use editor settings to get the allowed hint kinds" + ); + assert_eq!( + inlay_cache.version, 1, + "Rust editor update the cache version after every cache/view change" + ); + }); + + cx.foreground().run_until_parked(); + let _md_buffer = project + .update(cx, |project, cx| { + project.open_local_buffer("/a/other.md", cx) + }) + .await + .unwrap(); + cx.foreground().run_until_parked(); + cx.foreground().start_waiting(); + let md_fake_server = md_fake_servers.unwrap().next().await.unwrap(); + let md_editor = workspace + .update(cx, |workspace, cx| { + workspace.open_path((worktree_id, "other.md"), None, true, cx) + }) + .await + .unwrap() + .downcast::() + .unwrap(); + let md_lsp_request_count = Arc::new(AtomicU32::new(0)); + md_fake_server + .handle_request::(move |params, _| { + let task_lsp_request_count = Arc::clone(&md_lsp_request_count); + async move { + assert_eq!( + params.text_document.uri, + lsp::Url::from_file_path("/a/other.md").unwrap(), + ); + let i = Arc::clone(&task_lsp_request_count).fetch_add(1, Ordering::SeqCst); + Ok(Some(vec![lsp::InlayHint { + position: lsp::Position::new(0, i), + label: lsp::InlayHintLabel::String(i.to_string()), + kind: None, + text_edits: None, + tooltip: None, + padding_left: None, + padding_right: None, + data: None, + }])) + } + }) + .next() + .await; + cx.foreground().run_until_parked(); + md_editor.update(cx, |editor, cx| { + let expected_layers = vec!["0".to_string()]; + assert_eq!( + expected_layers, + cached_hint_labels(editor), + "Markdown editor should have a separate verison, repeating Rust editor rules" + ); + assert_eq!(expected_layers, visible_hint_labels(editor, cx)); + let inlay_cache = editor.inlay_hint_cache(); + assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); + assert_eq!(inlay_cache.version, 1); + }); + + rs_editor.update(cx, |editor, cx| { + editor.change_selections(None, cx, |s| s.select_ranges([13..13])); + editor.handle_input("some rs change", cx); + }); + cx.foreground().run_until_parked(); + rs_editor.update(cx, |editor, cx| { + let expected_layers = vec!["1".to_string()]; + assert_eq!( + expected_layers, + cached_hint_labels(editor), + "Rust inlay cache should change after the edit" + ); + assert_eq!(expected_layers, visible_hint_labels(editor, cx)); + let inlay_cache = editor.inlay_hint_cache(); + assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); + assert_eq!( + inlay_cache.version, 2, + "Every time hint cache changes, cache version should be incremented" + ); + }); + md_editor.update(cx, |editor, cx| { + let expected_layers = vec!["0".to_string()]; + assert_eq!( + expected_layers, + cached_hint_labels(editor), + "Markdown editor should not be affected by Rust editor changes" + ); + assert_eq!(expected_layers, visible_hint_labels(editor, cx)); + let inlay_cache = editor.inlay_hint_cache(); + assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); + assert_eq!(inlay_cache.version, 1); + }); + + md_editor.update(cx, |editor, cx| { + editor.change_selections(None, cx, |s| s.select_ranges([13..13])); + editor.handle_input("some md change", cx); + }); + cx.foreground().run_until_parked(); + md_editor.update(cx, |editor, cx| { + let expected_layers = vec!["1".to_string()]; + assert_eq!( + expected_layers, + cached_hint_labels(editor), + "Rust editor should not be affected by Markdown editor changes" + ); + assert_eq!(expected_layers, visible_hint_labels(editor, cx)); + let inlay_cache = editor.inlay_hint_cache(); + assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); + assert_eq!(inlay_cache.version, 2); + }); + rs_editor.update(cx, |editor, cx| { + let expected_layers = vec!["1".to_string()]; + assert_eq!( + expected_layers, + cached_hint_labels(editor), + "Markdown editor should also change independently" + ); + assert_eq!(expected_layers, visible_hint_labels(editor, cx)); + let inlay_cache = editor.inlay_hint_cache(); + assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); + assert_eq!(inlay_cache.version, 2); + }); + } + #[gpui::test] async fn test_hint_setting_changes(cx: &mut gpui::TestAppContext) { let allowed_hint_kinds = HashSet::from_iter([None, Some(InlayHintKind::Type)]); diff --git a/crates/text/src/text.rs b/crates/text/src/text.rs index 28c5125de2..7c94f25e1e 100644 --- a/crates/text/src/text.rs +++ b/crates/text/src/text.rs @@ -2489,7 +2489,12 @@ impl ToOffset for Point { impl ToOffset for usize { fn to_offset(&self, snapshot: &BufferSnapshot) -> usize { - assert!(*self <= snapshot.len(), "offset {self} is out of range"); + assert!( + *self <= snapshot.len(), + "offset {} is out of range, max allowed is {}", + self, + snapshot.len() + ); *self } } From 138de37cbffef208c2e0f9f171796afd73d91e4f Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Fri, 30 Jun 2023 16:10:49 -0700 Subject: [PATCH 040/104] Add basic sound handling infrastructure --- Cargo.lock | 463 ++++++++++++++++++++++++++++++++++--- crates/call/Cargo.toml | 1 + crates/call/src/call.rs | 14 +- crates/call/src/room.rs | 42 ++++ crates/collab/src/tests.rs | 2 +- crates/zed/src/assets.rs | 1 + crates/zed/src/main.rs | 2 +- crates/zed/src/zed.rs | 2 +- 8 files changed, 495 insertions(+), 32 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3748f24933..6dcf614e08 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -177,6 +177,28 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" +[[package]] +name = "alsa" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8512c9117059663fb5606788fbca3619e2a91dac0e3fe516242eab1fa6be5e44" +dependencies = [ + "alsa-sys", + "bitflags", + "libc", + "nix", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + [[package]] name = "ambient-authority" version = "0.0.1" @@ -756,6 +778,26 @@ dependencies = [ "serde", ] +[[package]] +name = "bindgen" +version = "0.64.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 1.0.109", +] + [[package]] name = "bindgen" version = "0.65.1" @@ -857,7 +899,7 @@ checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" dependencies = [ "borsh-derive-internal", "borsh-schema-derive-internal", - "proc-macro-crate", + "proc-macro-crate 0.1.5", "proc-macro2", "syn 1.0.109", ] @@ -997,6 +1039,7 @@ dependencies = [ "media", "postage", "project", + "rodio", "settings", "util", ] @@ -1082,6 +1125,12 @@ dependencies = [ "jobserver", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cexpr" version = "0.6.0" @@ -1155,7 +1204,7 @@ dependencies = [ "bitflags", "clap_derive 3.2.25", "clap_lex 0.2.4", - "indexmap", + "indexmap 1.9.3", "once_cell", "strsim", "termcolor", @@ -1226,6 +1275,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +[[package]] +name = "claxon" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" + [[package]] name = "cli" version = "0.1.0" @@ -1444,6 +1499,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes 1.4.0", + "memchr", +] + [[package]] name = "command_palette" version = "0.1.0" @@ -1540,11 +1605,17 @@ name = "core-foundation" version = "0.9.3" source = "git+https://github.com/servo/core-foundation-rs?rev=079665882507dd5e2ff77db3de5070c1f6c0fb85#079665882507dd5e2ff77db3de5070c1f6c0fb85" dependencies = [ - "core-foundation-sys", + "core-foundation-sys 0.8.3", "libc", "uuid 0.5.1", ] +[[package]] +name = "core-foundation-sys" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" + [[package]] name = "core-foundation-sys" version = "0.8.3" @@ -1594,6 +1665,51 @@ dependencies = [ "libc", ] +[[package]] +name = "coreaudio-rs" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb17e2d1795b1996419648915df94bc7103c28f7b48062d7acf4652fc371b2ff" +dependencies = [ + "bitflags", + "core-foundation-sys 0.6.2", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f034b2258e6c4ade2f73bf87b21047567fb913ee9550837c2316d139b0262b24" +dependencies = [ + "bindgen 0.64.0", +] + +[[package]] +name = "cpal" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" +dependencies = [ + "alsa", + "core-foundation-sys 0.8.3", + "coreaudio-rs", + "dasp_sample", + "jni 0.19.0", + "js-sys", + "libc", + "mach2", + "ndk", + "ndk-context", + "oboe", + "once_cell", + "parking_lot 0.12.1", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.46.0", +] + [[package]] name = "cpp_demangle" version = "0.3.5" @@ -1924,6 +2040,12 @@ dependencies = [ "parking_lot_core 0.9.7", ] +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + [[package]] name = "data-url" version = "0.1.1" @@ -2233,6 +2355,12 @@ dependencies = [ "serde", ] +[[package]] +name = "equivalent" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88bffebc5d80432c9b140ee17875ff173a8ab62faad5b257da912bd2f6c1c0a1" + [[package]] name = "erased-serde" version = "0.3.25" @@ -2793,7 +2921,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" dependencies = [ "fallible-iterator", - "indexmap", + "indexmap 1.9.3", "stable_deref_trait", ] @@ -2889,7 +3017,7 @@ dependencies = [ "anyhow", "async-task", "backtrace", - "bindgen", + "bindgen 0.65.1", "block", "cc", "cocoa", @@ -2961,7 +3089,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.3", "slab", "tokio", "tokio-util 0.7.8", @@ -2995,6 +3123,12 @@ dependencies = [ "ahash 0.8.3", ] +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + [[package]] name = "hashlink" version = "0.8.1" @@ -3105,6 +3239,12 @@ dependencies = [ "digest 0.10.6", ] +[[package]] +name = "hound" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d13cdbd5dbb29f9c88095bbdc2590c9cba0d0a1269b983fef6b2cdd7e9f4db1" + [[package]] name = "http" version = "0.2.9" @@ -3213,11 +3353,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" dependencies = [ "android_system_properties", - "core-foundation-sys", + "core-foundation-sys 0.8.3", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows 0.48.0", ] [[package]] @@ -3287,6 +3427,16 @@ dependencies = [ "serde", ] +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + [[package]] name = "indoc" version = "1.0.9" @@ -3459,6 +3609,40 @@ dependencies = [ "cc", ] +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + [[package]] name = "jobserver" version = "0.1.26" @@ -3661,6 +3845,17 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" +[[package]] +name = "lewton" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" +dependencies = [ + "byteorder", + "ogg", + "tinyvec", +] + [[package]] name = "libc" version = "0.2.144" @@ -3893,6 +4088,15 @@ dependencies = [ "libc", ] +[[package]] +name = "mach2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +dependencies = [ + "libc", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -3949,7 +4153,7 @@ name = "media" version = "0.1.0" dependencies = [ "anyhow", - "bindgen", + "bindgen 0.65.1", "block", "bytes 1.4.0", "core-foundation", @@ -4207,6 +4411,35 @@ dependencies = [ "tempfile", ] +[[package]] +name = "ndk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags", + "jni-sys", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.4.1+23.1.7779620" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +dependencies = [ + "jni-sys", +] + [[package]] name = "net2" version = "0.2.38" @@ -4315,6 +4548,17 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -4367,6 +4611,27 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "nvim-rs" version = "0.5.0" @@ -4409,7 +4674,7 @@ checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" dependencies = [ "crc32fast", "hashbrown 0.11.2", - "indexmap", + "indexmap 1.9.3", "memchr", ] @@ -4422,6 +4687,38 @@ dependencies = [ "memchr", ] +[[package]] +name = "oboe" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" +dependencies = [ + "jni 0.20.0", + "ndk", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2" +dependencies = [ + "cc", +] + +[[package]] +name = "ogg" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" +dependencies = [ + "byteorder", +] + [[package]] name = "once_cell" version = "1.17.1" @@ -4711,7 +5008,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" dependencies = [ "fixedbitset", - "indexmap", + "indexmap 1.9.3", ] [[package]] @@ -4788,7 +5085,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bd9647b268a3d3e14ff09c23201133a62589c658db02bb7388c7246aafe0590" dependencies = [ "base64 0.21.0", - "indexmap", + "indexmap 1.9.3", "line-wrap", "quick-xml", "serde", @@ -4921,6 +5218,16 @@ dependencies = [ "toml", ] +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -5333,6 +5640,12 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + [[package]] name = "rayon" version = "1.7.0" @@ -5616,6 +5929,19 @@ dependencies = [ "rmp", ] +[[package]] +name = "rodio" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf1d4dea18dff2e9eb6dca123724f8b60ef44ad74a9ad283cdfe025df7e73fa" +dependencies = [ + "claxon", + "cpal", + "hound", + "lewton", + "symphonia", +] + [[package]] name = "rope" version = "0.1.0" @@ -6117,7 +6443,7 @@ checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" dependencies = [ "bitflags", "core-foundation", - "core-foundation-sys", + "core-foundation-sys 0.8.3", "libc", "security-framework-sys", ] @@ -6128,7 +6454,7 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" dependencies = [ - "core-foundation-sys", + "core-foundation-sys 0.8.3", "libc", ] @@ -6202,7 +6528,7 @@ version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ - "indexmap", + "indexmap 1.9.3", "itoa 1.0.6", "ryu", "serde", @@ -6214,7 +6540,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d7b9ce5b0a63c6269b9623ed828b39259545a6ec0d8a35d6135ad6af6232add" dependencies = [ - "indexmap", + "indexmap 1.9.3", "itoa 0.4.8", "ryu", "serde", @@ -6249,7 +6575,7 @@ version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" dependencies = [ - "indexmap", + "indexmap 1.9.3", "ryu", "serde", "yaml-rust", @@ -6623,7 +6949,7 @@ dependencies = [ "hex", "hkdf", "hmac 0.12.1", - "indexmap", + "indexmap 1.9.3", "itoa 1.0.6", "libc", "libsqlite3-sys", @@ -6774,6 +7100,56 @@ dependencies = [ "siphasher", ] +[[package]] +name = "symphonia" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e48dba70095f265fdb269b99619b95d04c89e619538138383e63310b14d941" +dependencies = [ + "lazy_static", + "symphonia-bundle-mp3", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f31d7fece546f1e6973011a9eceae948133bbd18fd3d52f6073b1e38ae6368a" +dependencies = [ + "bitflags", + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-core" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c73eb88fee79705268cc7b742c7bc93a7b76e092ab751d0833866970754142" +dependencies = [ + "arrayvec 0.7.2", + "bitflags", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89c3e1937e31d0e068bbe829f66b2f2bfaa28d056365279e0ef897172c3320c0" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + [[package]] name = "syn" version = "1.0.109" @@ -6819,7 +7195,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a902e9050fca0a5d6877550b769abd2bd1ce8c04634b941dbe2809735e1a1e33" dependencies = [ "cfg-if 1.0.0", - "core-foundation-sys", + "core-foundation-sys 0.8.3", "libc", "ntapi 0.4.1", "once_cell", @@ -6988,7 +7364,7 @@ dependencies = [ "anyhow", "fs", "gpui", - "indexmap", + "indexmap 1.9.3", "parking_lot 0.11.2", "schemars", "serde", @@ -7294,6 +7670,23 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" + +[[package]] +name = "toml_edit" +version = "0.19.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266f016b7f039eec8a1a80dfe6156b633d208b9fccca5e4db1d6775b0c4e34a7" +dependencies = [ + "indexmap 2.0.0", + "toml_datetime", + "winnow", +] + [[package]] name = "tonic" version = "0.6.2" @@ -7333,7 +7726,7 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", - "indexmap", + "indexmap 1.9.3", "pin-project", "pin-project-lite 0.2.9", "rand 0.8.5", @@ -8190,7 +8583,7 @@ version = "0.85.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "570460c58b21e9150d2df0eaaedbb7816c34bcec009ae0dcc976e40ba81463e7" dependencies = [ - "indexmap", + "indexmap 1.9.3", ] [[package]] @@ -8204,7 +8597,7 @@ dependencies = [ "backtrace", "bincode", "cfg-if 1.0.0", - "indexmap", + "indexmap 1.9.3", "lazy_static", "libc", "log", @@ -8278,7 +8671,7 @@ dependencies = [ "anyhow", "cranelift-entity", "gimli 0.26.2", - "indexmap", + "indexmap 1.9.3", "log", "more-asserts", "object 0.28.4", @@ -8348,7 +8741,7 @@ dependencies = [ "backtrace", "cc", "cfg-if 1.0.0", - "indexmap", + "indexmap 1.9.3", "libc", "log", "mach", @@ -8604,6 +8997,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows" version = "0.48.0" @@ -8760,6 +9162,15 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "winnow" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.10.1" @@ -8949,7 +9360,7 @@ dependencies = [ "gpui", "ignore", "image", - "indexmap", + "indexmap 1.9.3", "install_cli", "isahc", "journal", diff --git a/crates/call/Cargo.toml b/crates/call/Cargo.toml index 4e83b552fb..86ff1a5543 100644 --- a/crates/call/Cargo.toml +++ b/crates/call/Cargo.toml @@ -30,6 +30,7 @@ media = { path = "../media" } project = { path = "../project" } settings = { path = "../settings" } util = { path = "../util" } +rodio = "0.17.1" anyhow.workspace = true async-broadcast = "0.4" diff --git a/crates/call/src/call.rs b/crates/call/src/call.rs index 0a8f150194..42cb5f2f87 100644 --- a/crates/call/src/call.rs +++ b/crates/call/src/call.rs @@ -1,24 +1,32 @@ +mod assets; pub mod participant; pub mod room; use std::sync::Arc; use anyhow::{anyhow, Result}; +use assets::SoundRegistry; use client::{proto, Client, TypedEnvelope, User, UserStore}; use collections::HashSet; use futures::{future::Shared, FutureExt}; use postage::watch; use gpui::{ - AppContext, AsyncAppContext, Entity, ModelContext, ModelHandle, Subscription, Task, - WeakModelHandle, + AppContext, AssetSource, AsyncAppContext, Entity, ModelContext, ModelHandle, Subscription, + Task, WeakModelHandle, }; use project::Project; pub use participant::ParticipantLocation; pub use room::Room; -pub fn init(client: Arc, user_store: ModelHandle, cx: &mut AppContext) { +pub fn init( + client: Arc, + user_store: ModelHandle, + source: impl AssetSource, + cx: &mut AppContext, +) { + cx.set_global(SoundRegistry::new(source)); let active_call = cx.add_model(|cx| ActiveCall::new(client, user_store, cx)); cx.set_global(active_call); } diff --git a/crates/call/src/room.rs b/crates/call/src/room.rs index da298f9ca2..b80e994fcf 100644 --- a/crates/call/src/room.rs +++ b/crates/call/src/room.rs @@ -1,4 +1,5 @@ use crate::{ + assets::SoundRegistry, participant::{LocalParticipant, ParticipantLocation, RemoteParticipant, RemoteVideoTrack}, IncomingCall, }; @@ -18,11 +19,30 @@ use live_kit_client::{ }; use postage::stream::Stream; use project::Project; +use rodio::{OutputStream, OutputStreamHandle, Source}; use std::{future::Future, mem, pin::Pin, sync::Arc, time::Duration}; use util::{post_inc, ResultExt, TryFutureExt}; pub const RECONNECT_TIMEOUT: Duration = Duration::from_secs(30); +enum Sound { + Joined, + Leaved, + Mute, + Unmute, +} + +impl Sound { + fn file(&self) -> &'static str { + match self { + Self::Joined => "joined", + Self::Leaved => "leave", + Self::Mute => "mute", + Self::Unmute => "unmute", + } + } +} + #[derive(Clone, Debug, PartialEq, Eq)] pub enum Event { ParticipantLocationChanged { @@ -48,6 +68,8 @@ pub enum Event { pub struct Room { id: u64, live_kit: Option, + _sound_output_stream: Option, + sound_output_handle: Option, status: RoomStatus, shared_projects: HashSet>, joined_projects: HashSet>, @@ -176,9 +198,14 @@ impl Room { let maintain_connection = cx.spawn_weak(|this, cx| Self::maintain_connection(this, client.clone(), cx).log_err()); + let (sound_output_stream, sound_output_handle) = + OutputStream::try_default().log_err().unzip(); + Self { id, live_kit: live_kit_room, + _sound_output_stream: sound_output_stream, + sound_output_handle, status: RoomStatus::Online, shared_projects: Default::default(), joined_projects: Default::default(), @@ -910,6 +937,18 @@ impl Room { }) } + fn play_sound(&self, sound: Sound, cx: &AppContext) { + let Some(output_handle) = self.sound_output_handle.as_ref() else { + return; + }; + + let Some(source) = SoundRegistry::global(cx).get(sound.file()) else { + return; + }; + + output_handle.play_raw(source.convert_samples()).log_err(); + } + pub fn join_project( &mut self, id: u64, @@ -922,6 +961,9 @@ impl Room { cx.spawn(|this, mut cx| async move { let project = Project::remote(id, client, user_store, language_registry, fs, cx.clone()).await?; + + cx.read(|cx| this.read(cx).play_sound(Sound::Joined, cx)); + this.update(&mut cx, |this, cx| { this.joined_projects.retain(|project| { if let Some(project) = project.upgrade(cx) { diff --git a/crates/collab/src/tests.rs b/crates/collab/src/tests.rs index b51c5240a8..5906eecee1 100644 --- a/crates/collab/src/tests.rs +++ b/crates/collab/src/tests.rs @@ -203,7 +203,7 @@ impl TestServer { language::init(cx); editor::init_settings(cx); workspace::init(app_state.clone(), cx); - call::init(client.clone(), user_store.clone(), cx); + call::init(client.clone(), user_store.clone(), (), cx); }); client diff --git a/crates/zed/src/assets.rs b/crates/zed/src/assets.rs index 6eb8a44f0f..574016c25d 100644 --- a/crates/zed/src/assets.rs +++ b/crates/zed/src/assets.rs @@ -7,6 +7,7 @@ use rust_embed::RustEmbed; #[include = "fonts/**/*"] #[include = "icons/**/*"] #[include = "themes/**/*"] +#[include = "sounds/**/*"] #[include = "*.md"] #[exclude = "*.DS_Store"] pub struct Assets; diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 31a00cb916..0fb540ece6 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -190,7 +190,7 @@ fn main() { theme_selector::init(cx); activity_indicator::init(cx); language_tools::init(cx); - call::init(app_state.client.clone(), app_state.user_store.clone(), cx); + call::init(app_state.client.clone(), app_state.user_store.clone(), Assets, cx); collab_ui::init(&app_state, cx); feedback::init(cx); welcome::init(cx); diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index a7c6956a34..9d75ad9952 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -2160,7 +2160,7 @@ mod tests { state.initialize_workspace = initialize_workspace; state.build_window_options = build_window_options; theme::init((), cx); - call::init(app_state.client.clone(), app_state.user_store.clone(), cx); + call::init(app_state.client.clone(), app_state.user_store.clone(), (), cx); workspace::init(app_state.clone(), cx); Project::init_settings(cx); language::init(cx); From 525521eeb39ccb97f3f8ecba72e0d3e5aeb66f01 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Sat, 1 Jul 2023 01:38:36 +0200 Subject: [PATCH 041/104] Render match count next to branch label --- crates/collab_ui/src/branch_list.rs | 93 ++++++++++++++++------------- crates/picker/src/picker.rs | 10 +++- 2 files changed, 58 insertions(+), 45 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 0abe83f766..8c06326780 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -1,6 +1,8 @@ use anyhow::{anyhow, bail}; use fuzzy::{StringMatch, StringMatchCandidate}; -use gpui::{elements::*, AppContext, MouseState, Task, ViewContext, ViewHandle}; +use gpui::{ + elements::*, platform::MouseButton, AppContext, MouseState, Task, ViewContext, ViewHandle, +}; use picker::{Picker, PickerDelegate, PickerEvent}; use std::{ops::Not, sync::Arc}; use util::ResultExt; @@ -210,50 +212,55 @@ impl PickerDelegate for BranchListDelegate { .with_height(theme.contact_finder.row_height) .into_any() } - fn render_header(&self, cx: &AppContext) -> Option>> { + fn render_header( + &self, + cx: &mut ViewContext>, + ) -> Option>> { let theme = &theme::current(cx); let style = theme.picker.header.clone(); - if self.last_query.is_empty() { - Some( - Stack::new() - .with_child( - Flex::row() - .with_child(Label::new("Recent branches", style.label.clone())) - .contained() - .with_style(style.container) - .into_any(), - ) - .contained() - .with_style(style.container) - .into_any(), - ) + let label = if self.last_query.is_empty() { + Stack::new() + .with_child( + Flex::row() + .with_child(Label::new("Recent branches", style.label.clone())) + .contained() + .with_style(style.container) + .into_any(), + ) + .contained() + .with_style(style.container) + .into_any() } else { - Some( - Stack::new() - .with_child( - Flex::row() - .with_child( - Label::new("Branches", style.label.clone()).aligned().left(), - ) - .contained() - .with_style(style.container), - ) - .with_children(self.matches.is_empty().not().then(|| { - let suffix = if self.matches.len() == 1 { "" } else { "es" }; - Flex::row() - .align_children_center() - .with_child(Label::new( - format!("{} match{}", self.matches.len(), suffix), - style.label, - )) - .aligned() - .right() - })) - .contained() - .with_style(style.container) - .constrained() - .into_any(), - ) - } + Stack::new() + .with_child( + Flex::row() + .with_child(Label::new("Branches", style.label.clone()).aligned().left()) + .contained() + .with_style(style.container), + ) + .with_children(self.matches.is_empty().not().then(|| { + let suffix = if self.matches.len() == 1 { "" } else { "es" }; + Flex::row() + .align_children_center() + .with_child(Label::new( + format!("{} match{}", self.matches.len(), suffix), + style.label, + )) + .aligned() + .right() + })) + .contained() + .with_style(style.container) + .constrained() + .into_any() + }; + Some( + MouseEventHandler::::new(0, cx, move |_, _| label) + .on_click(MouseButton::Left, move |_, _, _| {}) + .on_down_out(MouseButton::Left, move |_, _, cx| { + cx.emit(PickerEvent::Dismiss) + }) + .into_any(), + ) } } diff --git a/crates/picker/src/picker.rs b/crates/picker/src/picker.rs index 33d6e84241..978d018ccf 100644 --- a/crates/picker/src/picker.rs +++ b/crates/picker/src/picker.rs @@ -45,10 +45,16 @@ pub trait PickerDelegate: Sized + 'static { fn center_selection_after_match_updates(&self) -> bool { false } - fn render_header(&self, _cx: &AppContext) -> Option>> { + fn render_header( + &self, + _cx: &mut ViewContext>, + ) -> Option>> { None } - fn render_footer(&self, _cx: &AppContext) -> Option>> { + fn render_footer( + &self, + _cx: &mut ViewContext>, + ) -> Option>> { None } } From 026ad191ebefce8234035295175e16ebe9263978 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Sat, 1 Jul 2023 01:49:00 +0200 Subject: [PATCH 042/104] Dismiss dropdowns on click out --- crates/collab_ui/src/collab_titlebar_item.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 0857b2b79a..ea90a879ce 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -385,7 +385,11 @@ impl CollabTitlebarItem { .with_height(theme.contacts_popover.height) }) .on_click(MouseButton::Left, |_, _, _| {}) - .on_down_out(MouseButton::Left, move |_, _, cx| cx.emit(())) + .on_down_out(MouseButton::Left, move |_, this, cx| { + this.branch_popover.take(); + cx.emit(()); + cx.notify(); + }) .into_any(); Overlay::new(child) @@ -415,7 +419,11 @@ impl CollabTitlebarItem { .with_height(theme.contacts_popover.height) }) .on_click(MouseButton::Left, |_, _, _| {}) - .on_down_out(MouseButton::Left, move |_, _, cx| cx.emit(())) + .on_down_out(MouseButton::Left, move |_, this, cx| { + this.project_popover.take(); + cx.emit(()); + cx.notify(); + }) .into_any(); Overlay::new(child) From e36d5f41c8a29bbb81ae683fa262251c3f103e41 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Fri, 30 Jun 2023 12:38:28 -0600 Subject: [PATCH 043/104] Fix % when on the last character of the line Contributes: zed-industries/community#682 --- crates/vim/src/motion.rs | 50 ++++++++++++++++++++++++- crates/vim/test_data/test_matching.json | 17 +++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 crates/vim/test_data/test_matching.json diff --git a/crates/vim/src/motion.rs b/crates/vim/src/motion.rs index e8084cb4be..07b095dd5e 100644 --- a/crates/vim/src/motion.rs +++ b/crates/vim/src/motion.rs @@ -525,10 +525,13 @@ fn matching(map: &DisplaySnapshot, display_point: DisplayPoint) -> DisplayPoint if line_end == point { line_end = map.max_point().to_point(map); } - line_end.column = line_end.column.saturating_sub(1); let line_range = map.prev_line_boundary(point).0..line_end; - let ranges = map.buffer_snapshot.bracket_ranges(line_range.clone()); + let visible_line_range = + line_range.start..Point::new(line_range.end.row, line_range.end.column.saturating_sub(1)); + let ranges = map + .buffer_snapshot + .bracket_ranges(visible_line_range.clone()); if let Some(ranges) = ranges { let line_range = line_range.start.to_offset(&map.buffer_snapshot) ..line_range.end.to_offset(&map.buffer_snapshot); @@ -697,4 +700,47 @@ mod test { final"}) .await } + + #[gpui::test] + async fn test_matching(cx: &mut gpui::TestAppContext) { + let mut cx = NeovimBackedTestContext::new(cx).await; + + cx.set_shared_state(indoc! {r"func ˇ(a string) { + do(something(with.and_arrays[0, 2])) + }"}) + .await; + cx.simulate_shared_keystrokes(["%"]).await; + cx.assert_shared_state(indoc! {r"func (a stringˇ) { + do(something(with.and_arrays[0, 2])) + }"}) + .await; + + // test it works on the last character of the line + cx.set_shared_state(indoc! {r"func (a string) ˇ{ + do(something(with.and_arrays[0, 2])) + }"}) + .await; + cx.simulate_shared_keystrokes(["%"]).await; + cx.assert_shared_state(indoc! {r"func (a string) { + do(something(with.and_arrays[0, 2])) + ˇ}"}) + .await; + + // test it works on immediate nesting + cx.set_shared_state("ˇ{()}").await; + cx.simulate_shared_keystrokes(["%"]).await; + cx.assert_shared_state("{()ˇ}").await; + cx.simulate_shared_keystrokes(["%"]).await; + cx.assert_shared_state("ˇ{()}").await; + + // test it works on immediate nesting inside braces + cx.set_shared_state("{\n ˇ{()}\n}").await; + cx.simulate_shared_keystrokes(["%"]).await; + cx.assert_shared_state("{\n {()ˇ}\n}").await; + + // test it jumps to the next paren on a line + cx.set_shared_state("func ˇboop() {\n}").await; + cx.simulate_shared_keystrokes(["%"]).await; + cx.assert_shared_state("func boop(ˇ) {\n}").await; + } } diff --git a/crates/vim/test_data/test_matching.json b/crates/vim/test_data/test_matching.json new file mode 100644 index 0000000000..5c8d7529b9 --- /dev/null +++ b/crates/vim/test_data/test_matching.json @@ -0,0 +1,17 @@ +{"Put":{"state":"func ˇ(a string) {\n do(something(with.and_arrays[0, 2]))\n}"}} +{"Key":"%"} +{"Get":{"state":"func (a stringˇ) {\n do(something(with.and_arrays[0, 2]))\n}","mode":"Normal"}} +{"Put":{"state":"func (a string) ˇ{\ndo(something(with.and_arrays[0, 2]))\n}"}} +{"Key":"%"} +{"Get":{"state":"func (a string) {\ndo(something(with.and_arrays[0, 2]))\nˇ}","mode":"Normal"}} +{"Put":{"state":"ˇ{()}"}} +{"Key":"%"} +{"Get":{"state":"{()ˇ}","mode":"Normal"}} +{"Key":"%"} +{"Get":{"state":"ˇ{()}","mode":"Normal"}} +{"Put":{"state":"{\n ˇ{()}\n}"}} +{"Key":"%"} +{"Get":{"state":"{\n {()ˇ}\n}","mode":"Normal"}} +{"Put":{"state":"func ˇboop() {\n}"}} +{"Key":"%"} +{"Get":{"state":"func boop(ˇ) {\n}","mode":"Normal"}} From 43d4f043312407dd20923bc2d2cbec6771bfe217 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Mon, 3 Jul 2023 11:17:12 +0300 Subject: [PATCH 044/104] Do not add extra spaces to hints --- crates/editor/src/display_map/inlay_map.rs | 89 ++++++++++++++++++++++ crates/editor/src/editor.rs | 11 +-- 2 files changed, 90 insertions(+), 10 deletions(-) diff --git a/crates/editor/src/display_map/inlay_map.rs b/crates/editor/src/display_map/inlay_map.rs index affb75f58d..99b22dcbb6 100644 --- a/crates/editor/src/display_map/inlay_map.rs +++ b/crates/editor/src/display_map/inlay_map.rs @@ -49,6 +49,19 @@ pub struct InlayProperties { pub text: T, } +impl InlayProperties { + pub fn new(position: Anchor, hint: &project::InlayHint) -> Self { + let mut text = hint.text(); + if hint.padding_right && !text.ends_with(' ') { + text.push(' '); + } + if hint.padding_left && !text.starts_with(' ') { + text.insert(0, ' '); + } + Self { position, text } + } +} + impl sum_tree::Item for Transform { type Summary = TransformSummary; @@ -1095,6 +1108,7 @@ mod tests { use super::*; use crate::{InlayId, MultiBuffer}; use gpui::AppContext; + use project::{InlayHint, InlayHintLabel}; use rand::prelude::*; use settings::SettingsStore; use std::{cmp::Reverse, env, sync::Arc}; @@ -1102,6 +1116,81 @@ mod tests { use text::Patch; use util::post_inc; + #[test] + fn test_inlay_properties_label_padding() { + assert_eq!( + InlayProperties::new( + Anchor::min(), + &InlayHint { + label: InlayHintLabel::String("a".to_string()), + buffer_id: 0, + position: text::Anchor::default(), + padding_left: false, + padding_right: false, + tooltip: None, + kind: None, + }, + ) + .text, + "a", + "Should not pad label if not requested" + ); + + assert_eq!( + InlayProperties::new( + Anchor::min(), + &InlayHint { + label: InlayHintLabel::String("a".to_string()), + buffer_id: 0, + position: text::Anchor::default(), + padding_left: true, + padding_right: true, + tooltip: None, + kind: None, + }, + ) + .text, + " a ", + "Should pad label for every side requested" + ); + + assert_eq!( + InlayProperties::new( + Anchor::min(), + &InlayHint { + label: InlayHintLabel::String(" a ".to_string()), + buffer_id: 0, + position: text::Anchor::default(), + padding_left: false, + padding_right: false, + tooltip: None, + kind: None, + }, + ) + .text, + " a ", + "Should not change already padded label" + ); + + assert_eq!( + InlayProperties::new( + Anchor::min(), + &InlayHint { + label: InlayHintLabel::String(" a ".to_string()), + buffer_id: 0, + position: text::Anchor::default(), + padding_left: true, + padding_right: true, + tooltip: None, + kind: None, + }, + ) + .text, + " a ", + "Should not change already padded label" + ); + } + #[gpui::test] fn test_basic_inlays(cx: &mut AppContext) { let buffer = MultiBuffer::build_simple("abcdefghi", cx); diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 81f073ed62..016b2c7a28 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -2712,16 +2712,7 @@ impl Editor { let buffer = self.buffer.read(cx).read(cx); let new_inlays = to_insert .into_iter() - .map(|(position, id, hint)| { - let mut text = hint.text(); - if hint.padding_right { - text.push(' '); - } - if hint.padding_left { - text.insert(0, ' '); - } - (id, InlayProperties { position, text }) - }) + .map(|(position, id, hint)| (id, InlayProperties::new(position, &hint))) .collect(); drop(buffer); self.display_map.update(cx, |display_map, cx| { From 4eedc3e6464564ab536c7cd1470a6c3262ccf4f1 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Mon, 3 Jul 2023 16:15:41 +0200 Subject: [PATCH 045/104] Remove flex from underneath the pickers --- crates/collab_ui/src/collab_titlebar_item.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index ea90a879ce..1a4869a583 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -377,8 +377,8 @@ impl CollabTitlebarItem { let theme = theme::current(cx).clone(); let child = ChildView::new(child, cx); let child = MouseEventHandler::::new(0, cx, |_, _| { - Flex::column() - .with_child(child.flex(1., true)) + child + .flex(1., true) .contained() .constrained() .with_width(theme.contacts_popover.width) @@ -390,6 +390,7 @@ impl CollabTitlebarItem { cx.emit(()); cx.notify(); }) + .contained() .into_any(); Overlay::new(child) @@ -411,8 +412,8 @@ impl CollabTitlebarItem { let theme = theme::current(cx).clone(); let child = ChildView::new(child, cx); let child = MouseEventHandler::::new(0, cx, |_, _| { - Flex::column() - .with_child(child.flex(1., true)) + child + .flex(1., true) .contained() .constrained() .with_width(theme.contacts_popover.width) From 85701c9b80e2addbb7eb11e9fdafa1a9517f2c3a Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Mon, 3 Jul 2023 17:05:45 +0300 Subject: [PATCH 046/104] Do not perform OnTypeFormating after pair brace insert Co-Authored-By: Julia Risley --- crates/editor/src/editor.rs | 6 +- crates/editor/src/editor_tests.rs | 105 ++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 2 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 016b2c7a28..992ecd7459 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -2026,6 +2026,7 @@ impl Editor { } let selections = self.selections.all_adjusted(cx); + let mut brace_inserted = false; let mut edits = Vec::new(); let mut new_selections = Vec::with_capacity(selections.len()); let mut new_autoclose_regions = Vec::new(); @@ -2084,6 +2085,7 @@ impl Editor { selection.range(), format!("{}{}", text, bracket_pair.end).into(), )); + brace_inserted = true; continue; } } @@ -2110,6 +2112,7 @@ impl Editor { selection.end..selection.end, bracket_pair.end.as_str().into(), )); + brace_inserted = true; new_selections.push(( Selection { id: selection.id, @@ -2177,8 +2180,7 @@ impl Editor { let had_active_copilot_suggestion = this.has_active_copilot_suggestion(cx); this.change_selections(Some(Autoscroll::fit()), cx, |s| s.select(new_selections)); - // When buffer contents is updated and caret is moved, try triggering on type formatting. - if settings::get::(cx).use_on_type_format { + if !brace_inserted && settings::get::(cx).use_on_type_format { if let Some(on_type_format_task) = this.trigger_on_type_formatting(text.to_string(), cx) { diff --git a/crates/editor/src/editor_tests.rs b/crates/editor/src/editor_tests.rs index 657a7a744e..9e726d6cc4 100644 --- a/crates/editor/src/editor_tests.rs +++ b/crates/editor/src/editor_tests.rs @@ -6979,6 +6979,111 @@ async fn test_copilot_disabled_globs( assert!(copilot_requests.try_next().is_ok()); } +#[gpui::test] +async fn test_on_type_formatting_not_triggered(cx: &mut gpui::TestAppContext) { + init_test(cx, |_| {}); + + let mut language = Language::new( + LanguageConfig { + name: "Rust".into(), + path_suffixes: vec!["rs".to_string()], + brackets: BracketPairConfig { + pairs: vec![BracketPair { + start: "{".to_string(), + end: "}".to_string(), + close: true, + newline: true, + }], + disabled_scopes_by_bracket_ix: Vec::new(), + }, + ..Default::default() + }, + Some(tree_sitter_rust::language()), + ); + let mut fake_servers = language + .set_fake_lsp_adapter(Arc::new(FakeLspAdapter { + capabilities: lsp::ServerCapabilities { + document_on_type_formatting_provider: Some(lsp::DocumentOnTypeFormattingOptions { + first_trigger_character: "{".to_string(), + more_trigger_character: None, + }), + ..Default::default() + }, + ..Default::default() + })) + .await; + + let fs = FakeFs::new(cx.background()); + fs.insert_tree( + "/a", + json!({ + "main.rs": "fn main() { let a = 5; }", + "other.rs": "// Test file", + }), + ) + .await; + let project = Project::test(fs, ["/a".as_ref()], cx).await; + project.update(cx, |project, _| project.languages().add(Arc::new(language))); + let (_, workspace) = cx.add_window(|cx| Workspace::test_new(project.clone(), cx)); + let worktree_id = workspace.update(cx, |workspace, cx| { + workspace.project().read_with(cx, |project, cx| { + project.worktrees(cx).next().unwrap().read(cx).id() + }) + }); + + let buffer = project + .update(cx, |project, cx| { + project.open_local_buffer("/a/main.rs", cx) + }) + .await + .unwrap(); + cx.foreground().run_until_parked(); + cx.foreground().start_waiting(); + let fake_server = fake_servers.next().await.unwrap(); + let editor_handle = workspace + .update(cx, |workspace, cx| { + workspace.open_path((worktree_id, "main.rs"), None, true, cx) + }) + .await + .unwrap() + .downcast::() + .unwrap(); + + fake_server.handle_request::(|params, _| async move { + assert_eq!( + params.text_document_position.text_document.uri, + lsp::Url::from_file_path("/a/main.rs").unwrap(), + ); + assert_eq!( + params.text_document_position.position, + lsp::Position::new(0, 21), + ); + + Ok(Some(vec![lsp::TextEdit { + new_text: "]".to_string(), + range: lsp::Range::new(lsp::Position::new(0, 22), lsp::Position::new(0, 22)), + }])) + }); + + editor_handle.update(cx, |editor, cx| { + cx.focus(&editor_handle); + editor.change_selections(None, cx, |s| { + s.select_ranges([Point::new(0, 21)..Point::new(0, 20)]) + }); + editor.handle_input("{", cx); + }); + + cx.foreground().run_until_parked(); + + buffer.read_with(cx, |buffer, _| { + assert_eq!( + buffer.text(), + "fn main() { let a = {5}; }", + "No extra braces from on type formatting should appear in the buffer" + ) + }); +} + fn empty_range(row: usize, column: usize) -> Range { let point = DisplayPoint::new(row as u32, column as u32); point..point From 14eab4e94fae61b860bba70c8e74ba979bbf53c4 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Mon, 3 Jul 2023 19:22:43 +0200 Subject: [PATCH 047/104] branch list: dismiss correct window on PickerEvent. Query proper window --- crates/collab_ui/src/branch_list.rs | 18 ++++++++---------- crates/collab_ui/src/collab_titlebar_item.rs | 2 +- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 8c06326780..e0f85aa65a 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -60,24 +60,24 @@ impl PickerDelegate for BranchListDelegate { .read_with(&mut cx, |view, cx| { let delegate = view.delegate(); let project = delegate.workspace.read(cx).project().read(&cx); - let mut cwd = project + let mut cwd = + project .visible_worktrees(cx) .next() .unwrap() .read(cx) - .root_entry() - .unwrap() - .path + .abs_path() .to_path_buf(); cwd.push(".git"); let Some(repo) = project.fs().open_repo(&cwd) else {bail!("Project does not have associated git repository.")}; let mut branches = repo .lock() .branches()?; - if query.is_empty() { - const RECENT_BRANCHES_COUNT: usize = 10; + const RECENT_BRANCHES_COUNT: usize = 10; + if query.is_empty() && branches.len() > RECENT_BRANCHES_COUNT { + // Truncate list of recent branches // Do a partial sort to show recent-ish branches first. - branches.select_nth_unstable_by(RECENT_BRANCHES_COUNT, |lhs, rhs| { + branches.select_nth_unstable_by(RECENT_BRANCHES_COUNT - 1, |lhs, rhs| { rhs.unix_timestamp.cmp(&lhs.unix_timestamp) }); branches.truncate(RECENT_BRANCHES_COUNT); @@ -145,9 +145,7 @@ impl PickerDelegate for BranchListDelegate { .next() .ok_or_else(|| anyhow!("There are no visisible worktrees."))? .read(cx) - .root_entry() - .ok_or_else(|| anyhow!("Worktree has no root entry."))? - .path + .abs_path() .to_path_buf(); cwd.push(".git"); let status = project diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 1a4869a583..8af3acf7be 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -444,7 +444,7 @@ impl CollabTitlebarItem { cx.subscribe(&view, |this, _, event, cx| { match event { PickerEvent::Dismiss => { - this.contacts_popover = None; + this.branch_popover = None; } } From b055f594b06bd0ad56dab64b24c5af613f538ddd Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Mon, 3 Jul 2023 12:50:17 -0600 Subject: [PATCH 048/104] vim: ctrl-c to exit visual mode Fixes: zed-industries/community#1447 Contributes: zed-industries/community#1089 --- assets/keymaps/vim.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json index afee6fcd2e..d019078834 100644 --- a/assets/keymaps/vim.json +++ b/assets/keymaps/vim.json @@ -305,6 +305,10 @@ "vim::PushOperator", "Replace" ], + "ctrl-c": [ + "vim::SwitchMode", + "Normal" + ], "> >": "editor::Indent", "< <": "editor::Outdent" } From fe57e04016c120eb83441b8722febed1f6b4984f Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Mon, 3 Jul 2023 12:55:41 -0600 Subject: [PATCH 049/104] vim: Allow ^ as a motion Fixes: zed-industries/community#856 --- assets/keymaps/vim.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json index d019078834..86e5b51f19 100644 --- a/assets/keymaps/vim.json +++ b/assets/keymaps/vim.json @@ -35,6 +35,7 @@ "l": "vim::Right", "right": "vim::Right", "$": "vim::EndOfLine", + "^": "vim::FirstNonWhitespace", "shift-g": "vim::EndOfDocument", "w": "vim::NextWordStart", "shift-w": [ @@ -165,7 +166,6 @@ "shift-a": "vim::InsertEndOfLine", "x": "vim::DeleteRight", "shift-x": "vim::DeleteLeft", - "^": "vim::FirstNonWhitespace", "o": "vim::InsertLineBelow", "shift-o": "vim::InsertLineAbove", "~": "vim::ChangeCase", From d2127825e3e2f16fc756344246a7c58448514c7a Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Mon, 3 Jul 2023 13:30:04 -0700 Subject: [PATCH 050/104] Add first-pass sound support to Zed --- Cargo.lock | 17 ++++- Cargo.toml | 1 + assets/sounds/joined.wav | Bin 0 -> 16142 bytes assets/sounds/leave.wav | Bin 0 -> 137188 bytes assets/sounds/mute.wav | Bin 0 -> 29314 bytes assets/sounds/unmute.wav | Bin 0 -> 133336 bytes crates/audio/Cargo.toml | 23 +++++++ crates/audio/src/assets.rs | 44 +++++++++++++ crates/audio/src/audio.rs | 59 +++++++++++++++++ crates/call/Cargo.toml | 2 +- crates/call/src/call.rs | 6 +- crates/call/src/room.rs | 128 +++++++++++++++++-------------------- crates/collab/Cargo.toml | 1 + crates/collab/src/tests.rs | 3 +- crates/zed/Cargo.toml | 1 + crates/zed/src/main.rs | 4 +- crates/zed/src/zed.rs | 3 +- 17 files changed, 213 insertions(+), 79 deletions(-) create mode 100644 assets/sounds/joined.wav create mode 100644 assets/sounds/leave.wav create mode 100644 assets/sounds/mute.wav create mode 100644 assets/sounds/unmute.wav create mode 100644 crates/audio/Cargo.toml create mode 100644 crates/audio/src/assets.rs create mode 100644 crates/audio/src/audio.rs diff --git a/Cargo.lock b/Cargo.lock index 6dcf614e08..07db6c0e7c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -612,6 +612,19 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "audio" +version = "0.1.0" +dependencies = [ + "anyhow", + "collections", + "gpui", + "log", + "parking_lot 0.11.2", + "rodio", + "util", +] + [[package]] name = "auto_update" version = "0.1.0" @@ -1028,6 +1041,7 @@ version = "0.1.0" dependencies = [ "anyhow", "async-broadcast", + "audio", "client", "collections", "fs", @@ -1039,7 +1053,6 @@ dependencies = [ "media", "postage", "project", - "rodio", "settings", "util", ] @@ -1392,6 +1405,7 @@ version = "0.15.0" dependencies = [ "anyhow", "async-tungstenite", + "audio", "axum", "axum-extra", "base64 0.13.1", @@ -9331,6 +9345,7 @@ dependencies = [ "async-recursion 0.3.2", "async-tar", "async-trait", + "audio", "auto_update", "backtrace", "breadcrumbs", diff --git a/Cargo.toml b/Cargo.toml index 26555f32cd..1708ccfc0a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ members = [ "crates/activity_indicator", "crates/ai", + "crates/audio", "crates/auto_update", "crates/breadcrumbs", "crates/call", diff --git a/assets/sounds/joined.wav b/assets/sounds/joined.wav new file mode 100644 index 0000000000000000000000000000000000000000..70cd41d16f9b21dcb46a0f91e7f446a4157f8239 GIT binary patch literal 16142 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 literal 0 HcmV?d00001 diff --git a/assets/sounds/leave.wav b/assets/sounds/leave.wav new file mode 100644 index 0000000000000000000000000000000000000000..27dcea38f450b6f4ff48abf6cc4346258c5aa17d GIT binary patch literal 137188 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μ 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 YArTP~3=9lh3=9mx`DrEPiAAXl0L5H08UO$Q literal 0 HcmV?d00001 diff --git a/assets/sounds/mute.wav b/assets/sounds/mute.wav new file mode 100644 index 0000000000000000000000000000000000000000..79023bdf62a26f08fcac73fa6a0aab11cb0fa9d1 GIT binary patch literal 29314 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

|95Bo|MwrmaTccZfB)@R{+|BJ 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 diff --git a/crates/audio/src/audio.rs b/crates/audio/src/audio.rs index 0216bf47be..233b0f62aa 100644 --- a/crates/audio/src/audio.rs +++ b/crates/audio/src/audio.rs @@ -15,15 +15,19 @@ pub enum Sound { Leave, Mute, Unmute, + StartScreenshare, + StopScreenshare, } impl Sound { fn file(&self) -> &'static str { match self { - Self::Joined => "joined", - Self::Leave => "leave", + Self::Joined => "joined_call", + Self::Leave => "leave_call", Self::Mute => "mute", Self::Unmute => "unmute", + Self::StartScreenshare => "start_screenshare", + Self::StopScreenshare => "stop_screenshare", } } } diff --git a/crates/call/src/room.rs b/crates/call/src/room.rs index eed73ba1b1..87e6faf988 100644 --- a/crates/call/src/room.rs +++ b/crates/call/src/room.rs @@ -1222,6 +1222,9 @@ impl Room { }; cx.notify(); } + + Audio::play_sound(Sound::StartScreenshare, cx); + Ok(()) } Err(error) => { @@ -1311,6 +1314,8 @@ impl Room { } => { live_kit.room.unpublish_track(track_publication); cx.notify(); + + Audio::play_sound(Sound::StopScreenshare, cx); Ok(()) } } From 25564ea0585120863ba80e8c58eacaa27fbf8c2a Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 5 Jul 2023 09:39:04 +0200 Subject: [PATCH 066/104] Introduce a `WindowContext::focus` method that implies the window id --- crates/context_menu/src/context_menu.rs | 3 +-- crates/gpui/src/app.rs | 9 +++------ crates/gpui/src/app/window.rs | 4 ++++ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/crates/context_menu/src/context_menu.rs b/crates/context_menu/src/context_menu.rs index 296f6bc04a..f58afab361 100644 --- a/crates/context_menu/src/context_menu.rs +++ b/crates/context_menu/src/context_menu.rs @@ -244,8 +244,7 @@ impl ContextMenu { let show_count = self.show_count; cx.defer(move |this, cx| { if cx.handle().is_focused(cx) && this.show_count == show_count { - let window_id = cx.window_id(); - (**cx).focus(window_id, this.previously_focused_view_id.take()); + (**cx).focus(this.previously_focused_view_id.take()); } }); } else { diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 20043a9093..fec2ca595b 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -2971,14 +2971,12 @@ impl<'a, 'b, V: View> ViewContext<'a, 'b, V> { } pub fn focus(&mut self, handle: &AnyViewHandle) { - self.window_context - .focus(handle.window_id, Some(handle.view_id)); + self.window_context.focus(Some(handle.view_id)); } pub fn focus_self(&mut self) { - let window_id = self.window_id; let view_id = self.view_id; - self.window_context.focus(window_id, Some(view_id)); + self.window_context.focus(Some(view_id)); } pub fn is_self_focused(&self) -> bool { @@ -2997,8 +2995,7 @@ impl<'a, 'b, V: View> ViewContext<'a, 'b, V> { } pub fn blur(&mut self) { - let window_id = self.window_id; - self.window_context.focus(window_id, None); + self.window_context.focus(None); } pub fn on_window_should_close(&mut self, mut callback: F) diff --git a/crates/gpui/src/app/window.rs b/crates/gpui/src/app/window.rs index 743f99ee62..4edfa5b284 100644 --- a/crates/gpui/src/app/window.rs +++ b/crates/gpui/src/app/window.rs @@ -1096,6 +1096,10 @@ impl<'a> WindowContext<'a> { self.window.focused_view_id } + pub fn focus(&mut self, view_id: Option) { + self.app_context.focus(self.window_id, view_id); + } + pub fn window_bounds(&self) -> WindowBounds { self.window.platform_window.bounds() } From a8602b2a0ce9d71593cddea0f8fdec3533aa1783 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 5 Jul 2023 09:39:56 +0200 Subject: [PATCH 067/104] Add `Modal::has_focus` and introduce a `ModalHandle` trait object --- crates/go_to_line/src/go_to_line.rs | 11 +++++++++++ crates/picker/src/picker.rs | 11 +++++++++++ crates/workspace/src/workspace.rs | 16 ++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/crates/go_to_line/src/go_to_line.rs b/crates/go_to_line/src/go_to_line.rs index 0b41ee6dca..769f2eda55 100644 --- a/crates/go_to_line/src/go_to_line.rs +++ b/crates/go_to_line/src/go_to_line.rs @@ -24,6 +24,7 @@ pub struct GoToLine { prev_scroll_position: Option, cursor_point: Point, max_point: Point, + has_focus: bool, } pub enum Event { @@ -57,6 +58,7 @@ impl GoToLine { prev_scroll_position: scroll_position, cursor_point, max_point, + has_focus: false, } } @@ -178,11 +180,20 @@ impl View for GoToLine { } fn focus_in(&mut self, _: AnyViewHandle, cx: &mut ViewContext) { + self.has_focus = true; cx.focus(&self.line_editor); } + + fn focus_out(&mut self, _: AnyViewHandle, _: &mut ViewContext) { + self.has_focus = false; + } } impl Modal for GoToLine { + fn has_focus(&self) -> bool { + self.has_focus + } + fn dismiss_on_event(event: &Self::Event) -> bool { matches!(event, Event::Dismissed) } diff --git a/crates/picker/src/picker.rs b/crates/picker/src/picker.rs index 33d6e84241..ac0f3b5a19 100644 --- a/crates/picker/src/picker.rs +++ b/crates/picker/src/picker.rs @@ -25,6 +25,7 @@ pub struct Picker { theme: Arc theme::Picker>>>, confirmed: bool, pending_update_matches: Task>, + has_focus: bool, } pub trait PickerDelegate: Sized + 'static { @@ -140,13 +141,22 @@ impl View for Picker { } fn focus_in(&mut self, _: AnyViewHandle, cx: &mut ViewContext) { + self.has_focus = true; if cx.is_self_focused() { cx.focus(&self.query_editor); } } + + fn focus_out(&mut self, _: AnyViewHandle, _: &mut ViewContext) { + self.has_focus = false; + } } impl Modal for Picker { + fn has_focus(&self) -> bool { + self.has_focus + } + fn dismiss_on_event(event: &Self::Event) -> bool { matches!(event, PickerEvent::Dismiss) } @@ -191,6 +201,7 @@ impl Picker { theme, confirmed: false, pending_update_matches: Task::ready(None), + has_focus: false, }; this.update_matches(String::new(), cx); this diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 066ea5f8a6..0a9b1f6c83 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -97,9 +97,25 @@ lazy_static! { } pub trait Modal: View { + fn has_focus(&self) -> bool; fn dismiss_on_event(event: &Self::Event) -> bool; } +trait ModalHandle { + fn as_any(&self) -> &AnyViewHandle; + fn has_focus(&self, cx: &WindowContext) -> bool; +} + +impl ModalHandle for ViewHandle { + fn as_any(&self) -> &AnyViewHandle { + self + } + + fn has_focus(&self, cx: &WindowContext) -> bool { + self.read(cx).has_focus() + } +} + #[derive(Clone, PartialEq)] pub struct RemoveWorktreeFromProject(pub WorktreeId); From 03a00df8b1f7addf1dacde7cdb3d63739561e8f8 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 5 Jul 2023 09:40:26 +0200 Subject: [PATCH 068/104] Restore focus to previously focused view when dismissing a modal --- crates/workspace/src/workspace.rs | 36 +++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 0a9b1f6c83..60aefe4213 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -482,7 +482,7 @@ pub enum Event { pub struct Workspace { weak_self: WeakViewHandle, remote_entity_subscription: Option, - modal: Option, + modal: Option, zoomed: Option, zoomed_position: Option, center: PaneGroup, @@ -511,6 +511,11 @@ pub struct Workspace { pane_history_timestamp: Arc, } +struct ActiveModal { + view: Box, + previously_focused_view_id: Option, +} + #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] pub struct ViewId { pub creator: PeerId, @@ -1498,8 +1503,10 @@ impl Workspace { cx.notify(); // Whatever modal was visible is getting clobbered. If its the same type as V, then return // it. Otherwise, create a new modal and set it as active. - let already_open_modal = self.modal.take().and_then(|modal| modal.downcast::()); - if let Some(already_open_modal) = already_open_modal { + if let Some(already_open_modal) = self + .dismiss_modal(cx) + .and_then(|modal| modal.downcast::()) + { cx.focus_self(); Some(already_open_modal) } else { @@ -1510,8 +1517,12 @@ impl Workspace { } }) .detach(); + let previously_focused_view_id = cx.focused_view_id(); cx.focus(&modal); - self.modal = Some(modal.into_any()); + self.modal = Some(ActiveModal { + view: Box::new(modal), + previously_focused_view_id, + }); None } } @@ -1519,13 +1530,20 @@ impl Workspace { pub fn modal(&self) -> Option> { self.modal .as_ref() - .and_then(|modal| modal.clone().downcast::()) + .and_then(|modal| modal.view.as_any().clone().downcast::()) } - pub fn dismiss_modal(&mut self, cx: &mut ViewContext) { - if self.modal.take().is_some() { - cx.focus(&self.active_pane); + pub fn dismiss_modal(&mut self, cx: &mut ViewContext) -> Option { + if let Some(modal) = self.modal.take() { + if let Some(previously_focused_view_id) = modal.previously_focused_view_id { + if modal.view.has_focus(cx) { + cx.window_context().focus(Some(previously_focused_view_id)); + } + } cx.notify(); + Some(modal.view.as_any().clone()) + } else { + None } } @@ -3512,7 +3530,7 @@ impl View for Workspace { ) })) .with_children(self.modal.as_ref().map(|modal| { - ChildView::new(modal, cx) + ChildView::new(modal.view.as_any(), cx) .contained() .with_style(theme.workspace.modal) .aligned() From d5f0df94f7a923da5259d8799851037862fd721c Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 5 Jul 2023 11:41:24 +0200 Subject: [PATCH 069/104] Support `assistant: quote selection` on multibuffers --- crates/ai/src/assistant.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/ai/src/assistant.rs b/crates/ai/src/assistant.rs index 9ca54e661a..2b4f733c80 100644 --- a/crates/ai/src/assistant.rs +++ b/crates/ai/src/assistant.rs @@ -1911,7 +1911,7 @@ impl ConversationEditor { let Some(panel) = workspace.panel::(cx) else { return; }; - let Some(editor) = workspace.active_item(cx).and_then(|item| item.downcast::()) else { + let Some(editor) = workspace.active_item(cx).and_then(|item| item.act_as::(cx)) else { return; }; From 64b77bfa8d194cfddfc8e8b98db0abf6b711e73f Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Wed, 5 Jul 2023 14:04:16 +0200 Subject: [PATCH 070/104] Remove stacks from branch list header Co-authored-by: Antonio --- crates/collab_ui/src/branch_list.rs | 29 +++++------------------------ 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index a1693fd6c4..25999bf995 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -217,25 +217,13 @@ impl PickerDelegate for BranchListDelegate { let theme = &theme::current(cx); let style = theme.picker.header.clone(); let label = if self.last_query.is_empty() { - Stack::new() - .with_child( - Flex::row() - .with_child(Label::new("Recent branches", style.label.clone())) - .contained() - .with_style(style.container) - .into_any(), - ) + Flex::row() + .with_child(Label::new("Recent branches", style.label.clone())) .contained() .with_style(style.container) - .into_any() } else { - Stack::new() - .with_child( - Flex::row() - .with_child(Label::new("Branches", style.label.clone()).aligned().left()) - .contained() - .with_style(style.container), - ) + Flex::row() + .with_child(Label::new("Branches", style.label.clone()).aligned().left()) .with_children(self.matches.is_empty().not().then(|| { let suffix = if self.matches.len() == 1 { "" } else { "es" }; Flex::row() @@ -249,14 +237,7 @@ impl PickerDelegate for BranchListDelegate { })) .contained() .with_style(style.container) - .constrained() - .into_any() }; - Some( - MouseEventHandler::::new(0, cx, move |_, _| label) - .on_click(MouseButton::Left, move |_, _, _| {}) - .on_down_out(MouseButton::Left, move |_, _, _| {}) - .into_any(), - ) + Some(label.into_any()) } } From 8b3b1a607458a41fb8c2a9a9bb4d671da81ff97e Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Wed, 5 Jul 2023 14:08:21 +0200 Subject: [PATCH 071/104] fixup! Remove stacks from branch list header --- crates/collab_ui/src/branch_list.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 25999bf995..229d1fdc29 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -1,8 +1,6 @@ use anyhow::{anyhow, bail}; use fuzzy::{StringMatch, StringMatchCandidate}; -use gpui::{ - elements::*, platform::MouseButton, AppContext, MouseState, Task, ViewContext, ViewHandle, -}; +use gpui::{elements::*, AppContext, MouseState, Task, ViewContext, ViewHandle}; use picker::{Picker, PickerDelegate, PickerEvent}; use std::{ops::Not, sync::Arc}; use util::ResultExt; From 6ba1c3071a53e566e9c0fdfd75326589e0fc6cb1 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Wed, 5 Jul 2023 15:23:56 +0300 Subject: [PATCH 072/104] Simplify inlay map data --- crates/editor/src/display_map/inlay_map.rs | 28 +++++++++++++--------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/crates/editor/src/display_map/inlay_map.rs b/crates/editor/src/display_map/inlay_map.rs index 99b22dcbb6..90e5c8a9ce 100644 --- a/crates/editor/src/display_map/inlay_map.rs +++ b/crates/editor/src/display_map/inlay_map.rs @@ -2,7 +2,7 @@ use crate::{ multi_buffer::{MultiBufferChunks, MultiBufferRows}, Anchor, InlayId, MultiBufferSnapshot, ToOffset, }; -use collections::{BTreeMap, BTreeSet, HashMap}; +use collections::{BTreeMap, BTreeSet}; use gpui::fonts::HighlightStyle; use language::{Chunk, Edit, Point, Rope, TextSummary}; use std::{ @@ -19,7 +19,6 @@ use super::TextHighlights; pub struct InlayMap { snapshot: InlaySnapshot, - inlays_by_id: HashMap, inlays: Vec, } @@ -381,7 +380,6 @@ impl InlayMap { ( Self { snapshot: snapshot.clone(), - inlays_by_id: HashMap::default(), inlays: Vec::new(), }, snapshot, @@ -531,13 +529,14 @@ impl InlayMap { let snapshot = &mut self.snapshot; let mut edits = BTreeSet::new(); - self.inlays.retain(|inlay| !to_remove.contains(&inlay.id)); - for inlay_id in to_remove { - if let Some(inlay) = self.inlays_by_id.remove(&inlay_id) { + self.inlays.retain(|inlay| { + let retain = !to_remove.contains(&inlay.id); + if !retain { let offset = inlay.position.to_offset(&snapshot.buffer); edits.insert(offset); } - } + retain + }); for (existing_id, properties) in to_insert { let inlay = Inlay { @@ -551,7 +550,6 @@ impl InlayMap { continue; } - self.inlays_by_id.insert(inlay.id, inlay.clone()); match self .inlays .binary_search_by(|probe| probe.position.cmp(&inlay.position, &snapshot.buffer)) @@ -627,7 +625,13 @@ impl InlayMap { }, )); } else { - to_remove.push(*self.inlays_by_id.keys().choose(rng).unwrap()); + to_remove.push( + self.inlays + .iter() + .choose(rng) + .map(|inlay| inlay.id) + .unwrap(), + ); } } log::info!("removing inlays: {:?}", to_remove); @@ -1478,8 +1482,10 @@ mod tests { ); // The inlays can be manually removed. - let (inlay_snapshot, _) = inlay_map - .splice::(inlay_map.inlays_by_id.keys().copied().collect(), Vec::new()); + let (inlay_snapshot, _) = inlay_map.splice::( + inlay_map.inlays.iter().map(|inlay| inlay.id).collect(), + Vec::new(), + ); assert_eq!(inlay_snapshot.text(), "abxJKLyDzefghi"); } From d7f6b5e1a07f645a22160df2f39f424d02d69998 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Wed, 5 Jul 2023 15:58:31 +0300 Subject: [PATCH 073/104] Remove InlayProperties --- crates/editor/src/display_map.rs | 7 +- crates/editor/src/display_map/inlay_map.rs | 167 ++++++++++----------- crates/editor/src/editor.rs | 41 +++-- crates/editor/src/inlay_hint_cache.rs | 28 ++-- 4 files changed, 117 insertions(+), 126 deletions(-) diff --git a/crates/editor/src/display_map.rs b/crates/editor/src/display_map.rs index 714dc74509..6e04833f17 100644 --- a/crates/editor/src/display_map.rs +++ b/crates/editor/src/display_map.rs @@ -20,7 +20,6 @@ use language::{ use std::{any::TypeId, fmt::Debug, num::NonZeroU32, ops::Range, sync::Arc}; use sum_tree::{Bias, TreeMap}; use tab_map::TabMap; -use text::Rope; use wrap_map::WrapMap; pub use block_map::{ @@ -28,7 +27,7 @@ pub use block_map::{ BlockDisposition, BlockId, BlockProperties, BlockStyle, RenderBlock, TransformBlock, }; -pub use self::inlay_map::{Inlay, InlayProperties}; +pub use self::inlay_map::Inlay; #[derive(Copy, Clone, Debug, PartialEq, Eq)] pub enum FoldStatus { @@ -246,10 +245,10 @@ impl DisplayMap { self.inlay_map.current_inlays() } - pub fn splice_inlays>( + pub fn splice_inlays( &mut self, to_remove: Vec, - to_insert: Vec<(InlayId, InlayProperties)>, + to_insert: Vec, cx: &mut ModelContext, ) { if to_remove.is_empty() && to_insert.is_empty() { diff --git a/crates/editor/src/display_map/inlay_map.rs b/crates/editor/src/display_map/inlay_map.rs index 90e5c8a9ce..6a59cecae8 100644 --- a/crates/editor/src/display_map/inlay_map.rs +++ b/crates/editor/src/display_map/inlay_map.rs @@ -4,7 +4,7 @@ use crate::{ }; use collections::{BTreeMap, BTreeSet}; use gpui::fonts::HighlightStyle; -use language::{Chunk, Edit, Point, Rope, TextSummary}; +use language::{Chunk, Edit, Point, TextSummary}; use std::{ any::TypeId, cmp, @@ -13,7 +13,7 @@ use std::{ vec, }; use sum_tree::{Bias, Cursor, SumTree}; -use text::Patch; +use text::{Patch, Rope}; use super::TextHighlights; @@ -42,14 +42,8 @@ pub struct Inlay { pub text: text::Rope, } -#[derive(Debug, Clone)] -pub struct InlayProperties { - pub position: Anchor, - pub text: T, -} - -impl InlayProperties { - pub fn new(position: Anchor, hint: &project::InlayHint) -> Self { +impl Inlay { + pub fn hint(id: usize, position: Anchor, hint: &project::InlayHint) -> Self { let mut text = hint.text(); if hint.padding_right && !text.ends_with(' ') { text.push(' '); @@ -57,7 +51,19 @@ impl InlayProperties { if hint.padding_left && !text.starts_with(' ') { text.insert(0, ' '); } - Self { position, text } + Self { + id: InlayId::Hint(id), + position, + text: text.into(), + } + } + + pub fn suggestion>(id: usize, position: Anchor, text: T) -> Self { + Self { + id: InlayId::Suggestion(id), + position, + text: text.into(), + } } } @@ -521,10 +527,10 @@ impl InlayMap { } } - pub fn splice>( + pub fn splice( &mut self, to_remove: Vec, - to_insert: Vec<(InlayId, InlayProperties)>, + to_insert: Vec, ) -> (InlaySnapshot, Vec) { let snapshot = &mut self.snapshot; let mut edits = BTreeSet::new(); @@ -538,28 +544,23 @@ impl InlayMap { retain }); - for (existing_id, properties) in to_insert { - let inlay = Inlay { - id: existing_id, - position: properties.position, - text: properties.text.into(), - }; - + for inlay_to_insert in to_insert { // Avoid inserting empty inlays. - if inlay.text.is_empty() { + if inlay_to_insert.text.is_empty() { continue; } - match self - .inlays - .binary_search_by(|probe| probe.position.cmp(&inlay.position, &snapshot.buffer)) - { + let offset = inlay_to_insert.position.to_offset(&snapshot.buffer); + match self.inlays.binary_search_by(|probe| { + probe + .position + .cmp(&inlay_to_insert.position, &snapshot.buffer) + }) { Ok(ix) | Err(ix) => { - self.inlays.insert(ix, inlay.clone()); + self.inlays.insert(ix, inlay_to_insert); } } - let offset = inlay.position.to_offset(&snapshot.buffer); edits.insert(offset); } @@ -617,13 +618,11 @@ impl InlayMap { } else { InlayId::Suggestion(post_inc(next_inlay_id)) }; - to_insert.push(( - inlay_id, - InlayProperties { - position: snapshot.buffer.anchor_at(position, bias), - text, - }, - )); + to_insert.push(Inlay { + id: inlay_id, + position: snapshot.buffer.anchor_at(position, bias), + text: text.into(), + }); } else { to_remove.push( self.inlays @@ -1123,7 +1122,8 @@ mod tests { #[test] fn test_inlay_properties_label_padding() { assert_eq!( - InlayProperties::new( + Inlay::hint( + 0, Anchor::min(), &InlayHint { label: InlayHintLabel::String("a".to_string()), @@ -1135,13 +1135,15 @@ mod tests { kind: None, }, ) - .text, + .text + .to_string(), "a", "Should not pad label if not requested" ); assert_eq!( - InlayProperties::new( + Inlay::hint( + 0, Anchor::min(), &InlayHint { label: InlayHintLabel::String("a".to_string()), @@ -1153,13 +1155,15 @@ mod tests { kind: None, }, ) - .text, + .text + .to_string(), " a ", "Should pad label for every side requested" ); assert_eq!( - InlayProperties::new( + Inlay::hint( + 0, Anchor::min(), &InlayHint { label: InlayHintLabel::String(" a ".to_string()), @@ -1171,13 +1175,15 @@ mod tests { kind: None, }, ) - .text, + .text + .to_string(), " a ", "Should not change already padded label" ); assert_eq!( - InlayProperties::new( + Inlay::hint( + 0, Anchor::min(), &InlayHint { label: InlayHintLabel::String(" a ".to_string()), @@ -1189,7 +1195,8 @@ mod tests { kind: None, }, ) - .text, + .text + .to_string(), " a ", "Should not change already padded label" ); @@ -1205,13 +1212,11 @@ mod tests { let (inlay_snapshot, _) = inlay_map.splice( Vec::new(), - vec![( - InlayId::Hint(post_inc(&mut next_inlay_id)), - InlayProperties { - position: buffer.read(cx).snapshot(cx).anchor_after(3), - text: "|123|", - }, - )], + vec![Inlay { + id: InlayId::Hint(post_inc(&mut next_inlay_id)), + position: buffer.read(cx).snapshot(cx).anchor_after(3), + text: "|123|".into(), + }], ); assert_eq!(inlay_snapshot.text(), "abc|123|defghi"); assert_eq!( @@ -1284,20 +1289,16 @@ mod tests { let (inlay_snapshot, _) = inlay_map.splice( Vec::new(), vec![ - ( - InlayId::Hint(post_inc(&mut next_inlay_id)), - InlayProperties { - position: buffer.read(cx).snapshot(cx).anchor_before(3), - text: "|123|", - }, - ), - ( - InlayId::Suggestion(post_inc(&mut next_inlay_id)), - InlayProperties { - position: buffer.read(cx).snapshot(cx).anchor_after(3), - text: "|456|", - }, - ), + Inlay { + id: InlayId::Hint(post_inc(&mut next_inlay_id)), + position: buffer.read(cx).snapshot(cx).anchor_before(3), + text: "|123|".into(), + }, + Inlay { + id: InlayId::Suggestion(post_inc(&mut next_inlay_id)), + position: buffer.read(cx).snapshot(cx).anchor_after(3), + text: "|456|".into(), + }, ], ); assert_eq!(inlay_snapshot.text(), "abx|123||456|yDzefghi"); @@ -1482,7 +1483,7 @@ mod tests { ); // The inlays can be manually removed. - let (inlay_snapshot, _) = inlay_map.splice::( + let (inlay_snapshot, _) = inlay_map.splice( inlay_map.inlays.iter().map(|inlay| inlay.id).collect(), Vec::new(), ); @@ -1499,27 +1500,21 @@ mod tests { let (inlay_snapshot, _) = inlay_map.splice( Vec::new(), vec![ - ( - InlayId::Hint(post_inc(&mut next_inlay_id)), - InlayProperties { - position: buffer.read(cx).snapshot(cx).anchor_before(0), - text: "|123|\n", - }, - ), - ( - InlayId::Hint(post_inc(&mut next_inlay_id)), - InlayProperties { - position: buffer.read(cx).snapshot(cx).anchor_before(4), - text: "|456|", - }, - ), - ( - InlayId::Suggestion(post_inc(&mut next_inlay_id)), - InlayProperties { - position: buffer.read(cx).snapshot(cx).anchor_before(7), - text: "\n|567|\n", - }, - ), + Inlay { + id: InlayId::Hint(post_inc(&mut next_inlay_id)), + position: buffer.read(cx).snapshot(cx).anchor_before(0), + text: "|123|\n".into(), + }, + Inlay { + id: InlayId::Hint(post_inc(&mut next_inlay_id)), + position: buffer.read(cx).snapshot(cx).anchor_before(4), + text: "|456|".into(), + }, + Inlay { + id: InlayId::Suggestion(post_inc(&mut next_inlay_id)), + position: buffer.read(cx).snapshot(cx).anchor_before(7), + text: "\n|567|\n".into(), + }, ], ); assert_eq!(inlay_snapshot.text(), "|123|\nabc\n|456|def\n|567|\n\nghi"); @@ -1609,7 +1604,7 @@ mod tests { (offset, inlay.clone()) }) .collect::>(); - let mut expected_text = Rope::from(buffer_snapshot.text().as_str()); + let mut expected_text = Rope::from(buffer_snapshot.text()); for (offset, inlay) in inlays.into_iter().rev() { expected_text.replace(offset..offset, &inlay.text.to_string()); } diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 992ecd7459..e979bd9c1e 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -190,6 +190,15 @@ pub enum InlayId { Hint(usize), } +impl InlayId { + fn id(&self) -> usize { + match self { + Self::Suggestion(id) => *id, + Self::Hint(id) => *id, + } + } +} + actions!( editor, [ @@ -2708,17 +2717,11 @@ impl Editor { fn splice_inlay_hints( &self, to_remove: Vec, - to_insert: Vec<(Anchor, InlayId, project::InlayHint)>, + to_insert: Vec, cx: &mut ViewContext, ) { - let buffer = self.buffer.read(cx).read(cx); - let new_inlays = to_insert - .into_iter() - .map(|(position, id, hint)| (id, InlayProperties::new(position, &hint))) - .collect(); - drop(buffer); self.display_map.update(cx, |display_map, cx| { - display_map.splice_inlays(to_remove, new_inlays, cx); + display_map.splice_inlays(to_remove, to_insert, cx); }); } @@ -3403,7 +3406,7 @@ impl Editor { } self.display_map.update(cx, |map, cx| { - map.splice_inlays::<&str>(vec![suggestion.id], Vec::new(), cx) + map.splice_inlays(vec![suggestion.id], Vec::new(), cx) }); cx.notify(); true @@ -3436,7 +3439,7 @@ impl Editor { fn take_active_copilot_suggestion(&mut self, cx: &mut ViewContext) -> Option { let suggestion = self.copilot_state.suggestion.take()?; self.display_map.update(cx, |map, cx| { - map.splice_inlays::<&str>(vec![suggestion.id], Default::default(), cx); + map.splice_inlays(vec![suggestion.id], Default::default(), cx); }); let buffer = self.buffer.read(cx).read(cx); @@ -3467,21 +3470,11 @@ impl Editor { to_remove.push(suggestion.id); } - let suggestion_inlay_id = InlayId::Suggestion(post_inc(&mut self.next_inlay_id)); - let to_insert = vec![( - suggestion_inlay_id, - InlayProperties { - position: cursor, - text: text.clone(), - }, - )]; + let suggestion_inlay = + Inlay::suggestion(post_inc(&mut self.next_inlay_id), cursor, text); + self.copilot_state.suggestion = Some(suggestion_inlay.clone()); self.display_map.update(cx, move |map, cx| { - map.splice_inlays(to_remove, to_insert, cx) - }); - self.copilot_state.suggestion = Some(Inlay { - id: suggestion_inlay_id, - position: cursor, - text, + map.splice_inlays(to_remove, vec![suggestion_inlay], cx) }); cx.notify(); } else { diff --git a/crates/editor/src/inlay_hint_cache.rs b/crates/editor/src/inlay_hint_cache.rs index 3f9f8e4288..a6ea3962d2 100644 --- a/crates/editor/src/inlay_hint_cache.rs +++ b/crates/editor/src/inlay_hint_cache.rs @@ -45,7 +45,7 @@ pub enum InvalidationStrategy { #[derive(Debug, Default)] pub struct InlaySplice { pub to_remove: Vec, - pub to_insert: Vec<(Anchor, InlayId, InlayHint)>, + pub to_insert: Vec, } struct UpdateTask { @@ -285,13 +285,13 @@ impl InlayHintCache { if !old_kinds.contains(&cached_hint.kind) && new_kinds.contains(&cached_hint.kind) { - to_insert.push(( + to_insert.push(Inlay::hint( + cached_hint_id.id(), multi_buffer_snapshot.anchor_in_excerpt( *excerpt_id, cached_hint.position, ), - *cached_hint_id, - cached_hint.clone(), + &cached_hint, )); } excerpt_cache.next(); @@ -307,11 +307,11 @@ impl InlayHintCache { for (cached_hint_id, maybe_missed_cached_hint) in excerpt_cache { let cached_hint_kind = maybe_missed_cached_hint.kind; if !old_kinds.contains(&cached_hint_kind) && new_kinds.contains(&cached_hint_kind) { - to_insert.push(( + to_insert.push(Inlay::hint( + cached_hint_id.id(), multi_buffer_snapshot .anchor_in_excerpt(*excerpt_id, maybe_missed_cached_hint.position), - *cached_hint_id, - maybe_missed_cached_hint.clone(), + &maybe_missed_cached_hint, )); } } @@ -657,18 +657,22 @@ async fn fetch_and_update_hints( for new_hint in new_update.add_to_cache { let new_hint_position = multi_buffer_snapshot .anchor_in_excerpt(query.excerpt_id, new_hint.position); - let new_inlay_id = InlayId::Hint(post_inc(&mut editor.next_inlay_id)); + let new_inlay_id = post_inc(&mut editor.next_inlay_id); if editor .inlay_hint_cache .allowed_hint_kinds .contains(&new_hint.kind) { - splice - .to_insert - .push((new_hint_position, new_inlay_id, new_hint.clone())); + splice.to_insert.push(Inlay::hint( + new_inlay_id, + new_hint_position, + &new_hint, + )); } - cached_excerpt_hints.hints.push((new_inlay_id, new_hint)); + cached_excerpt_hints + .hints + .push((InlayId::Hint(new_inlay_id), new_hint)); } cached_excerpt_hints From cc88bff1ff6d378429a61fa34bcd36caed05214e Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Wed, 5 Jul 2023 15:25:33 +0200 Subject: [PATCH 074/104] Fix click-through behaviour of git panel Co-authored-by: Antonio --- crates/gpui/src/app/window.rs | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/crates/gpui/src/app/window.rs b/crates/gpui/src/app/window.rs index 23fbb33fe1..a04aaf8a28 100644 --- a/crates/gpui/src/app/window.rs +++ b/crates/gpui/src/app/window.rs @@ -482,20 +482,19 @@ impl<'a> WindowContext<'a> { // If there is already clicked_button stored, don't replace it. if self.window.clicked_button.is_none() { - self.window.clicked_region_ids = self - .window - .mouse_regions - .iter() - .filter_map(|(region, _)| { - if region.bounds.contains_point(e.position) { - Some(region.id()) - } else { - None - } - }) - .collect(); + let window = &mut *self.window; + window.clicked_region_ids.clear(); - self.window.clicked_button = Some(e.button); + let mut highest_z_index = 0; + for (region, z_index) in window.mouse_regions.iter() { + if region.bounds.contains_point(e.position) && *z_index >= highest_z_index { + highest_z_index = *z_index; + window.clicked_region_ids.clear(); + window.clicked_region_ids.insert(region.id()); + } + } + + window.clicked_button = Some(e.button); } mouse_events.push(MouseEvent::Down(MouseDown { From 85add260f6fbde3d412dc8afa6ce60e65ac77413 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Wed, 5 Jul 2023 16:48:52 +0200 Subject: [PATCH 075/104] Track regions instead of clicks. Get rid of superfluous params in RenderParams related to hover & click state. Co-authored-by: Antonio --- crates/gpui/src/app.rs | 14 ++++++---- crates/gpui/src/app/window.rs | 49 ++++++++++++++++++----------------- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 20043a9093..dfd5fe7bb2 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -3304,11 +3304,15 @@ impl<'a, 'b, V: View> ViewContext<'a, 'b, V> { let region_id = MouseRegionId::new::(self.view_id, region_id); MouseState { hovered: self.window.hovered_region_ids.contains(®ion_id), - clicked: self - .window - .clicked_region_ids - .get(®ion_id) - .and_then(|_| self.window.clicked_button), + clicked: if let Some((clicked_region_id, button)) = self.window.clicked_region { + if region_id == clicked_region_id { + Some(button) + } else { + None + } + } else { + None + }, accessed_hovered: false, accessed_clicked: false, } diff --git a/crates/gpui/src/app/window.rs b/crates/gpui/src/app/window.rs index a04aaf8a28..5a77017a11 100644 --- a/crates/gpui/src/app/window.rs +++ b/crates/gpui/src/app/window.rs @@ -53,7 +53,7 @@ pub struct Window { last_mouse_moved_event: Option, pub(crate) hovered_region_ids: HashSet, pub(crate) clicked_region_ids: HashSet, - pub(crate) clicked_button: Option, + pub(crate) clicked_region: Option<(MouseRegionId, MouseButton)>, mouse_position: Vector2F, text_layout_cache: TextLayoutCache, } @@ -86,7 +86,7 @@ impl Window { last_mouse_moved_event: None, hovered_region_ids: Default::default(), clicked_region_ids: Default::default(), - clicked_button: None, + clicked_region: None, mouse_position: vec2f(0., 0.), titlebar_height, appearance, @@ -480,21 +480,32 @@ impl<'a> WindowContext<'a> { // specific ancestor element that contained both [positions]' // So we need to store the overlapping regions on mouse down. - // If there is already clicked_button stored, don't replace it. - if self.window.clicked_button.is_none() { - let window = &mut *self.window; - window.clicked_region_ids.clear(); + // If there is already region being clicked, don't replace it. + if self.window.clicked_region.is_none() { + self.window.clicked_region_ids = self + .window + .mouse_regions + .iter() + .filter_map(|(region, _)| { + if region.bounds.contains_point(e.position) { + Some(region.id()) + } else { + None + } + }) + .collect(); let mut highest_z_index = 0; - for (region, z_index) in window.mouse_regions.iter() { + let mut clicked_region_id = None; + for (region, z_index) in self.window.mouse_regions.iter() { if region.bounds.contains_point(e.position) && *z_index >= highest_z_index { highest_z_index = *z_index; - window.clicked_region_ids.clear(); - window.clicked_region_ids.insert(region.id()); + clicked_region_id = Some(region.id()); } } - window.clicked_button = Some(e.button); + self.window.clicked_region = + clicked_region_id.map(|region_id| (region_id, e.button)); } mouse_events.push(MouseEvent::Down(MouseDown { @@ -559,7 +570,7 @@ impl<'a> WindowContext<'a> { prev_mouse_position: self.window.mouse_position, platform_event: e.clone(), })); - } else if let Some(clicked_button) = self.window.clicked_button { + } else if let Some((_, clicked_button)) = self.window.clicked_region { // Mouse up event happened outside the current window. Simulate mouse up button event let button_event = e.to_button_event(clicked_button); mouse_events.push(MouseEvent::Up(MouseUp { @@ -682,8 +693,8 @@ impl<'a> WindowContext<'a> { // Only raise click events if the released button is the same as the one stored if self .window - .clicked_button - .map(|clicked_button| clicked_button == e.button) + .clicked_region + .map(|(_, clicked_button)| clicked_button == e.button) .unwrap_or(false) { // Clear clicked regions and clicked button @@ -691,7 +702,7 @@ impl<'a> WindowContext<'a> { &mut self.window.clicked_region_ids, Default::default(), ); - self.window.clicked_button = None; + self.window.clicked_region = None; // Find regions which still overlap with the mouse since the last MouseDown happened for (mouse_region, _) in self.window.mouse_regions.iter().rev() { @@ -866,18 +877,10 @@ impl<'a> WindowContext<'a> { } for view_id in &invalidation.updated { let titlebar_height = self.window.titlebar_height; - let hovered_region_ids = self.window.hovered_region_ids.clone(); - let clicked_region_ids = self - .window - .clicked_button - .map(|button| (self.window.clicked_region_ids.clone(), button)); - let element = self .render_view(RenderParams { view_id: *view_id, titlebar_height, - hovered_region_ids, - clicked_region_ids, refreshing: false, appearance, }) @@ -1182,8 +1185,6 @@ impl<'a> WindowContext<'a> { pub struct RenderParams { pub view_id: usize, pub titlebar_height: f32, - pub hovered_region_ids: HashSet, - pub clicked_region_ids: Option<(HashSet, MouseButton)>, pub refreshing: bool, pub appearance: Appearance, } From ec47464bba1e77379a0f3ca7b8cb169a9300b50b Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Wed, 5 Jul 2023 16:56:08 +0200 Subject: [PATCH 076/104] branch_list: Show match count on the right hand side of a header. Co-authored-by: Antonio --- crates/collab_ui/src/branch_list.rs | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index 229d1fdc29..16fefbd2eb 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -221,17 +221,14 @@ impl PickerDelegate for BranchListDelegate { .with_style(style.container) } else { Flex::row() - .with_child(Label::new("Branches", style.label.clone()).aligned().left()) + .with_child(Label::new("Branches", style.label.clone())) .with_children(self.matches.is_empty().not().then(|| { let suffix = if self.matches.len() == 1 { "" } else { "es" }; - Flex::row() - .align_children_center() - .with_child(Label::new( - format!("{} match{}", self.matches.len(), suffix), - style.label, - )) - .aligned() - .right() + Label::new( + format!("{} match{}", self.matches.len(), suffix), + style.label, + ) + .flex_float() })) .contained() .with_style(style.container) From 0e0d78df84f49b07f2b337985da235975c873943 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Wed, 5 Jul 2023 18:04:40 +0200 Subject: [PATCH 077/104] Do not render recent paths in toolbar's project switcher --- crates/recent_projects/src/recent_projects.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/crates/recent_projects/src/recent_projects.rs b/crates/recent_projects/src/recent_projects.rs index b3c9655645..4ba6103167 100644 --- a/crates/recent_projects/src/recent_projects.rs +++ b/crates/recent_projects/src/recent_projects.rs @@ -48,7 +48,7 @@ fn toggle( let workspace = cx.weak_handle(); cx.add_view(|cx| { RecentProjects::new( - RecentProjectsDelegate::new(workspace, workspace_locations), + RecentProjectsDelegate::new(workspace, workspace_locations, true), cx, ) .with_max_size(800., 1200.) @@ -69,8 +69,11 @@ pub fn build_recent_projects( workspaces: Vec, cx: &mut ViewContext, ) -> RecentProjects { - Picker::new(RecentProjectsDelegate::new(workspace, workspaces), cx) - .with_theme(|theme| theme.picker.clone()) + Picker::new( + RecentProjectsDelegate::new(workspace, workspaces, false), + cx, + ) + .with_theme(|theme| theme.picker.clone()) } pub type RecentProjects = Picker; @@ -80,18 +83,21 @@ pub struct RecentProjectsDelegate { workspace_locations: Vec, selected_match_index: usize, matches: Vec, + render_paths: bool, } impl RecentProjectsDelegate { fn new( workspace: WeakViewHandle, workspace_locations: Vec, + render_paths: bool, ) -> Self { Self { workspace, workspace_locations, selected_match_index: 0, matches: Default::default(), + render_paths, } } } @@ -197,6 +203,7 @@ impl PickerDelegate for RecentProjectsDelegate { highlighted_location .paths .into_iter() + .filter(|_| self.render_paths) .map(|highlighted_path| highlighted_path.render(style.label.clone())), ) .flex(1., false) From 1baa13561d374152a82c182da2b417e66a64280d Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Wed, 5 Jul 2023 12:50:56 -0400 Subject: [PATCH 078/104] Update project & git menus to be Toggleable> Co-Authored-By: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> --- crates/collab_ui/src/collab_titlebar_item.rs | 18 ++++++++++-------- crates/theme/src/theme.rs | 4 ++-- styles/src/style_tree/titlebar.ts | 9 +++++++-- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 3bc890f91b..c8f1d7cf30 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -221,17 +221,19 @@ impl CollabTitlebarItem { .as_ref() .and_then(RepositoryEntry::branch) .map(|branch| util::truncate_and_trailoff(&branch, MAX_BRANCH_NAME_LENGTH)); - let project_style = theme.titlebar.title.clone(); - let git_style = theme.titlebar.git_branch.clone(); + let project_style = theme.titlebar.project_menu_button.clone(); + let git_style = theme.titlebar.git_menu_button.clone(); let divider_style = theme.titlebar.project_name_divider.clone(); let item_spacing = theme.titlebar.item_spacing; let mut ret = Flex::row().with_child( Stack::new() .with_child( - MouseEventHandler::::new(0, cx, |_, _| { - Label::new(name, project_style.text.clone()) + MouseEventHandler::::new(0, cx, |mouse_state, _| { + let style = project_style.in_state(self.project_popover.is_some()).style_for(mouse_state); + Label::new(name, style.text.clone()) .contained() + .with_style(style.container) .aligned() .left() .into_any_named("title-project-name") @@ -241,8 +243,6 @@ impl CollabTitlebarItem { this.toggle_project_menu(&Default::default(), cx) }) .on_click(MouseButton::Left, move |_, _, _| {}) - .contained() - .with_style(project_style.container), ) .with_children(self.render_project_popover_host(&theme.titlebar, cx)), ); @@ -259,9 +259,11 @@ impl CollabTitlebarItem { .with_child( Stack::new() .with_child( - MouseEventHandler::::new(0, cx, |_, _| { - Label::new(git_branch, git_style.text) + MouseEventHandler::::new(0, cx, |mouse_state, _| { + let style = git_style.in_state(self.branch_popover.is_some()).style_for(mouse_state); + Label::new(git_branch, style.text.clone()) .contained() + .with_style(style.container.clone()) .with_margin_right(item_spacing) .aligned() .left() diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index a4fbcedd32..3a7924f36e 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -118,9 +118,9 @@ pub struct Titlebar { #[serde(flatten)] pub container: ContainerStyle, pub height: f32, - pub title: ContainedText, + pub project_menu_button: Toggleable>, pub project_name_divider: ContainedText, - pub git_branch: ContainedText, + pub git_menu_button: Toggleable>, pub item_spacing: f32, pub face_pile_spacing: f32, pub avatar_ribbon: AvatarRibbon, diff --git a/styles/src/style_tree/titlebar.ts b/styles/src/style_tree/titlebar.ts index 686f814a5d..109db8db20 100644 --- a/styles/src/style_tree/titlebar.ts +++ b/styles/src/style_tree/titlebar.ts @@ -173,9 +173,14 @@ export function titlebar(theme: ColorScheme): any { }, // Project - title: text(theme.lowest, "sans", "active"), project_name_divider: text(theme.lowest, "sans", "variant"), - git_branch: text(theme.lowest, "sans", "variant"), + + project_menu_button: toggleable_text_button(theme, { + color: 'base', + }), + git_menu_button: toggleable_text_button(theme, { + color: 'variant', + }), // Collaborators leader_avatar: { From b80281e556577c03c72027a45078aeaa0e5435c9 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Wed, 5 Jul 2023 18:57:06 +0200 Subject: [PATCH 079/104] cargo fmt --- crates/collab_ui/src/collab_titlebar_item.rs | 32 ++++++++++++-------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index c8f1d7cf30..73450e7c7d 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -230,7 +230,9 @@ impl CollabTitlebarItem { Stack::new() .with_child( MouseEventHandler::::new(0, cx, |mouse_state, _| { - let style = project_style.in_state(self.project_popover.is_some()).style_for(mouse_state); + let style = project_style + .in_state(self.project_popover.is_some()) + .style_for(mouse_state); Label::new(name, style.text.clone()) .contained() .with_style(style.container) @@ -242,7 +244,7 @@ impl CollabTitlebarItem { .on_down(MouseButton::Left, move |_, this, cx| { this.toggle_project_menu(&Default::default(), cx) }) - .on_click(MouseButton::Left, move |_, _, _| {}) + .on_click(MouseButton::Left, move |_, _, _| {}), ) .with_children(self.render_project_popover_host(&theme.titlebar, cx)), ); @@ -259,16 +261,22 @@ impl CollabTitlebarItem { .with_child( Stack::new() .with_child( - MouseEventHandler::::new(0, cx, |mouse_state, _| { - let style = git_style.in_state(self.branch_popover.is_some()).style_for(mouse_state); - Label::new(git_branch, style.text.clone()) - .contained() - .with_style(style.container.clone()) - .with_margin_right(item_spacing) - .aligned() - .left() - .into_any_named("title-project-branch") - }) + MouseEventHandler::::new( + 0, + cx, + |mouse_state, _| { + let style = git_style + .in_state(self.branch_popover.is_some()) + .style_for(mouse_state); + Label::new(git_branch, style.text.clone()) + .contained() + .with_style(style.container.clone()) + .with_margin_right(item_spacing) + .aligned() + .left() + .into_any_named("title-project-branch") + }, + ) .with_cursor_style(CursorStyle::PointingHand) .on_down(MouseButton::Left, move |_, this, cx| { this.toggle_vcs_menu(&Default::default(), cx) From 6a15ae9c01dcc771c2ed71b9eb14dfe05cc2a98f Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Wed, 5 Jul 2023 14:17:37 -0400 Subject: [PATCH 080/104] v0.95.x dev --- Cargo.lock | 2 +- crates/zed/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7e1407f2c0..a4fd323fe0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9339,7 +9339,7 @@ dependencies = [ [[package]] name = "zed" -version = "0.94.0" +version = "0.95.0" dependencies = [ "activity_indicator", "ai", diff --git a/crates/zed/Cargo.toml b/crates/zed/Cargo.toml index 97d7f717ce..d016525af4 100644 --- a/crates/zed/Cargo.toml +++ b/crates/zed/Cargo.toml @@ -3,7 +3,7 @@ authors = ["Nathan Sobo "] description = "The fast, collaborative code editor." edition = "2021" name = "zed" -version = "0.94.0" +version = "0.95.0" publish = false [lib] From 594b6e8d64b9019a42dbca7083a211fd65911b5f Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Wed, 5 Jul 2023 11:47:17 -0700 Subject: [PATCH 081/104] collab 0.16.0 --- Cargo.lock | 2 +- crates/collab/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a4fd323fe0..ac089cee18 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1401,7 +1401,7 @@ dependencies = [ [[package]] name = "collab" -version = "0.15.0" +version = "0.16.0" dependencies = [ "anyhow", "async-tungstenite", diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index cc7263aa97..cee5fd0989 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -3,7 +3,7 @@ authors = ["Nathan Sobo "] default-run = "collab" edition = "2021" name = "collab" -version = "0.15.0" +version = "0.16.0" publish = false [[bin]] From 8b8bafef228842d56e0b9c257ec975e24889a040 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Wed, 5 Jul 2023 12:05:16 -0700 Subject: [PATCH 082/104] Remove spurious audio depedency --- Cargo.lock | 1 - crates/collab/Cargo.toml | 1 - 2 files changed, 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ac089cee18..c6a67d47ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1405,7 +1405,6 @@ version = "0.16.0" dependencies = [ "anyhow", "async-tungstenite", - "audio", "axum", "axum-extra", "base64 0.13.1", diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index cee5fd0989..8bd86ed9ec 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -14,7 +14,6 @@ name = "seed" required-features = ["seed-support"] [dependencies] -audio = { path = "../audio" } collections = { path = "../collections" } live_kit_server = { path = "../live_kit_server" } rpc = { path = "../rpc" } From 801f41e68e79e47e2c05e75d0b17c9b3734644fd Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Wed, 5 Jul 2023 12:15:56 -0700 Subject: [PATCH 083/104] Move audio dependency to dev --- Cargo.lock | 1 + crates/collab/Cargo.toml | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index c6a67d47ef..ac089cee18 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1405,6 +1405,7 @@ version = "0.16.0" dependencies = [ "anyhow", "async-tungstenite", + "audio", "axum", "axum-extra", "base64 0.13.1", diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index 8bd86ed9ec..c61fdeebfb 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -57,6 +57,7 @@ tracing-log = "0.1.3" tracing-subscriber = { version = "0.3.11", features = ["env-filter", "json"] } [dev-dependencies] +audio = { path = "../audio" } collections = { path = "../collections", features = ["test-support"] } gpui = { path = "../gpui", features = ["test-support"] } call = { path = "../call", features = ["test-support"] } From f6c96ec8920b529d298691eac151db90c33c959e Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 6 Jul 2023 09:53:34 +0200 Subject: [PATCH 084/104] Fix panic when saved conversations directory changes We were updating the view's state but missed a `notify`, which caused the `UniformList` responsible for rendering the saved conversations to panic when some files were deleted. --- crates/ai/src/assistant.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/ai/src/assistant.rs b/crates/ai/src/assistant.rs index 2b4f733c80..4d300230e1 100644 --- a/crates/ai/src/assistant.rs +++ b/crates/ai/src/assistant.rs @@ -147,8 +147,9 @@ impl AssistantPanel { .await .log_err() .unwrap_or_default(); - this.update(&mut cx, |this, _| { - this.saved_conversations = saved_conversations + this.update(&mut cx, |this, cx| { + this.saved_conversations = saved_conversations; + cx.notify(); }) .ok(); } From 1936bdebb36b1c4c00abbb9930287449ca0202b3 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Thu, 6 Jul 2023 11:16:39 +0300 Subject: [PATCH 085/104] Use less padding for typescript parameter hints --- crates/project/src/lsp_command.rs | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index a3c6302e29..eec64beb5a 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -1822,11 +1822,21 @@ impl LspCommand for InlayHints { async fn response_from_lsp( self, message: Option>, - _: ModelHandle, + project: ModelHandle, buffer: ModelHandle, - _: LanguageServerId, - cx: AsyncAppContext, + server_id: LanguageServerId, + mut cx: AsyncAppContext, ) -> Result> { + let (lsp_adapter, _) = language_server_for_buffer(&project, &buffer, server_id, &mut cx)?; + // `typescript-language-server` adds padding to the left for type hints, turning + // `const foo: boolean` into `const foo : boolean` which looks odd. + // `rust-analyzer` does not have the padding for this case, and we have to accomodate both. + // + // We could trim the whole string, but being pessimistic on par with the situation above, + // there might be a hint with multiple whitespaces at the end(s) which we need to display properly. + // Hence let's use a heuristic first to handle the most awkward case and look for more. + let force_no_type_left_padding = + lsp_adapter.name.0.as_ref() == "typescript-language-server"; cx.read(|cx| { let origin_buffer = buffer.read(cx); Ok(message @@ -1840,6 +1850,12 @@ impl LspCommand for InlayHints { }); let position = origin_buffer .clip_point_utf16(point_from_lsp(lsp_hint.position), Bias::Left); + let padding_left = + if force_no_type_left_padding && kind == Some(InlayHintKind::Type) { + false + } else { + lsp_hint.padding_left.unwrap_or(false) + }; InlayHint { buffer_id: origin_buffer.remote_id(), position: if kind == Some(InlayHintKind::Parameter) { @@ -1847,7 +1863,7 @@ impl LspCommand for InlayHints { } else { origin_buffer.anchor_after(position) }, - padding_left: lsp_hint.padding_left.unwrap_or(false), + padding_left, padding_right: lsp_hint.padding_right.unwrap_or(false), label: match lsp_hint.label { lsp::InlayHintLabel::String(s) => InlayHintLabel::String(s), From 492b849ea1cec2285ac466f31dde26084021b3f6 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 6 Jul 2023 12:09:33 +0200 Subject: [PATCH 086/104] Do not render multiple hunks for the same line --- crates/editor/src/element.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 0a462b1e5d..2f69781aa1 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1057,6 +1057,7 @@ impl EditorElement { if layout.is_singleton && scrollbar_settings.selections { let start_anchor = Anchor::min(); let end_anchor = Anchor::max(); + let mut last_rendered_row_range = (-1., -1.); for (row, _) in &editor.background_highlights_in_range( start_anchor..end_anchor, &layout.position_map.snapshot, @@ -1069,6 +1070,11 @@ impl EditorElement { if end_y - start_y < 1. { end_y = start_y + 1.; } + if (start_y, end_y) == last_rendered_row_range { + skipped += 1; + continue; + } + last_rendered_row_range = (start_y, end_y); let bounds = RectF::from_points(vec2f(left, start_y), vec2f(right, end_y)); let color = scrollbar_theme.selections; From 0b0a161626d4d58f2afefaf24ceb9b38e1fbf8c8 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Thu, 6 Jul 2023 11:45:17 +0300 Subject: [PATCH 087/104] Show inlay hints on startup for every language server with work events Language servers such as typescript-language-servers report a single work event, ending right after server's startup. Other servers might send more similar event, also during startup. The rest of the events are diagnostic-related and we filter them out. React on such events with /refresh-like hint update, that will check only the visible part of the editor for hints and might be replaced by other /refresh requests, if needed. --- crates/editor/src/inlay_hint_cache.rs | 111 ++++++++++++++++++++++++++ crates/project/src/project.rs | 1 + 2 files changed, 112 insertions(+) diff --git a/crates/editor/src/inlay_hint_cache.rs b/crates/editor/src/inlay_hint_cache.rs index a6ea3962d2..9ca94665c2 100644 --- a/crates/editor/src/inlay_hint_cache.rs +++ b/crates/editor/src/inlay_hint_cache.rs @@ -974,6 +974,117 @@ mod tests { }); } + #[gpui::test] + async fn test_cache_update_on_lsp_completion_tasks(cx: &mut gpui::TestAppContext) { + init_test(cx, |settings| { + settings.defaults.inlay_hints = Some(InlayHintSettings { + enabled: true, + show_type_hints: true, + show_parameter_hints: true, + show_other_hints: true, + }) + }); + + let (file_with_hints, editor, fake_server) = prepare_test_objects(cx).await; + let lsp_request_count = Arc::new(AtomicU32::new(0)); + fake_server + .handle_request::(move |params, _| { + let task_lsp_request_count = Arc::clone(&lsp_request_count); + async move { + assert_eq!( + params.text_document.uri, + lsp::Url::from_file_path(file_with_hints).unwrap(), + ); + let current_call_id = + Arc::clone(&task_lsp_request_count).fetch_add(1, Ordering::SeqCst); + Ok(Some(vec![lsp::InlayHint { + position: lsp::Position::new(0, current_call_id), + label: lsp::InlayHintLabel::String(current_call_id.to_string()), + kind: None, + text_edits: None, + tooltip: None, + padding_left: None, + padding_right: None, + data: None, + }])) + } + }) + .next() + .await; + cx.foreground().run_until_parked(); + + let mut edits_made = 1; + editor.update(cx, |editor, cx| { + let expected_layers = vec!["0".to_string()]; + assert_eq!( + expected_layers, + cached_hint_labels(editor), + "Should get its first hints when opening the editor" + ); + assert_eq!(expected_layers, visible_hint_labels(editor, cx)); + let inlay_cache = editor.inlay_hint_cache(); + assert_eq!( + inlay_cache.version, edits_made, + "The editor update the cache version after every cache/view change" + ); + }); + + let progress_token = "test_progress_token"; + fake_server + .request::(lsp::WorkDoneProgressCreateParams { + token: lsp::ProgressToken::String(progress_token.to_string()), + }) + .await + .expect("work done progress create request failed"); + cx.foreground().run_until_parked(); + fake_server.notify::(lsp::ProgressParams { + token: lsp::ProgressToken::String(progress_token.to_string()), + value: lsp::ProgressParamsValue::WorkDone(lsp::WorkDoneProgress::Begin( + lsp::WorkDoneProgressBegin::default(), + )), + }); + cx.foreground().run_until_parked(); + + editor.update(cx, |editor, cx| { + let expected_layers = vec!["0".to_string()]; + assert_eq!( + expected_layers, + cached_hint_labels(editor), + "Should not update hints while the work task is running" + ); + assert_eq!(expected_layers, visible_hint_labels(editor, cx)); + let inlay_cache = editor.inlay_hint_cache(); + assert_eq!( + inlay_cache.version, edits_made, + "Should not update the cache while the work task is running" + ); + }); + + fake_server.notify::(lsp::ProgressParams { + token: lsp::ProgressToken::String(progress_token.to_string()), + value: lsp::ProgressParamsValue::WorkDone(lsp::WorkDoneProgress::End( + lsp::WorkDoneProgressEnd::default(), + )), + }); + cx.foreground().run_until_parked(); + + edits_made += 1; + editor.update(cx, |editor, cx| { + let expected_layers = vec!["1".to_string()]; + assert_eq!( + expected_layers, + cached_hint_labels(editor), + "New hints should be queried after the work task is done" + ); + assert_eq!(expected_layers, visible_hint_labels(editor, cx)); + let inlay_cache = editor.inlay_hint_cache(); + assert_eq!( + inlay_cache.version, edits_made, + "Cache version should udpate once after the work task is done" + ); + }); + } + #[gpui::test] async fn test_no_hint_updates_for_unrelated_language_files(cx: &mut gpui::TestAppContext) { let allowed_hint_kinds = HashSet::from_iter([None, Some(InlayHintKind::Type)]); diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index bbb2064da2..d69e5cf21e 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -3397,6 +3397,7 @@ impl Project { cx: &mut ModelContext, ) { if let Some(status) = self.language_server_statuses.get_mut(&language_server_id) { + cx.emit(Event::RefreshInlays); status.pending_work.remove(&token); cx.notify(); } From b66453e771e0a10d467016d23704c2f0d0cd7013 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 6 Jul 2023 12:11:08 +0200 Subject: [PATCH 088/104] fixup! Do not render multiple hunks for the same line --- crates/editor/src/element.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 2f69781aa1..e884f4b356 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1071,7 +1071,6 @@ impl EditorElement { end_y = start_y + 1.; } if (start_y, end_y) == last_rendered_row_range { - skipped += 1; continue; } last_rendered_row_range = (start_y, end_y); From 5e7d9dc718522674053f3faa3878e655595b8cf4 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 6 Jul 2023 13:31:45 +0200 Subject: [PATCH 089/104] Add hunk merging --- crates/editor/src/element.rs | 76 +++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index e884f4b356..82fbd194db 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1057,7 +1057,35 @@ impl EditorElement { if layout.is_singleton && scrollbar_settings.selections { let start_anchor = Anchor::min(); let end_anchor = Anchor::max(); - let mut last_rendered_row_range = (-1., -1.); + let mut start_row = None; + let mut end_row = None; + let color = scrollbar_theme.selections; + let border = Border { + width: 1., + color: style.thumb.border.color, + overlay: false, + top: false, + right: true, + bottom: false, + left: true, + }; + let mut push_region = |start, end| { + if let (Some(start_display), Some(end_display)) = (start, end) { + let start_y = y_for_row(start_display as f32); + let mut end_y = y_for_row(end_display as f32); + if end_y - start_y < 1. { + end_y = start_y + 1.; + } + let bounds = RectF::from_points(vec2f(left, start_y), vec2f(right, end_y)); + + scene.push_quad(Quad { + bounds, + background: Some(color), + border, + corner_radius: style.thumb.corner_radius, + }) + } + }; for (row, _) in &editor.background_highlights_in_range( start_anchor..end_anchor, &layout.position_map.snapshot, @@ -1065,36 +1093,28 @@ impl EditorElement { ) { let start_display = row.start; let end_display = row.end; - let start_y = y_for_row(start_display.row() as f32); - let mut end_y = y_for_row((end_display.row()) as f32); - if end_y - start_y < 1. { - end_y = start_y + 1.; - } - if (start_y, end_y) == last_rendered_row_range { + + if start_row.is_none() { + assert_eq!(end_row, None); + start_row = Some(start_display.row()); + end_row = Some(end_display.row()); continue; } - last_rendered_row_range = (start_y, end_y); - let bounds = RectF::from_points(vec2f(left, start_y), vec2f(right, end_y)); - - let color = scrollbar_theme.selections; - - let border = Border { - width: 1., - color: style.thumb.border.color, - overlay: false, - top: false, - right: true, - bottom: false, - left: true, - }; - - scene.push_quad(Quad { - bounds, - background: Some(color), - border, - corner_radius: style.thumb.corner_radius, - }) + if let Some(current_end) = end_row.as_mut() { + if start_display.row() > *current_end + 1 { + push_region(start_row, end_row); + start_row = None; + end_row = None; + } else { + // Merge two hunks. + *current_end = end_display.row(); + } + } else { + unreachable!(); + } } + // We might still have a hunk that was not rendered (if there was a search hit on the last line) + push_region(start_row, end_row); } if layout.is_singleton && scrollbar_settings.git_diff { From 3e245fec9033331034cd054c26291c2a4c06136e Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 6 Jul 2023 13:52:03 +0200 Subject: [PATCH 090/104] Save a flushing line instead of discarding it --- crates/editor/src/element.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 82fbd194db..e96f1efe92 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1103,8 +1103,8 @@ impl EditorElement { if let Some(current_end) = end_row.as_mut() { if start_display.row() > *current_end + 1 { push_region(start_row, end_row); - start_row = None; - end_row = None; + start_row = Some(start_display.row()); + end_row = Some(end_display.row()); } else { // Merge two hunks. *current_end = end_display.row(); From 5408275c7af8429e58bfc0b4113726e14b58ecc3 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 6 Jul 2023 14:38:05 +0200 Subject: [PATCH 091/104] Filter out non-json files when loading conversations --- crates/ai/src/ai.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/ai/src/ai.rs b/crates/ai/src/ai.rs index 812fb05121..7cc5f08f7c 100644 --- a/crates/ai/src/ai.rs +++ b/crates/ai/src/ai.rs @@ -12,6 +12,7 @@ use regex::Regex; use serde::{Deserialize, Serialize}; use std::{ cmp::Reverse, + ffi::OsStr, fmt::{self, Display}, path::PathBuf, sync::Arc, @@ -80,6 +81,9 @@ impl SavedConversationMetadata { let mut conversations = Vec::::new(); while let Some(path) = paths.next().await { let path = path?; + if path.extension() != Some(OsStr::new("json")) { + continue; + } let pattern = r" - \d+.zed.json$"; let re = Regex::new(pattern).unwrap(); From 708852aa000963780f678c7189b681039a8bfcbf Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 6 Jul 2023 14:11:18 +0200 Subject: [PATCH 092/104] Clip left when finding preceding (line) boundary This fixes an issue that was causing `alt-left` to not move the cursor when it was located right after an inlay hint with a `Left` bias. --- crates/editor/src/movement.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/editor/src/movement.rs b/crates/editor/src/movement.rs index 523a0af964..e589337979 100644 --- a/crates/editor/src/movement.rs +++ b/crates/editor/src/movement.rs @@ -263,13 +263,13 @@ pub fn find_preceding_boundary( if let Some((prev_ch, prev_point)) = prev { if is_boundary(ch, prev_ch) { - return prev_point; + return map.clip_point(prev_point, Bias::Left); } } prev = Some((ch, point)); } - DisplayPoint::zero() + map.clip_point(DisplayPoint::zero(), Bias::Left) } /// Scans for a boundary preceding the given start point `from` until a boundary is found, indicated by the @@ -292,7 +292,7 @@ pub fn find_preceding_boundary_in_line( for (ch, point) in map.reverse_chars_at(from) { if let Some((prev_ch, prev_point)) = prev { if is_boundary(ch, prev_ch) { - return prev_point; + return map.clip_point(prev_point, Bias::Left); } } @@ -303,7 +303,7 @@ pub fn find_preceding_boundary_in_line( prev = Some((ch, point)); } - prev.map(|(_, point)| point).unwrap_or(from) + map.clip_point(prev.map(|(_, point)| point).unwrap_or(from), Bias::Left) } /// Scans for a boundary following the given start point until a boundary is found, indicated by the From 11ae99fbd6d953d9e89ee3821ef7be64ac8e9219 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Thu, 6 Jul 2023 17:12:26 +0300 Subject: [PATCH 093/104] Add a test --- crates/editor/src/movement.rs | 80 ++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/crates/editor/src/movement.rs b/crates/editor/src/movement.rs index e589337979..e50d7d8306 100644 --- a/crates/editor/src/movement.rs +++ b/crates/editor/src/movement.rs @@ -406,8 +406,12 @@ pub fn split_display_range_by_lines( #[cfg(test)] mod tests { use super::*; - use crate::{test::marked_display_snapshot, Buffer, DisplayMap, ExcerptRange, MultiBuffer}; + use crate::{ + display_map::Inlay, test::marked_display_snapshot, Buffer, DisplayMap, ExcerptRange, + InlayId, MultiBuffer, + }; use settings::SettingsStore; + use util::post_inc; #[gpui::test] fn test_previous_word_start(cx: &mut gpui::AppContext) { @@ -505,6 +509,80 @@ mod tests { }); } + #[gpui::test] + fn test_find_preceding_boundary_with_inlays(cx: &mut gpui::AppContext) { + init_test(cx); + + let input_text = "abcdefghijklmnopqrstuvwxys"; + let family_id = cx + .font_cache() + .load_family(&["Helvetica"], &Default::default()) + .unwrap(); + let font_id = cx + .font_cache() + .select_font(family_id, &Default::default()) + .unwrap(); + let font_size = 14.0; + let buffer = MultiBuffer::build_simple(input_text, cx); + let buffer_snapshot = buffer.read(cx).snapshot(cx); + let display_map = + cx.add_model(|cx| DisplayMap::new(buffer, font_id, font_size, None, 1, 1, cx)); + + // add all kinds of inlays between two word boundaries: we should be able to cross them all, when looking for another boundary + let mut id = 0; + let inlays = (0..buffer_snapshot.len()) + .map(|offset| { + [ + Inlay { + id: InlayId::Suggestion(post_inc(&mut id)), + position: buffer_snapshot.anchor_at(offset, Bias::Left), + text: format!("test").into(), + }, + Inlay { + id: InlayId::Suggestion(post_inc(&mut id)), + position: buffer_snapshot.anchor_at(offset, Bias::Right), + text: format!("test").into(), + }, + Inlay { + id: InlayId::Hint(post_inc(&mut id)), + position: buffer_snapshot.anchor_at(offset, Bias::Left), + text: format!("test").into(), + }, + Inlay { + id: InlayId::Hint(post_inc(&mut id)), + position: buffer_snapshot.anchor_at(offset, Bias::Right), + text: format!("test").into(), + }, + ] + }) + .flatten() + .collect(); + let snapshot = display_map.update(cx, |map, cx| { + map.splice_inlays(Vec::new(), inlays, cx); + map.snapshot(cx) + }); + + assert_eq!( + find_preceding_boundary( + &snapshot, + buffer_snapshot.len().to_display_point(&snapshot), + |left, _| left == 'a', + ), + 0.to_display_point(&snapshot), + "Should not stop at inlays when looking for boundaries" + ); + + assert_eq!( + find_preceding_boundary_in_line( + &snapshot, + buffer_snapshot.len().to_display_point(&snapshot), + |left, _| left == 'a', + ), + 0.to_display_point(&snapshot), + "Should not stop at inlays when looking for boundaries in line" + ); + } + #[gpui::test] fn test_next_word_end(cx: &mut gpui::AppContext) { init_test(cx); From 793eff16957b5b20e7f98bd098c096887ed79f9c Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Thu, 6 Jul 2023 10:54:47 -0400 Subject: [PATCH 094/104] Update scrollbar selection style --- styles/src/style_tree/editor.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/styles/src/style_tree/editor.ts b/styles/src/style_tree/editor.ts index a1ba0be43d..48a2fd33e2 100644 --- a/styles/src/style_tree/editor.ts +++ b/styles/src/style_tree/editor.ts @@ -304,9 +304,7 @@ export default function editor(): any { ? with_opacity(theme.ramps.green(0.5).hex(), 0.8) : with_opacity(theme.ramps.green(0.4).hex(), 0.8), }, - selections: is_light - ? with_opacity(theme.ramps.blue(0.5).hex(), 0.8) - : with_opacity(theme.ramps.blue(0.4).hex(), 0.8) + selections: foreground(layer, "accent") }, composition_mark: { underline: { From fff65968bfb30bda31321a832ef2cd67d474cc8f Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Thu, 6 Jul 2023 23:08:04 +0300 Subject: [PATCH 095/104] Restart LSP server on initialization options change --- crates/project/src/project.rs | 27 ++++++++++++++++++++++----- crates/workspace/src/workspace.rs | 1 + 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index d69e5cf21e..81db0c7ed7 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -777,20 +777,32 @@ impl Project { } let mut language_servers_to_stop = Vec::new(); + let mut language_servers_to_restart = Vec::new(); let languages = self.languages.to_vec(); + let project_settings = settings::get::(cx).clone(); for (worktree_id, started_lsp_name) in self.language_server_ids.keys() { - let language = languages.iter().find(|l| { - l.lsp_adapters() + let language = languages.iter().find_map(|l| { + let adapter = l + .lsp_adapters() .iter() - .any(|adapter| &adapter.name == started_lsp_name) + .find(|adapter| &adapter.name == started_lsp_name)?; + Some((l, adapter)) }); - if let Some(language) = language { + if let Some((language, adapter)) = language { let worktree = self.worktree_for_id(*worktree_id, cx); - let file = worktree.and_then(|tree| { + let file = worktree.as_ref().and_then(|tree| { tree.update(cx, |tree, cx| tree.root_file(cx).map(|f| f as _)) }); if !language_settings(Some(language), file.as_ref(), cx).enable_language_server { language_servers_to_stop.push((*worktree_id, started_lsp_name.clone())); + } else if let Some(worktree) = worktree { + let new_lsp_settings = project_settings + .lsp + .get(&adapter.name.0) + .and_then(|s| s.initialization_options.as_ref()); + if adapter.initialization_options.as_ref() != new_lsp_settings { + language_servers_to_restart.push((worktree, Arc::clone(language))); + } } } } @@ -807,6 +819,11 @@ impl Project { self.start_language_servers(&worktree, worktree_path, language, cx); } + // Restart all language servers with changed initialization options. + for (worktree, language) in language_servers_to_restart { + self.restart_language_servers(worktree, language, cx); + } + if !self.copilot_enabled && Copilot::global(cx).is_some() { self.copilot_enabled = true; for buffer in self.opened_buffers.values() { diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index 60aefe4213..01d80d141c 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -4809,6 +4809,7 @@ mod tests { theme::init((), cx); language::init(cx); crate::init_settings(cx); + Project::init_settings(cx); }); } } From e6ec0af74355020bf9017f8c90a043866adf7bad Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Thu, 6 Jul 2023 23:13:29 +0300 Subject: [PATCH 096/104] Remove redundant hint kind checks in tests --- crates/collab/src/tests/integration_tests.rs | 55 ++------------------ crates/editor/src/inlay_hint_cache.rs | 51 +++++------------- 2 files changed, 17 insertions(+), 89 deletions(-) diff --git a/crates/collab/src/tests/integration_tests.rs b/crates/collab/src/tests/integration_tests.rs index b20844a065..66dc19d690 100644 --- a/crates/collab/src/tests/integration_tests.rs +++ b/crates/collab/src/tests/integration_tests.rs @@ -18,7 +18,7 @@ use gpui::{ }; use indoc::indoc; use language::{ - language_settings::{AllLanguageSettings, Formatter, InlayHintKind, InlayHintSettings}, + language_settings::{AllLanguageSettings, Formatter, InlayHintSettings}, tree_sitter_rust, Anchor, Diagnostic, DiagnosticEntry, FakeLspAdapter, Language, LanguageConfig, OffsetRangeExt, Point, Rope, }; @@ -7843,7 +7843,6 @@ async fn test_mutual_editor_inlay_hint_cache_update( }); }); }); - let allowed_hint_kinds = HashSet::from_iter([None, Some(InlayHintKind::Type)]); let mut language = Language::new( LanguageConfig { @@ -7955,10 +7954,6 @@ async fn test_mutual_editor_inlay_hint_cache_update( "Host should get its first hints when opens an editor" ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!( - inlay_cache.allowed_hint_kinds, allowed_hint_kinds, - "Cache should use editor settings to get the allowed hint kinds" - ); assert_eq!( inlay_cache.version, edits_made, "Host editor update the cache version after every cache/view change", @@ -7982,10 +7977,6 @@ async fn test_mutual_editor_inlay_hint_cache_update( "Client should get its first hints when opens an editor" ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!( - inlay_cache.allowed_hint_kinds, allowed_hint_kinds, - "Cache should use editor settings to get the allowed hint kinds" - ); assert_eq!( inlay_cache.version, edits_made, "Guest editor update the cache version after every cache/view change" @@ -8007,10 +7998,6 @@ async fn test_mutual_editor_inlay_hint_cache_update( "Host should get hints from the 1st edit and 1st LSP query" ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!( - inlay_cache.allowed_hint_kinds, allowed_hint_kinds, - "Inlay kinds settings never change during the test" - ); assert_eq!(inlay_cache.version, edits_made); }); editor_b.update(cx_b, |editor, _| { @@ -8025,10 +8012,6 @@ async fn test_mutual_editor_inlay_hint_cache_update( "Guest should get hints the 1st edit and 2nd LSP query" ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!( - inlay_cache.allowed_hint_kinds, allowed_hint_kinds, - "Inlay kinds settings never change during the test" - ); assert_eq!(inlay_cache.version, edits_made); }); @@ -8054,10 +8037,6 @@ async fn test_mutual_editor_inlay_hint_cache_update( 4th query was made by guest (but not applied) due to cache invalidation logic" ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!( - inlay_cache.allowed_hint_kinds, allowed_hint_kinds, - "Inlay kinds settings never change during the test" - ); assert_eq!(inlay_cache.version, edits_made); }); editor_b.update(cx_b, |editor, _| { @@ -8074,10 +8053,6 @@ async fn test_mutual_editor_inlay_hint_cache_update( "Guest should get hints from 3rd edit, 6th LSP query" ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!( - inlay_cache.allowed_hint_kinds, allowed_hint_kinds, - "Inlay kinds settings never change during the test" - ); assert_eq!(inlay_cache.version, edits_made); }); @@ -8103,10 +8078,6 @@ async fn test_mutual_editor_inlay_hint_cache_update( "Host should react to /refresh LSP request and get new hints from 7th LSP query" ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!( - inlay_cache.allowed_hint_kinds, allowed_hint_kinds, - "Inlay kinds settings never change during the test" - ); assert_eq!( inlay_cache.version, edits_made, "Host should accepted all edits and bump its cache version every time" @@ -8128,10 +8099,6 @@ async fn test_mutual_editor_inlay_hint_cache_update( "Guest should get a /refresh LSP request propagated by host and get new hints from 8th LSP query" ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!( - inlay_cache.allowed_hint_kinds, allowed_hint_kinds, - "Inlay kinds settings never change during the test" - ); assert_eq!( inlay_cache.version, edits_made, @@ -8164,9 +8131,9 @@ async fn test_inlay_hint_refresh_is_forwarded( store.update_user_settings::(cx, |settings| { settings.defaults.inlay_hints = Some(InlayHintSettings { enabled: false, - show_type_hints: true, + show_type_hints: false, show_parameter_hints: false, - show_other_hints: true, + show_other_hints: false, }) }); }); @@ -8177,13 +8144,12 @@ async fn test_inlay_hint_refresh_is_forwarded( settings.defaults.inlay_hints = Some(InlayHintSettings { enabled: true, show_type_hints: true, - show_parameter_hints: false, + show_parameter_hints: true, show_other_hints: true, }) }); }); }); - let allowed_hint_kinds = HashSet::from_iter([None, Some(InlayHintKind::Type)]); let mut language = Language::new( LanguageConfig { @@ -8299,10 +8265,6 @@ async fn test_inlay_hint_refresh_is_forwarded( "Host should get no hints due to them turned off" ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!( - inlay_cache.allowed_hint_kinds, allowed_hint_kinds, - "Host should have allowed hint kinds set despite hints are off" - ); assert_eq!( inlay_cache.version, 0, "Host should not increment its cache version due to no changes", @@ -8318,10 +8280,6 @@ async fn test_inlay_hint_refresh_is_forwarded( "Client should get its first hints when opens an editor" ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!( - inlay_cache.allowed_hint_kinds, allowed_hint_kinds, - "Cache should use editor settings to get the allowed hint kinds" - ); assert_eq!( inlay_cache.version, edits_made, "Guest editor update the cache version after every cache/view change" @@ -8339,7 +8297,6 @@ async fn test_inlay_hint_refresh_is_forwarded( "Host should get nop hints due to them turned off, even after the /refresh" ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!( inlay_cache.version, 0, "Host should not increment its cache version due to no changes", @@ -8355,10 +8312,6 @@ async fn test_inlay_hint_refresh_is_forwarded( "Guest should get a /refresh LSP request propagated by host despite host hints are off" ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!( - inlay_cache.allowed_hint_kinds, allowed_hint_kinds, - "Inlay kinds settings never change during the test" - ); assert_eq!( inlay_cache.version, edits_made, "Guest should accepted all edits and bump its cache version every time" diff --git a/crates/editor/src/inlay_hint_cache.rs b/crates/editor/src/inlay_hint_cache.rs index 9ca94665c2..70fb372504 100644 --- a/crates/editor/src/inlay_hint_cache.rs +++ b/crates/editor/src/inlay_hint_cache.rs @@ -833,7 +833,7 @@ mod tests { use crate::{ scroll::{autoscroll::Autoscroll, scroll_amount::ScrollAmount}, serde_json::json, - ExcerptRange, InlayHintSettings, + ExcerptRange, }; use futures::StreamExt; use gpui::{executor::Deterministic, TestAppContext, ViewHandle}; @@ -1087,13 +1087,12 @@ mod tests { #[gpui::test] async fn test_no_hint_updates_for_unrelated_language_files(cx: &mut gpui::TestAppContext) { - let allowed_hint_kinds = HashSet::from_iter([None, Some(InlayHintKind::Type)]); init_test(cx, |settings| { settings.defaults.inlay_hints = Some(InlayHintSettings { enabled: true, - show_type_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), - show_parameter_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Parameter)), - show_other_hints: allowed_hint_kinds.contains(&None), + show_type_hints: true, + show_parameter_hints: true, + show_other_hints: true, }) }); @@ -1196,10 +1195,6 @@ mod tests { ); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!( - inlay_cache.allowed_hint_kinds, allowed_hint_kinds, - "Cache should use editor settings to get the allowed hint kinds" - ); assert_eq!( inlay_cache.version, 1, "Rust editor update the cache version after every cache/view change" @@ -1258,7 +1253,6 @@ mod tests { ); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!(inlay_cache.version, 1); }); @@ -1276,7 +1270,6 @@ mod tests { ); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!( inlay_cache.version, 2, "Every time hint cache changes, cache version should be incremented" @@ -1291,7 +1284,6 @@ mod tests { ); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!(inlay_cache.version, 1); }); @@ -1309,7 +1301,6 @@ mod tests { ); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!(inlay_cache.version, 2); }); rs_editor.update(cx, |editor, cx| { @@ -1321,7 +1312,6 @@ mod tests { ); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!(inlay_cache.version, 2); }); } @@ -1444,7 +1434,6 @@ mod tests { visible_hint_labels(editor, cx) ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!( inlay_cache.version, edits_made, "Should not update cache version due to new loaded hints being the same" @@ -1580,7 +1569,6 @@ mod tests { assert!(cached_hint_labels(editor).is_empty()); assert!(visible_hint_labels(editor, cx).is_empty()); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, another_allowed_hint_kinds); assert_eq!( inlay_cache.version, edits_made, "The editor should not update the cache version after /refresh query without updates" @@ -1654,20 +1642,18 @@ mod tests { visible_hint_labels(editor, cx), ); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, final_allowed_hint_kinds); assert_eq!(inlay_cache.version, edits_made); }); } #[gpui::test] async fn test_hint_request_cancellation(cx: &mut gpui::TestAppContext) { - let allowed_hint_kinds = HashSet::from_iter([None]); init_test(cx, |settings| { settings.defaults.inlay_hints = Some(InlayHintSettings { enabled: true, - show_type_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), - show_parameter_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Parameter)), - show_other_hints: allowed_hint_kinds.contains(&None), + show_type_hints: true, + show_parameter_hints: true, + show_other_hints: true, }) }); @@ -1735,7 +1721,6 @@ mod tests { ); assert_eq!(expected_hints, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!( inlay_cache.version, 1, "Only one update should be registered in the cache after all cancellations" @@ -1782,7 +1767,6 @@ mod tests { ); assert_eq!(expected_hints, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!( inlay_cache.version, 2, "Should update the cache version once more, for the new change" @@ -1792,13 +1776,12 @@ mod tests { #[gpui::test] async fn test_large_buffer_inlay_requests_split(cx: &mut gpui::TestAppContext) { - let allowed_hint_kinds = HashSet::from_iter([None, Some(InlayHintKind::Type)]); init_test(cx, |settings| { settings.defaults.inlay_hints = Some(InlayHintSettings { enabled: true, - show_type_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), - show_parameter_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Parameter)), - show_other_hints: allowed_hint_kinds.contains(&None), + show_type_hints: true, + show_parameter_hints: true, + show_other_hints: true, }) }); @@ -1904,7 +1887,6 @@ mod tests { ); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!( inlay_cache.version, 2, "Both LSP queries should've bumped the cache version" @@ -1937,7 +1919,6 @@ mod tests { "Should have hints from the new LSP response after edit"); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!(inlay_cache.version, 5, "Should update the cache for every LSP response with hints added"); }); } @@ -1947,13 +1928,12 @@ mod tests { deterministic: Arc, cx: &mut gpui::TestAppContext, ) { - let allowed_hint_kinds = HashSet::from_iter([None, Some(InlayHintKind::Type)]); init_test(cx, |settings| { settings.defaults.inlay_hints = Some(InlayHintSettings { enabled: true, - show_type_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Type)), - show_parameter_hints: allowed_hint_kinds.contains(&Some(InlayHintKind::Parameter)), - show_other_hints: allowed_hint_kinds.contains(&None), + show_type_hints: true, + show_parameter_hints: true, + show_other_hints: true, }) }); @@ -2159,7 +2139,6 @@ mod tests { ); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!(inlay_cache.version, 4, "Every visible excerpt hints should bump the verison"); }); @@ -2191,7 +2170,6 @@ mod tests { "With more scrolls of the multibuffer, more hints should be added into the cache and nothing invalidated without edits"); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!(inlay_cache.version, 9); }); @@ -2220,7 +2198,6 @@ mod tests { "After multibuffer was scrolled to the end, all hints for all excerpts should be fetched"); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!(inlay_cache.version, 12); }); @@ -2249,7 +2226,6 @@ mod tests { "After multibuffer was scrolled to the end, further scrolls up should not bring more hints"); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!(inlay_cache.version, 12, "No updates should happen during scrolling already scolled buffer"); }); @@ -2276,7 +2252,6 @@ mod tests { unedited (2nd) buffer should have the same hint"); assert_eq!(expected_layers, visible_hint_labels(editor, cx)); let inlay_cache = editor.inlay_hint_cache(); - assert_eq!(inlay_cache.allowed_hint_kinds, allowed_hint_kinds); assert_eq!(inlay_cache.version, 16); }); } From 318deed25b4bad1c0d0cfc29749a50a06a87590b Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 7 Jul 2023 12:02:08 +0200 Subject: [PATCH 097/104] Skip key down event if preceded by its key equivalent version Previously, we would only track whether the previous key down event was a key equivalent. However, this could cause issues when pressing certain keystrokes in rapid succession, e.g.: - Pressing `shift-right` (to select a character) - Pressing a character (with or without `shift` held down) This would cause GPUI to ignore the second event because it was preceded by a key equivalent event. With this commit, we track the last key equivalent event, and skip the key down event only if it matches the last key equivalent event. --- crates/gpui/src/platform/event.rs | 2 +- crates/gpui/src/platform/mac/window.rs | 59 ++++++++++---------------- 2 files changed, 24 insertions(+), 37 deletions(-) diff --git a/crates/gpui/src/platform/event.rs b/crates/gpui/src/platform/event.rs index c39c76dc34..4456db9a51 100644 --- a/crates/gpui/src/platform/event.rs +++ b/crates/gpui/src/platform/event.rs @@ -4,7 +4,7 @@ use pathfinder_geometry::vector::vec2f; use crate::{geometry::vector::Vector2F, keymap_matcher::Keystroke}; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Eq, PartialEq)] pub struct KeyDownEvent { pub keystroke: Keystroke, pub is_held: bool, diff --git a/crates/gpui/src/platform/mac/window.rs b/crates/gpui/src/platform/mac/window.rs index 3c82538611..381a4fbaaa 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -232,10 +232,6 @@ unsafe fn build_window_class(name: &'static str, superclass: &Class) -> *const C sel!(canBecomeKeyWindow), yes as extern "C" fn(&Object, Sel) -> BOOL, ); - decl.add_method( - sel!(sendEvent:), - send_event as extern "C" fn(&Object, Sel, id), - ); decl.add_method( sel!(windowDidResize:), window_did_resize as extern "C" fn(&Object, Sel, id), @@ -299,7 +295,7 @@ struct WindowState { appearance_changed_callback: Option>, input_handler: Option>, pending_key_down: Option<(KeyDownEvent, Option)>, - performed_key_equivalent: bool, + last_key_equivalent: Option, synthetic_drag_counter: usize, executor: Rc, scene_to_render: Option, @@ -521,7 +517,7 @@ impl Window { appearance_changed_callback: None, input_handler: None, pending_key_down: None, - performed_key_equivalent: false, + last_key_equivalent: None, synthetic_drag_counter: 0, executor, scene_to_render: Default::default(), @@ -965,36 +961,34 @@ extern "C" fn handle_key_event(this: &Object, native_event: id, key_equivalent: let window_height = window_state_borrow.content_size().y(); let event = unsafe { Event::from_native(native_event, Some(window_height)) }; - if let Some(event) = event { + if let Some(Event::KeyDown(event)) = event { + // For certain keystrokes, macOS will first dispatch a "key equivalent" event. + // If that event isn't handled, it will then dispatch a "key down" event. GPUI + // makes no distinction between these two types of events, so we need to ignore + // the "key down" event if we've already just processed its "key equivalent" version. if key_equivalent { - window_state_borrow.performed_key_equivalent = true; - } else if window_state_borrow.performed_key_equivalent { + window_state_borrow.last_key_equivalent = Some(event.clone()); + } else if window_state_borrow.last_key_equivalent.take().as_ref() == Some(&event) { return NO; } - let function_is_held; - window_state_borrow.pending_key_down = match event { - Event::KeyDown(event) => { - let keydown = event.keystroke.clone(); - // Ignore events from held-down keys after some of the initially-pressed keys - // were released. - if event.is_held { - if window_state_borrow.last_fresh_keydown.as_ref() != Some(&keydown) { - return YES; - } - } else { - window_state_borrow.last_fresh_keydown = Some(keydown); - } - function_is_held = event.keystroke.function; - Some((event, None)) + let keydown = event.keystroke.clone(); + let fn_modifier = keydown.function; + // Ignore events from held-down keys after some of the initially-pressed keys + // were released. + if event.is_held { + if window_state_borrow.last_fresh_keydown.as_ref() != Some(&keydown) { + return YES; } - - _ => return NO, - }; - + } else { + window_state_borrow.last_fresh_keydown = Some(keydown); + } + window_state_borrow.pending_key_down = Some((event, None)); drop(window_state_borrow); - if !function_is_held { + // Send the event to the input context for IME handling, unless the `fn` modifier is + // being pressed. + if !fn_modifier { unsafe { let input_context: id = msg_send![this, inputContext]; let _: BOOL = msg_send![input_context, handleEvent: native_event]; @@ -1143,13 +1137,6 @@ extern "C" fn cancel_operation(this: &Object, _sel: Sel, _sender: id) { } } -extern "C" fn send_event(this: &Object, _: Sel, native_event: id) { - unsafe { - let _: () = msg_send![super(this, class!(NSWindow)), sendEvent: native_event]; - get_window_state(this).borrow_mut().performed_key_equivalent = false; - } -} - extern "C" fn window_did_resize(this: &Object, _: Sel, _: id) { let window_state = unsafe { get_window_state(this) }; window_state.as_ref().borrow().move_traffic_light(); From abf3b4a54e66e0a67cc39c2b6454d89ab7295534 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Fri, 7 Jul 2023 15:07:12 +0200 Subject: [PATCH 098/104] chore: Replace lazy_static Mutex with const. (#2693) Mutex::new() is const-stable as of Rust 1.63. Release Notes: - N/A --- Cargo.lock | 2 -- crates/collab/src/db.rs | 5 +---- crates/collab/src/tests/randomized_integration_tests.rs | 4 ++-- crates/db/src/db.rs | 2 +- crates/language/src/syntax_map.rs | 5 +---- crates/live_kit_client/Cargo.toml | 3 --- crates/live_kit_client/src/test.rs | 7 ++----- crates/vim/Cargo.toml | 1 - crates/vim/src/test/neovim_connection.rs | 6 +----- 9 files changed, 8 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ac089cee18..60ed830683 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4004,7 +4004,6 @@ dependencies = [ "gpui", "hmac 0.12.1", "jwt", - "lazy_static", "live_kit_server", "log", "media", @@ -8398,7 +8397,6 @@ dependencies = [ "indoc", "itertools", "language", - "lazy_static", "log", "nvim-rs", "parking_lot 0.11.2", diff --git a/crates/collab/src/db.rs b/crates/collab/src/db.rs index 208da22efe..e16fa9edb1 100644 --- a/crates/collab/src/db.rs +++ b/crates/collab/src/db.rs @@ -3517,7 +3517,6 @@ pub use test::*; mod test { use super::*; use gpui::executor::Background; - use lazy_static::lazy_static; use parking_lot::Mutex; use sea_orm::ConnectionTrait; use sqlx::migrate::MigrateDatabase; @@ -3566,9 +3565,7 @@ mod test { } pub fn postgres(background: Arc) -> Self { - lazy_static! { - static ref LOCK: Mutex<()> = Mutex::new(()); - } + static LOCK: Mutex<()> = Mutex::new(()); let _guard = LOCK.lock(); let mut rng = StdRng::from_entropy(); diff --git a/crates/collab/src/tests/randomized_integration_tests.rs b/crates/collab/src/tests/randomized_integration_tests.rs index a95938f6b8..f5dfe17d6f 100644 --- a/crates/collab/src/tests/randomized_integration_tests.rs +++ b/crates/collab/src/tests/randomized_integration_tests.rs @@ -37,9 +37,9 @@ use util::ResultExt; lazy_static::lazy_static! { static ref PLAN_LOAD_PATH: Option = path_env_var("LOAD_PLAN"); static ref PLAN_SAVE_PATH: Option = path_env_var("SAVE_PLAN"); - static ref LOADED_PLAN_JSON: Mutex>> = Default::default(); - static ref PLAN: Mutex>>> = Default::default(); } +static LOADED_PLAN_JSON: Mutex>> = Mutex::new(None); +static PLAN: Mutex>>> = Mutex::new(None); #[gpui::test(iterations = 100, on_failure = "on_failure")] async fn test_random_collaboration( diff --git a/crates/db/src/db.rs b/crates/db/src/db.rs index 5b8aca07e0..798dfbc17f 100644 --- a/crates/db/src/db.rs +++ b/crates/db/src/db.rs @@ -43,10 +43,10 @@ const DB_FILE_NAME: &'static str = "db.sqlite"; lazy_static::lazy_static! { // !!!!!!! CHANGE BACK TO DEFAULT FALSE BEFORE SHIPPING static ref ZED_STATELESS: bool = std::env::var("ZED_STATELESS").map_or(false, |v| !v.is_empty()); - static ref DB_FILE_OPERATIONS: Mutex<()> = Mutex::new(()); pub static ref BACKUP_DB_PATH: RwLock> = RwLock::new(None); pub static ref ALL_FILE_DB_FAILED: AtomicBool = AtomicBool::new(false); } +static DB_FILE_OPERATIONS: Mutex<()> = Mutex::new(()); /// Open or create a database at the given directory path. /// This will retry a couple times if there are failures. If opening fails once, the db directory diff --git a/crates/language/src/syntax_map.rs b/crates/language/src/syntax_map.rs index 1570baf185..b6431c2286 100644 --- a/crates/language/src/syntax_map.rs +++ b/crates/language/src/syntax_map.rs @@ -4,7 +4,6 @@ mod syntax_map_tests; use crate::{Grammar, InjectionConfig, Language, LanguageRegistry}; use collections::HashMap; use futures::FutureExt; -use lazy_static::lazy_static; use parking_lot::Mutex; use std::{ borrow::Cow, @@ -25,9 +24,7 @@ thread_local! { static PARSER: RefCell = RefCell::new(Parser::new()); } -lazy_static! { - static ref QUERY_CURSORS: Mutex> = Default::default(); -} +static QUERY_CURSORS: Mutex> = Mutex::new(vec![]); #[derive(Default)] pub struct SyntaxMap { diff --git a/crates/live_kit_client/Cargo.toml b/crates/live_kit_client/Cargo.toml index 36087a42a3..78f435906b 100644 --- a/crates/live_kit_client/Cargo.toml +++ b/crates/live_kit_client/Cargo.toml @@ -17,7 +17,6 @@ test-support = [ "async-trait", "collections/test-support", "gpui/test-support", - "lazy_static", "live_kit_server", "nanoid", ] @@ -38,7 +37,6 @@ parking_lot.workspace = true postage.workspace = true async-trait = { workspace = true, optional = true } -lazy_static = { workspace = true, optional = true } nanoid = { version ="0.4", optional = true} [dev-dependencies] @@ -60,7 +58,6 @@ foreign-types = "0.3" futures.workspace = true hmac = "0.12" jwt = "0.16" -lazy_static.workspace = true objc = "0.2" parking_lot.workspace = true serde.workspace = true diff --git a/crates/live_kit_client/src/test.rs b/crates/live_kit_client/src/test.rs index 3fc046c5a2..ada864fc44 100644 --- a/crates/live_kit_client/src/test.rs +++ b/crates/live_kit_client/src/test.rs @@ -1,18 +1,15 @@ use anyhow::{anyhow, Result}; use async_trait::async_trait; -use collections::HashMap; +use collections::{BTreeMap, HashMap}; use futures::Stream; use gpui::executor::Background; -use lazy_static::lazy_static; use live_kit_server::token; use media::core_video::CVImageBuffer; use parking_lot::Mutex; use postage::watch; use std::{future::Future, mem, sync::Arc}; -lazy_static! { - static ref SERVERS: Mutex>> = Default::default(); -} +static SERVERS: Mutex>> = Mutex::new(BTreeMap::new()); pub struct TestServer { pub url: String, diff --git a/crates/vim/Cargo.toml b/crates/vim/Cargo.toml index 57d3821379..47a85f4ed3 100644 --- a/crates/vim/Cargo.toml +++ b/crates/vim/Cargo.toml @@ -36,7 +36,6 @@ workspace = { path = "../workspace" } [dev-dependencies] indoc.workspace = true parking_lot.workspace = true -lazy_static.workspace = true editor = { path = "../editor", features = ["test-support"] } gpui = { path = "../gpui", features = ["test-support"] } diff --git a/crates/vim/src/test/neovim_connection.rs b/crates/vim/src/test/neovim_connection.rs index c3916722dd..aa14e4a065 100644 --- a/crates/vim/src/test/neovim_connection.rs +++ b/crates/vim/src/test/neovim_connection.rs @@ -11,8 +11,6 @@ use gpui::keymap_matcher::Keystroke; use language::Point; -#[cfg(feature = "neovim")] -use lazy_static::lazy_static; #[cfg(feature = "neovim")] use nvim_rs::{ create::tokio::new_child_cmd, error::LoopError, Handler, Neovim, UiAttachOptions, Value, @@ -32,9 +30,7 @@ use collections::VecDeque; // Neovim doesn't like to be started simultaneously from multiple threads. We use this lock // to ensure we are only constructing one neovim connection at a time. #[cfg(feature = "neovim")] -lazy_static! { - static ref NEOVIM_LOCK: ReentrantMutex<()> = ReentrantMutex::new(()); -} +static NEOVIM_LOCK: ReentrantMutex<()> = ReentrantMutex::new(()); #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub enum NeovimData { From 66bf56fc4f571c94486c5e2a1552aebf66f5f797 Mon Sep 17 00:00:00 2001 From: Julia Date: Thu, 6 Jul 2023 17:18:45 -0400 Subject: [PATCH 099/104] Prevent duplicate instances by coordinating via a socket --- crates/cli/src/main.rs | 1 + crates/zed/src/main.rs | 9 +++- crates/zed/src/only_instance.rs | 82 +++++++++++++++++++++++++++++++++ crates/zed/src/zed.rs | 1 + 4 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 crates/zed/src/only_instance.rs diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index bdf677512c..2f742814a8 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -201,6 +201,7 @@ impl Bundle { self.zed_version_string() ); } + Self::LocalPath { executable, .. } => { let executable_parent = executable .parent() diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 3da8c24617..5eed301367 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -57,8 +57,9 @@ use staff_mode::StaffMode; use util::{channel::RELEASE_CHANNEL, paths, ResultExt, TryFutureExt}; use workspace::{item::ItemHandle, notifications::NotifyResultExt, AppState, Workspace}; use zed::{ - assets::Assets, build_window_options, handle_keymap_file_changes, initialize_workspace, - languages, menus, + assets::Assets, + build_window_options, handle_keymap_file_changes, initialize_workspace, languages, menus, + only_instance::{ensure_only_instance, IsOnlyInstance}, }; fn main() { @@ -66,6 +67,10 @@ fn main() { init_paths(); init_logger(); + if ensure_only_instance() != IsOnlyInstance::Yes { + return; + } + log::info!("========== starting zed =========="); let mut app = gpui::App::new(Assets).unwrap(); diff --git a/crates/zed/src/only_instance.rs b/crates/zed/src/only_instance.rs new file mode 100644 index 0000000000..c1358f7a33 --- /dev/null +++ b/crates/zed/src/only_instance.rs @@ -0,0 +1,82 @@ +use std::{ + io::{Read, Write}, + net::{Ipv4Addr, SocketAddr, SocketAddrV4, TcpListener, TcpStream}, + thread, + time::Duration, +}; + +const PORT: u16 = 43739; +const LOCALHOST: Ipv4Addr = Ipv4Addr::new(127, 0, 0, 1); +const ADDRESS: SocketAddr = SocketAddr::V4(SocketAddrV4::new(LOCALHOST, PORT)); +const INSTANCE_HANDSHAKE: &str = "Zed Editor Instance Running"; +const CONNECT_TIMEOUT: Duration = Duration::from_millis(10); +const RECEIVE_TIMEOUT: Duration = Duration::from_millis(35); +const SEND_TIMEOUT: Duration = Duration::from_millis(20); + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum IsOnlyInstance { + Yes, + No, +} + +pub fn ensure_only_instance() -> IsOnlyInstance { + if check_got_handshake() { + return IsOnlyInstance::No; + } + + let listener = match TcpListener::bind(ADDRESS) { + Ok(listener) => listener, + + Err(err) => { + log::warn!("Error binding to single instance port: {err}"); + if check_got_handshake() { + return IsOnlyInstance::No; + } + + // Avoid failing to start when some other application by chance already has + // a claim on the port. This is sub-par as any other instance that gets launched + // will be unable to communicate with this instance and will duplicate + log::warn!("Backup handshake request failed, continuing without handshake"); + return IsOnlyInstance::Yes; + } + }; + + thread::spawn(move || { + for stream in listener.incoming() { + let mut stream = match stream { + Ok(stream) => stream, + Err(_) => return, + }; + + _ = stream.set_nodelay(true); + _ = stream.set_read_timeout(Some(SEND_TIMEOUT)); + _ = stream.write_all(INSTANCE_HANDSHAKE.as_bytes()); + } + }); + + IsOnlyInstance::Yes +} + +fn check_got_handshake() -> bool { + match TcpStream::connect_timeout(&ADDRESS, CONNECT_TIMEOUT) { + Ok(mut stream) => { + let mut buf = vec![0u8; INSTANCE_HANDSHAKE.len()]; + + stream.set_read_timeout(Some(RECEIVE_TIMEOUT)).unwrap(); + if let Err(err) = stream.read_exact(&mut buf) { + log::warn!("Connected to single instance port but failed to read: {err}"); + return false; + } + + if buf == INSTANCE_HANDSHAKE.as_bytes() { + log::info!("Got instance handshake"); + return true; + } + + log::warn!("Got wrong instance handshake value"); + false + } + + Err(_) => false, + } +} diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index 0df16f4bab..09bdbf65be 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -1,6 +1,7 @@ pub mod assets; pub mod languages; pub mod menus; +pub mod only_instance; #[cfg(any(test, feature = "test-support"))] pub mod test; From b70b76029e17e1cb96d9d008755bb48fd682df5c Mon Sep 17 00:00:00 2001 From: Julia Date: Fri, 7 Jul 2023 14:18:43 -0400 Subject: [PATCH 100/104] Use different port and handshake for different release channels --- crates/db/src/db.rs | 3 +-- crates/zed/src/only_instance.rs | 33 +++++++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/crates/db/src/db.rs b/crates/db/src/db.rs index 798dfbc17f..7b4aa74a80 100644 --- a/crates/db/src/db.rs +++ b/crates/db/src/db.rs @@ -41,8 +41,7 @@ const FALLBACK_DB_NAME: &'static str = "FALLBACK_MEMORY_DB"; const DB_FILE_NAME: &'static str = "db.sqlite"; lazy_static::lazy_static! { - // !!!!!!! CHANGE BACK TO DEFAULT FALSE BEFORE SHIPPING - static ref ZED_STATELESS: bool = std::env::var("ZED_STATELESS").map_or(false, |v| !v.is_empty()); + pub static ref ZED_STATELESS: bool = std::env::var("ZED_STATELESS").map_or(false, |v| !v.is_empty()); pub static ref BACKUP_DB_PATH: RwLock> = RwLock::new(None); pub static ref ALL_FILE_DB_FAILED: AtomicBool = AtomicBool::new(false); } diff --git a/crates/zed/src/only_instance.rs b/crates/zed/src/only_instance.rs index c1358f7a33..0450b5908b 100644 --- a/crates/zed/src/only_instance.rs +++ b/crates/zed/src/only_instance.rs @@ -5,14 +5,31 @@ use std::{ time::Duration, }; -const PORT: u16 = 43739; +use util::channel::ReleaseChannel; + const LOCALHOST: Ipv4Addr = Ipv4Addr::new(127, 0, 0, 1); -const ADDRESS: SocketAddr = SocketAddr::V4(SocketAddrV4::new(LOCALHOST, PORT)); -const INSTANCE_HANDSHAKE: &str = "Zed Editor Instance Running"; const CONNECT_TIMEOUT: Duration = Duration::from_millis(10); const RECEIVE_TIMEOUT: Duration = Duration::from_millis(35); const SEND_TIMEOUT: Duration = Duration::from_millis(20); +fn address() -> SocketAddr { + let port = match *util::channel::RELEASE_CHANNEL { + ReleaseChannel::Dev => 43737, + ReleaseChannel::Preview => 43738, + ReleaseChannel::Stable => 43739, + }; + + SocketAddr::V4(SocketAddrV4::new(LOCALHOST, port)) +} + +fn instance_handshake() -> &'static str { + match *util::channel::RELEASE_CHANNEL { + ReleaseChannel::Dev => "Zed Editor Dev Instance Running", + ReleaseChannel::Preview => "Zed Editor Preview Instance Running", + ReleaseChannel::Stable => "Zed Editor Stable Instance Running", + } +} + #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum IsOnlyInstance { Yes, @@ -24,7 +41,7 @@ pub fn ensure_only_instance() -> IsOnlyInstance { return IsOnlyInstance::No; } - let listener = match TcpListener::bind(ADDRESS) { + let listener = match TcpListener::bind(address()) { Ok(listener) => listener, Err(err) => { @@ -50,7 +67,7 @@ pub fn ensure_only_instance() -> IsOnlyInstance { _ = stream.set_nodelay(true); _ = stream.set_read_timeout(Some(SEND_TIMEOUT)); - _ = stream.write_all(INSTANCE_HANDSHAKE.as_bytes()); + _ = stream.write_all(instance_handshake().as_bytes()); } }); @@ -58,9 +75,9 @@ pub fn ensure_only_instance() -> IsOnlyInstance { } fn check_got_handshake() -> bool { - match TcpStream::connect_timeout(&ADDRESS, CONNECT_TIMEOUT) { + match TcpStream::connect_timeout(&address(), CONNECT_TIMEOUT) { Ok(mut stream) => { - let mut buf = vec![0u8; INSTANCE_HANDSHAKE.len()]; + let mut buf = vec![0u8; instance_handshake().len()]; stream.set_read_timeout(Some(RECEIVE_TIMEOUT)).unwrap(); if let Err(err) = stream.read_exact(&mut buf) { @@ -68,7 +85,7 @@ fn check_got_handshake() -> bool { return false; } - if buf == INSTANCE_HANDSHAKE.as_bytes() { + if buf == instance_handshake().as_bytes() { log::info!("Got instance handshake"); return true; } From caa29d57c2d82fbbcdc2f7d7ef6ec1d39969767c Mon Sep 17 00:00:00 2001 From: Julia Date: Fri, 7 Jul 2023 14:19:13 -0400 Subject: [PATCH 101/104] Avoid checking for duplicate instance when local DB is disabled --- crates/zed/src/only_instance.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/zed/src/only_instance.rs b/crates/zed/src/only_instance.rs index 0450b5908b..a8c4b30816 100644 --- a/crates/zed/src/only_instance.rs +++ b/crates/zed/src/only_instance.rs @@ -37,6 +37,10 @@ pub enum IsOnlyInstance { } pub fn ensure_only_instance() -> IsOnlyInstance { + if *db::ZED_STATELESS { + return IsOnlyInstance::Yes; + } + if check_got_handshake() { return IsOnlyInstance::No; } From 52a497be21d9a19ae9136d13ab524847d3b84daf Mon Sep 17 00:00:00 2001 From: "Joseph T. Lyons" Date: Sat, 8 Jul 2023 18:03:18 -0400 Subject: [PATCH 102/104] Remove code block for GitHub release notes Discord can directly render the Markdown now. --- .github/workflows/release_actions.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/release_actions.yml b/.github/workflows/release_actions.yml index 4ccab09cbe..71909ae177 100644 --- a/.github/workflows/release_actions.yml +++ b/.github/workflows/release_actions.yml @@ -16,8 +16,4 @@ jobs: Restart your Zed or head to https://zed.dev/releases/stable/latest to grab it. - ```md - # Changelog - ${{ github.event.release.body }} - ``` From 6e24ded2bcbab2b0798c8c1ed3b88165a30c5c47 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Mon, 10 Jul 2023 14:20:12 +0200 Subject: [PATCH 103/104] collab_ui: Add tooltip to branches popover (#2695) Z-2554 Release Notes: - N/A --- crates/collab_ui/src/collab_titlebar_item.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 73450e7c7d..ed3315ab5a 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -264,7 +264,8 @@ impl CollabTitlebarItem { MouseEventHandler::::new( 0, cx, - |mouse_state, _| { + |mouse_state, cx| { + enum BranchPopoverTooltip {} let style = git_style .in_state(self.branch_popover.is_some()) .style_for(mouse_state); @@ -274,6 +275,13 @@ impl CollabTitlebarItem { .with_margin_right(item_spacing) .aligned() .left() + .with_tooltip::( + 0, + "Recent branches".into(), + None, + theme.tooltip.clone(), + cx, + ) .into_any_named("title-project-branch") }, ) From 6c8cb6b2a9f8dbebb7e31df9035940b5ffd7659f Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Wed, 5 Jul 2023 10:54:28 +0200 Subject: [PATCH 104/104] project_search: display result count on cmd-enter It also focuses the first result (just like a normal enter). --- crates/search/src/project_search.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crates/search/src/project_search.rs b/crates/search/src/project_search.rs index 135194df6a..ebd504d02c 100644 --- a/crates/search/src/project_search.rs +++ b/crates/search/src/project_search.rs @@ -675,6 +675,9 @@ impl ProjectSearchView { if match_ranges.is_empty() { self.active_match_index = None; } else { + self.active_match_index = Some(0); + self.select_match(Direction::Next, cx); + self.update_match_index(cx); let prev_search_id = mem::replace(&mut self.search_id, self.model.read(cx).search_id); let is_new_search = self.search_id != prev_search_id; self.results_editor.update(cx, |editor, cx| {

|95Bo|MwrmaTccZfB)@R{+|BJ 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 literal 0 HcmV?d00001 diff --git a/crates/audio/Cargo.toml b/crates/audio/Cargo.toml new file mode 100644 index 0000000000..182e421eb8 --- /dev/null +++ b/crates/audio/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "audio" +version = "0.1.0" +edition = "2021" +publish = false + +[lib] +path = "src/audio.rs" +doctest = false + +[dependencies] +gpui = { path = "../gpui" } +collections = { path = "../collections" } +util = { path = "../util" } + +rodio = "0.17.1" + +log.workspace = true + +anyhow.workspace = true +parking_lot.workspace = true + +[dev-dependencies] diff --git a/crates/audio/src/assets.rs b/crates/audio/src/assets.rs new file mode 100644 index 0000000000..b58e1f6aee --- /dev/null +++ b/crates/audio/src/assets.rs @@ -0,0 +1,44 @@ +use std::{io::Cursor, sync::Arc}; + +use anyhow::Result; +use collections::HashMap; +use gpui::{AppContext, AssetSource}; +use rodio::{ + source::{Buffered, SamplesConverter}, + Decoder, Source, +}; + +type Sound = Buffered>>, f32>>; + +pub struct SoundRegistry { + cache: Arc>>, + assets: Box, +} + +impl SoundRegistry { + pub fn new(source: impl AssetSource) -> Arc { + Arc::new(Self { + cache: Default::default(), + assets: Box::new(source), + }) + } + + pub fn global(cx: &AppContext) -> Arc { + cx.global::>().clone() + } + + pub fn get(&self, name: &str) -> Result> { + if let Some(wav) = self.cache.lock().get(name) { + return Ok(wav.clone()); + } + + let path = format!("sounds/{}.wav", name); + let bytes = self.assets.load(&path)?.into_owned(); + let cursor = Cursor::new(bytes); + let source = Decoder::new(cursor)?.convert_samples::().buffered(); + + self.cache.lock().insert(name.to_string(), source.clone()); + + Ok(source) + } +} diff --git a/crates/audio/src/audio.rs b/crates/audio/src/audio.rs new file mode 100644 index 0000000000..fd3f4e0515 --- /dev/null +++ b/crates/audio/src/audio.rs @@ -0,0 +1,59 @@ +use assets::SoundRegistry; +use gpui::{AppContext, AssetSource}; +use rodio::{OutputStream, OutputStreamHandle}; +use util::ResultExt; + +mod assets; + +pub fn init(source: impl AssetSource, cx: &mut AppContext) { + cx.set_global(SoundRegistry::new(source)); + cx.set_global(Audio::new()); +} + +pub enum Sound { + Joined, + Leave, + Mute, + Unmute, +} + +impl Sound { + fn file(&self) -> &'static str { + match self { + Self::Joined => "joined", + Self::Leave => "leave", + Self::Mute => "mute", + Self::Unmute => "unmute", + } + } +} + +pub struct Audio { + _output_stream: Option, + output_handle: Option, +} + +impl Audio { + pub fn new() -> Self { + let (_output_stream, output_handle) = OutputStream::try_default().log_err().unzip(); + + Self { + _output_stream, + output_handle, + } + } + + pub fn play_sound(sound: Sound, cx: &AppContext) { + let this = cx.global::(); + + let Some(output_handle) = this.output_handle.as_ref() else { + return; + }; + + let Some(source) = SoundRegistry::global(cx).get(sound.file()).log_err() else { + return; + }; + + output_handle.play_raw(source).log_err(); + } +} diff --git a/crates/call/Cargo.toml b/crates/call/Cargo.toml index 86ff1a5543..61f3593247 100644 --- a/crates/call/Cargo.toml +++ b/crates/call/Cargo.toml @@ -19,6 +19,7 @@ test-support = [ ] [dependencies] +audio = { path = "../audio" } client = { path = "../client" } collections = { path = "../collections" } gpui = { path = "../gpui" } @@ -30,7 +31,6 @@ media = { path = "../media" } project = { path = "../project" } settings = { path = "../settings" } util = { path = "../util" } -rodio = "0.17.1" anyhow.workspace = true async-broadcast = "0.4" diff --git a/crates/call/src/call.rs b/crates/call/src/call.rs index 42cb5f2f87..74ce7c2e75 100644 --- a/crates/call/src/call.rs +++ b/crates/call/src/call.rs @@ -1,18 +1,16 @@ -mod assets; pub mod participant; pub mod room; use std::sync::Arc; use anyhow::{anyhow, Result}; -use assets::SoundRegistry; use client::{proto, Client, TypedEnvelope, User, UserStore}; use collections::HashSet; use futures::{future::Shared, FutureExt}; use postage::watch; use gpui::{ - AppContext, AssetSource, AsyncAppContext, Entity, ModelContext, ModelHandle, Subscription, + AppContext, AsyncAppContext, Entity, ModelContext, ModelHandle, Subscription, Task, WeakModelHandle, }; use project::Project; @@ -23,10 +21,8 @@ pub use room::Room; pub fn init( client: Arc, user_store: ModelHandle, - source: impl AssetSource, cx: &mut AppContext, ) { - cx.set_global(SoundRegistry::new(source)); let active_call = cx.add_model(|cx| ActiveCall::new(client, user_store, cx)); cx.set_global(active_call); } diff --git a/crates/call/src/room.rs b/crates/call/src/room.rs index b80e994fcf..10cfc862e9 100644 --- a/crates/call/src/room.rs +++ b/crates/call/src/room.rs @@ -1,9 +1,9 @@ use crate::{ - assets::SoundRegistry, participant::{LocalParticipant, ParticipantLocation, RemoteParticipant, RemoteVideoTrack}, IncomingCall, }; use anyhow::{anyhow, Result}; +use audio::{Audio, Sound}; use client::{ proto::{self, PeerId}, Client, TypedEnvelope, User, UserStore, @@ -19,30 +19,11 @@ use live_kit_client::{ }; use postage::stream::Stream; use project::Project; -use rodio::{OutputStream, OutputStreamHandle, Source}; use std::{future::Future, mem, pin::Pin, sync::Arc, time::Duration}; use util::{post_inc, ResultExt, TryFutureExt}; pub const RECONNECT_TIMEOUT: Duration = Duration::from_secs(30); -enum Sound { - Joined, - Leaved, - Mute, - Unmute, -} - -impl Sound { - fn file(&self) -> &'static str { - match self { - Self::Joined => "joined", - Self::Leaved => "leave", - Self::Mute => "mute", - Self::Unmute => "unmute", - } - } -} - #[derive(Clone, Debug, PartialEq, Eq)] pub enum Event { ParticipantLocationChanged { @@ -68,8 +49,6 @@ pub enum Event { pub struct Room { id: u64, live_kit: Option, - _sound_output_stream: Option, - sound_output_handle: Option, status: RoomStatus, shared_projects: HashSet>, joined_projects: HashSet>, @@ -173,6 +152,7 @@ impl Room { let connect = room.connect(&connection_info.server_url, &connection_info.token); cx.spawn(|this, mut cx| async move { connect.await?; + this.update(&mut cx, |this, cx| this.share_microphone(cx)) .await?; @@ -198,14 +178,11 @@ impl Room { let maintain_connection = cx.spawn_weak(|this, cx| Self::maintain_connection(this, client.clone(), cx).log_err()); - let (sound_output_stream, sound_output_handle) = - OutputStream::try_default().log_err().unzip(); + Audio::play_sound(Sound::Joined, cx); Self { id, live_kit: live_kit_room, - _sound_output_stream: sound_output_stream, - sound_output_handle, status: RoomStatus::Online, shared_projects: Default::default(), joined_projects: Default::default(), @@ -292,6 +269,7 @@ impl Room { room.apply_room_update(room_proto, cx)?; anyhow::Ok(()) })?; + Ok(room) }) } @@ -333,6 +311,8 @@ impl Room { } } + Audio::play_sound(Sound::Leave, cx); + self.status = RoomStatus::Offline; self.remote_participants.clear(); self.pending_participants.clear(); @@ -937,18 +917,6 @@ impl Room { }) } - fn play_sound(&self, sound: Sound, cx: &AppContext) { - let Some(output_handle) = self.sound_output_handle.as_ref() else { - return; - }; - - let Some(source) = SoundRegistry::global(cx).get(sound.file()) else { - return; - }; - - output_handle.play_raw(source.convert_samples()).log_err(); - } - pub fn join_project( &mut self, id: u64, @@ -962,8 +930,6 @@ impl Room { let project = Project::remote(id, client, user_store, language_registry, fs, cx.clone()).await?; - cx.read(|cx| this.read(cx).play_sound(Sound::Joined, cx)); - this.update(&mut cx, |this, cx| { this.joined_projects.retain(|project| { if let Some(project) = project.upgrade(cx) { @@ -1269,38 +1235,20 @@ impl Room { }) }) } - fn set_mute( - live_kit: &mut LiveKitRoom, - should_mute: bool, - cx: &mut ModelContext, - ) -> Result>> { - if !should_mute { - // clear user muting state. - live_kit.muted_by_user = false; - } - match &mut live_kit.microphone_track { - LocalTrack::None => Err(anyhow!("microphone was not shared")), - LocalTrack::Pending { muted, .. } => { - *muted = should_mute; - cx.notify(); - Ok(Task::Ready(Some(Ok(())))) - } - LocalTrack::Published { - track_publication, - muted, - } => { - *muted = should_mute; - cx.notify(); - Ok(cx.background().spawn(track_publication.set_mute(*muted))) - } - } - } + pub fn toggle_mute(&mut self, cx: &mut ModelContext) -> Result>> { let should_mute = !self.is_muted(); if let Some(live_kit) = self.live_kit.as_mut() { - let ret = Self::set_mute(live_kit, should_mute, cx); + let (ret_task, old_muted) = live_kit.set_mute(should_mute, cx)?; live_kit.muted_by_user = should_mute; - ret + + if old_muted == true && live_kit.deafened == true { + if let Some(task) = self.toggle_deafen(cx).ok() { + task.detach(); + } + } + + Ok(ret_task) } else { Err(anyhow!("LiveKit not started")) } @@ -1316,7 +1264,7 @@ impl Room { // When deafening, mute user's mic as well. // When undeafening, unmute user's mic unless it was manually muted prior to deafening. if live_kit.deafened || !live_kit.muted_by_user { - mute_task = Some(Self::set_mute(live_kit, live_kit.deafened, cx)?); + mute_task = Some(live_kit.set_mute(live_kit.deafened, cx)?.0); }; for participant in self.remote_participants.values() { for track in live_kit @@ -1389,6 +1337,48 @@ struct LiveKitRoom { _maintain_tracks: [Task<()>; 2], } +impl LiveKitRoom { + fn set_mute( + self: &mut LiveKitRoom, + should_mute: bool, + cx: &mut ModelContext, + ) -> Result<(Task>, bool)> { + if !should_mute { + // clear user muting state. + self.muted_by_user = false; + } + + let (result, old_muted) = match &mut self.microphone_track { + LocalTrack::None => Err(anyhow!("microphone was not shared")), + LocalTrack::Pending { muted, .. } => { + let old_muted = *muted; + *muted = should_mute; + cx.notify(); + Ok((Task::Ready(Some(Ok(()))), old_muted)) + } + LocalTrack::Published { + track_publication, + muted, + } => { + let old_muted = *muted; + *muted = should_mute; + cx.notify(); + Ok((cx.background().spawn(track_publication.set_mute(*muted)), old_muted)) + } + }?; + + if old_muted != should_mute { + if should_mute { + Audio::play_sound(Sound::Mute, cx); + } else { + Audio::play_sound(Sound::Unmute, cx); + } + } + + Ok((result, old_muted)) + } +} + enum LocalTrack { None, Pending { diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index c787287a0c..cc7263aa97 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -14,6 +14,7 @@ name = "seed" required-features = ["seed-support"] [dependencies] +audio = { path = "../audio" } collections = { path = "../collections" } live_kit_server = { path = "../live_kit_server" } rpc = { path = "../rpc" } diff --git a/crates/collab/src/tests.rs b/crates/collab/src/tests.rs index 5906eecee1..b1d0bedb2c 100644 --- a/crates/collab/src/tests.rs +++ b/crates/collab/src/tests.rs @@ -203,7 +203,8 @@ impl TestServer { language::init(cx); editor::init_settings(cx); workspace::init(app_state.clone(), cx); - call::init(client.clone(), user_store.clone(), (), cx); + audio::init((), cx); + call::init(client.clone(), user_store.clone(), cx); }); client diff --git a/crates/zed/Cargo.toml b/crates/zed/Cargo.toml index 6434d36951..97d7f717ce 100644 --- a/crates/zed/Cargo.toml +++ b/crates/zed/Cargo.toml @@ -16,6 +16,7 @@ name = "Zed" path = "src/main.rs" [dependencies] +audio = { path = "../audio" } activity_indicator = { path = "../activity_indicator" } auto_update = { path = "../auto_update" } breadcrumbs = { path = "../breadcrumbs" } diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 0fb540ece6..3da8c24617 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -180,6 +180,8 @@ fn main() { background_actions, }); cx.set_global(Arc::downgrade(&app_state)); + + audio::init(Assets, cx); auto_update::init(http.clone(), client::ZED_SERVER_URL.clone(), cx); workspace::init(app_state.clone(), cx); @@ -190,7 +192,7 @@ fn main() { theme_selector::init(cx); activity_indicator::init(cx); language_tools::init(cx); - call::init(app_state.client.clone(), app_state.user_store.clone(), Assets, cx); + call::init(app_state.client.clone(), app_state.user_store.clone(), cx); collab_ui::init(&app_state, cx); feedback::init(cx); welcome::init(cx); diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index 9d75ad9952..874fea6500 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -2160,7 +2160,8 @@ mod tests { state.initialize_workspace = initialize_workspace; state.build_window_options = build_window_options; theme::init((), cx); - call::init(app_state.client.clone(), app_state.user_store.clone(), (), cx); + audio::init((), cx); + call::init(app_state.client.clone(), app_state.user_store.clone(), cx); workspace::init(app_state.clone(), cx); Project::init_settings(cx); language::init(cx); From 0e4c9040914551d2c429e2bd5eedc9df4b4da2d6 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Mon, 3 Jul 2023 13:36:03 -0700 Subject: [PATCH 051/104] Add joined sound effect when new participants join the room --- crates/call/src/call.rs | 10 +++------- crates/call/src/room.rs | 7 ++++++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/crates/call/src/call.rs b/crates/call/src/call.rs index 74ce7c2e75..0a8f150194 100644 --- a/crates/call/src/call.rs +++ b/crates/call/src/call.rs @@ -10,19 +10,15 @@ use futures::{future::Shared, FutureExt}; use postage::watch; use gpui::{ - AppContext, AsyncAppContext, Entity, ModelContext, ModelHandle, Subscription, - Task, WeakModelHandle, + AppContext, AsyncAppContext, Entity, ModelContext, ModelHandle, Subscription, Task, + WeakModelHandle, }; use project::Project; pub use participant::ParticipantLocation; pub use room::Room; -pub fn init( - client: Arc, - user_store: ModelHandle, - cx: &mut AppContext, -) { +pub fn init(client: Arc, user_store: ModelHandle, cx: &mut AppContext) { let active_call = cx.add_model(|cx| ActiveCall::new(client, user_store, cx)); cx.set_global(active_call); } diff --git a/crates/call/src/room.rs b/crates/call/src/room.rs index 10cfc862e9..eed73ba1b1 100644 --- a/crates/call/src/room.rs +++ b/crates/call/src/room.rs @@ -663,6 +663,8 @@ impl Room { }, ); + Audio::play_sound(Sound::Joined, cx); + if let Some(live_kit) = this.live_kit.as_ref() { let video_tracks = live_kit.room.remote_video_tracks(&user.id.to_string()); @@ -1363,7 +1365,10 @@ impl LiveKitRoom { let old_muted = *muted; *muted = should_mute; cx.notify(); - Ok((cx.background().spawn(track_publication.set_mute(*muted)), old_muted)) + Ok(( + cx.background().spawn(track_publication.set_mute(*muted)), + old_muted, + )) } }?; From c700342a1c4fdc3b11265f81b6281dc54e0e80c0 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Mon, 3 Jul 2023 13:48:17 -0700 Subject: [PATCH 052/104] Guard against uninstantiated globals in tests --- crates/audio/src/audio.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/audio/src/audio.rs b/crates/audio/src/audio.rs index fd3f4e0515..0216bf47be 100644 --- a/crates/audio/src/audio.rs +++ b/crates/audio/src/audio.rs @@ -44,6 +44,10 @@ impl Audio { } pub fn play_sound(sound: Sound, cx: &AppContext) { + if !cx.has_global::() { + return; + } + let this = cx.global::(); let Some(output_handle) = this.output_handle.as_ref() else { From 0733e8d50f0ffa3339cb03c14b661ca2f4334d9f Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Mon, 3 Jul 2023 15:20:10 -0600 Subject: [PATCH 053/104] Remove editor::Cancel binding from vim When you hit in the command palette, it first editor::Cancel because the command palette is also a focused editor; this binding was catching before the `menu::Cancel` that you probably want. From looking at the uses of editor::Cancel it seems like the only way to trigger this is with in an editor. Rather than trying to hook into the existing editor cancel and add vim-specific behaviour, we'll instead take responsibility for binding directly to when necessary. Fixes: zed-industries/community#1347 --- assets/keymaps/vim.json | 10 ++++++++-- crates/vim/src/test.rs | 14 ++++++++++++++ crates/vim/src/test/vim_test_context.rs | 2 ++ crates/vim/src/vim.rs | 23 ++--------------------- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json index 86e5b51f19..e08ce47caf 100644 --- a/assets/keymaps/vim.json +++ b/assets/keymaps/vim.json @@ -93,7 +93,10 @@ ], "ctrl-o": "pane::GoBack", "ctrl-]": "editor::GoToDefinition", - "escape": "editor::Cancel", + "escape": [ + "vim::SwitchMode", + "Normal" + ], "0": "vim::StartOfLine", // When no number operator present, use start of line motion "1": [ "vim::Number", @@ -325,7 +328,10 @@ "bindings": { "tab": "vim::Tab", "enter": "vim::Enter", - "escape": "editor::Cancel" + "escape": [ + "vim::SwitchMode", + "Normal" + ] } } ] diff --git a/crates/vim/src/test.rs b/crates/vim/src/test.rs index b6c5b7ca51..a6efbd4da1 100644 --- a/crates/vim/src/test.rs +++ b/crates/vim/src/test.rs @@ -4,6 +4,7 @@ mod neovim_connection; mod vim_binding_test_context; mod vim_test_context; +use command_palette::CommandPalette; pub use neovim_backed_binding_test_context::*; pub use neovim_backed_test_context::*; pub use vim_binding_test_context::*; @@ -139,3 +140,16 @@ async fn test_indent_outdent(cx: &mut gpui::TestAppContext) { cx.simulate_keystrokes(["shift-v", "down", ">", ">"]); cx.assert_editor_state("aa\n b«b\n cˇ»c"); } + +#[gpui::test] +async fn test_escape_command_palette(cx: &mut gpui::TestAppContext) { + let mut cx = VimTestContext::new(cx, true).await; + + cx.set_state("aˇbc\n", Mode::Normal); + cx.simulate_keystrokes(["i", "cmd-shift-p"]); + + assert!(cx.workspace(|workspace, _| workspace.modal::().is_some())); + cx.simulate_keystroke("escape"); + assert!(!cx.workspace(|workspace, _| workspace.modal::().is_some())); + cx.assert_state("aˇbc\n", Mode::Insert); +} diff --git a/crates/vim/src/test/vim_test_context.rs b/crates/vim/src/test/vim_test_context.rs index 3e66d6bb1c..f9ba577231 100644 --- a/crates/vim/src/test/vim_test_context.rs +++ b/crates/vim/src/test/vim_test_context.rs @@ -21,12 +21,14 @@ impl<'a> VimTestContext<'a> { cx.update(|cx| { search::init(cx); crate::init(cx); + command_palette::init(cx); }); cx.update(|cx| { cx.update_global(|store: &mut SettingsStore, cx| { store.update_user_settings::(cx, |s| *s = Some(enabled)); }); + settings::KeymapFile::load_asset("keymaps/default.json", cx).unwrap(); settings::KeymapFile::load_asset("keymaps/vim.json", cx).unwrap(); }); diff --git a/crates/vim/src/vim.rs b/crates/vim/src/vim.rs index eae8643cf3..2bcc2254ee 100644 --- a/crates/vim/src/vim.rs +++ b/crates/vim/src/vim.rs @@ -12,7 +12,7 @@ mod visual; use anyhow::Result; use collections::CommandPaletteFilter; -use editor::{Bias, Cancel, Editor, EditorMode, Event}; +use editor::{Bias, Editor, EditorMode, Event}; use gpui::{ actions, impl_actions, AppContext, Subscription, ViewContext, ViewHandle, WeakViewHandle, WindowContext, @@ -64,22 +64,6 @@ pub fn init(cx: &mut AppContext) { Vim::update(cx, |vim, cx| vim.push_number(n, cx)); }); - // Editor Actions - cx.add_action(|_: &mut Editor, _: &Cancel, cx| { - // If we are in aren't in normal mode or have an active operator, swap to normal mode - // Otherwise forward cancel on to the editor - let vim = Vim::read(cx); - if vim.state.mode != Mode::Normal || vim.active_operator().is_some() { - WindowContext::defer(cx, |cx| { - Vim::update(cx, |state, cx| { - state.switch_mode(Mode::Normal, false, cx); - }); - }); - } else { - cx.propagate_action(); - } - }); - cx.add_action(|_: &mut Workspace, _: &Tab, cx| { Vim::active_editor_input_ignored(" ".into(), cx) }); @@ -109,10 +93,7 @@ pub fn observe_keystrokes(cx: &mut WindowContext) { cx.observe_keystrokes(|_keystroke, _result, handled_by, cx| { if let Some(handled_by) = handled_by { // Keystroke is handled by the vim system, so continue forward - // Also short circuit if it is the special cancel action - if handled_by.namespace() == "vim" - || (handled_by.namespace() == "editor" && handled_by.name() == "Cancel") - { + if handled_by.namespace() == "vim" { return true; } } From d5acfe8fc12e21fd01ded66cc3433795c9acf9aa Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Tue, 4 Jul 2023 00:13:04 -0400 Subject: [PATCH 054/104] Use theme store to pass `color_scheme` directly to components --- styles/package-lock.json | 64 ++++++++++++++++++- styles/package.json | 15 +++-- styles/src/build_themes.ts | 14 ++-- styles/src/component/icon_button.ts | 13 ++-- styles/src/component/text_button.ts | 17 +++-- styles/src/styleTree/editor.ts | 0 styles/src/style_tree/app.ts | 56 ++++++++-------- styles/src/style_tree/assistant.ts | 6 +- styles/src/style_tree/command_palette.ts | 6 +- styles/src/style_tree/contact_finder.ts | 8 ++- styles/src/style_tree/contact_list.ts | 6 +- styles/src/style_tree/contact_notification.ts | 6 +- styles/src/style_tree/contacts_popover.ts | 6 +- styles/src/style_tree/context_menu.ts | 6 +- styles/src/style_tree/copilot.ts | 6 +- styles/src/style_tree/editor.ts | 9 ++- styles/src/style_tree/feedback.ts | 6 +- styles/src/style_tree/hover_popover.ts | 6 +- .../style_tree/incoming_call_notification.ts | 8 +-- styles/src/style_tree/picker.ts | 6 +- styles/src/style_tree/project_diagnostics.ts | 6 +- styles/src/style_tree/project_panel.ts | 23 +++---- .../style_tree/project_shared_notification.ts | 8 +-- styles/src/style_tree/search.ts | 6 +- styles/src/style_tree/shared_screen.ts | 6 +- .../style_tree/simple_message_notification.ts | 6 +- styles/src/style_tree/status_bar.ts | 6 +- styles/src/style_tree/tab_bar.ts | 6 +- styles/src/style_tree/terminal.ts | 6 +- styles/src/style_tree/titlebar.ts | 20 ++++-- .../src/style_tree/toolbar_dropdown_menu.ts | 6 +- styles/src/style_tree/tooltip.ts | 6 +- styles/src/style_tree/update_notification.ts | 6 +- styles/src/style_tree/welcome.ts | 6 +- styles/src/style_tree/workspace.ts | 14 ++-- styles/src/theme/index.ts | 21 ++++++ 36 files changed, 280 insertions(+), 136 deletions(-) delete mode 100644 styles/src/styleTree/editor.ts diff --git a/styles/package-lock.json b/styles/package-lock.json index 3f73a0b4e5..6fc5f746e5 100644 --- a/styles/package-lock.json +++ b/styles/package-lock.json @@ -27,7 +27,8 @@ "ts-node": "^10.9.1", "typescript": "^5.1.5", "utility-types": "^3.10.0", - "vitest": "^0.32.0" + "vitest": "^0.32.0", + "zustand": "^4.3.8" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -2595,6 +2596,12 @@ "node": ">= 0.8" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "peer": true + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2706,6 +2713,18 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/loupe": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", @@ -3292,6 +3311,18 @@ } ] }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -4025,6 +4056,14 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/utility-types": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", @@ -4305,6 +4344,29 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zustand": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.8.tgz", + "integrity": "sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "immer": ">=9.0", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } } } } diff --git a/styles/package.json b/styles/package.json index d82bbb7e81..16e95d90d5 100644 --- a/styles/package.json +++ b/styles/package.json @@ -16,21 +16,22 @@ "@tokens-studio/types": "^0.2.3", "@types/chroma-js": "^2.4.0", "@types/node": "^18.14.1", + "@typescript-eslint/eslint-plugin": "^5.60.1", + "@typescript-eslint/parser": "^5.60.1", + "@vitest/coverage-v8": "^0.32.0", "ayu": "^8.0.1", "chroma-js": "^2.4.2", "deepmerge": "^4.3.0", + "eslint": "^8.43.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "^2.27.5", "json-schema-to-typescript": "^13.0.2", "toml": "^3.0.0", "ts-deepmerge": "^6.0.3", "ts-node": "^10.9.1", + "typescript": "^5.1.5", "utility-types": "^3.10.0", "vitest": "^0.32.0", - "@typescript-eslint/eslint-plugin": "^5.60.1", - "@typescript-eslint/parser": "^5.60.1", - "@vitest/coverage-v8": "^0.32.0", - "eslint": "^8.43.0", - "eslint-import-resolver-typescript": "^3.5.5", - "eslint-plugin-import": "^2.27.5", - "typescript": "^5.1.5" + "zustand": "^4.3.8" } } diff --git a/styles/src/build_themes.ts b/styles/src/build_themes.ts index 5a091719df..a9cbad94e7 100644 --- a/styles/src/build_themes.ts +++ b/styles/src/build_themes.ts @@ -4,6 +4,7 @@ import * as path from "path" import app from "./style_tree/app" import { ColorScheme, create_color_scheme } from "./theme/color_scheme" import { themes } from "./themes" +import { useThemeStore } from "./theme" const assets_directory = `${__dirname}/../../assets` const temp_directory = fs.mkdtempSync(path.join(tmpdir(), "build-themes")) @@ -20,10 +21,17 @@ function clear_themes(theme_directory: string) { } } +const all_themes: ColorScheme[] = themes.map((theme) => + create_color_scheme(theme) +) + function write_themes(themes: ColorScheme[], output_directory: string) { clear_themes(output_directory) for (const color_scheme of themes) { - const style_tree = app(color_scheme) + const { setTheme } = useThemeStore.getState() + setTheme(color_scheme) + + const style_tree = app() const style_tree_json = JSON.stringify(style_tree, null, 2) const temp_path = path.join(temp_directory, `${color_scheme.name}.json`) const out_path = path.join( @@ -36,8 +44,4 @@ function write_themes(themes: ColorScheme[], output_directory: string) { } } -const all_themes: ColorScheme[] = themes.map((theme) => - create_color_scheme(theme) -) - write_themes(all_themes, `${assets_directory}/themes`) diff --git a/styles/src/component/icon_button.ts b/styles/src/component/icon_button.ts index 79891c2477..18b900e833 100644 --- a/styles/src/component/icon_button.ts +++ b/styles/src/component/icon_button.ts @@ -1,6 +1,6 @@ import { interactive, toggleable } from "../element" import { background, foreground } from "../style_tree/components" -import { ColorScheme } from "../theme/color_scheme" +import { useTheme, ColorScheme } from "../theme" export type Margin = { top: number @@ -22,10 +22,9 @@ type ToggleableIconButtonOptions = IconButtonOptions & { active_color?: keyof ColorScheme["lowest"] } -export function icon_button( - theme: ColorScheme, - { color, margin, layer }: IconButtonOptions -) { +export function icon_button({ color, margin, layer }: IconButtonOptions) { + const theme = useTheme() + if (!color) color = "base" const m = { @@ -75,8 +74,8 @@ export function toggleable_icon_button( return toggleable({ state: { - inactive: icon_button(theme, { color, margin }), - active: icon_button(theme, { + inactive: icon_button({ color, margin }), + active: icon_button({ color: active_color ? active_color : color, margin, layer: theme.middle, diff --git a/styles/src/component/text_button.ts b/styles/src/component/text_button.ts index 477c2515e3..50737f9766 100644 --- a/styles/src/component/text_button.ts +++ b/styles/src/component/text_button.ts @@ -5,7 +5,7 @@ import { foreground, text, } from "../style_tree/components" -import { ColorScheme } from "../theme/color_scheme" +import { useTheme, ColorScheme } from "../theme" import { Margin } from "./icon_button" interface TextButtonOptions { @@ -22,10 +22,13 @@ type ToggleableTextButtonOptions = TextButtonOptions & { active_color?: keyof ColorScheme["lowest"] } -export function text_button( - theme: ColorScheme, - { color, layer, margin, text_properties }: TextButtonOptions -) { +export function text_button({ + color, + layer, + margin, + text_properties, +}: TextButtonOptions) { + const theme = useTheme() if (!color) color = "base" const text_options: TextProperties = { @@ -79,8 +82,8 @@ export function toggleable_text_button( return toggleable({ state: { - inactive: text_button(theme, { color, margin }), - active: text_button(theme, { + inactive: text_button({ color, margin }), + active: text_button({ color: active_color ? active_color : color, margin, layer: theme.middle, diff --git a/styles/src/styleTree/editor.ts b/styles/src/styleTree/editor.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/styles/src/style_tree/app.ts b/styles/src/style_tree/app.ts index 684614d073..e4bf232b62 100644 --- a/styles/src/style_tree/app.ts +++ b/styles/src/style_tree/app.ts @@ -17,45 +17,47 @@ import terminal from "./terminal" import contact_list from "./contact_list" import toolbar_dropdown_menu from "./toolbar_dropdown_menu" import incoming_call_notification from "./incoming_call_notification" -import { ColorScheme } from "../theme/color_scheme" import welcome from "./welcome" import copilot from "./copilot" import assistant from "./assistant" import { titlebar } from "./titlebar" import editor from "./editor" import feedback from "./feedback" +import { useTheme } from "../common" + +export default function app(): any { + const theme = useTheme() -export default function app(theme: ColorScheme): any { return { meta: { name: theme.name, is_light: theme.is_light, }, - command_palette: command_palette(theme), - contact_notification: contact_notification(theme), - project_shared_notification: project_shared_notification(theme), - incoming_call_notification: incoming_call_notification(theme), - picker: picker(theme), - workspace: workspace(theme), - titlebar: titlebar(theme), - copilot: copilot(theme), - welcome: welcome(theme), - context_menu: context_menu(theme), - editor: editor(theme), - project_diagnostics: project_diagnostics(theme), - project_panel: project_panel(theme), - contacts_popover: contacts_popover(theme), - contact_finder: contact_finder(theme), - contact_list: contact_list(theme), - toolbar_dropdown_menu: toolbar_dropdown_menu(theme), - search: search(theme), - shared_screen: shared_screen(theme), - update_notification: update_notification(theme), - simple_message_notification: simple_message_notification(theme), - tooltip: tooltip(theme), - terminal: terminal(theme), - assistant: assistant(theme), - feedback: feedback(theme), + command_palette: command_palette(), + contact_notification: contact_notification(), + project_shared_notification: project_shared_notification(), + incoming_call_notification: incoming_call_notification(), + picker: picker(), + workspace: workspace(), + titlebar: titlebar(), + copilot: copilot(), + welcome: welcome(), + context_menu: context_menu(), + editor: editor(), + project_diagnostics: project_diagnostics(), + project_panel: project_panel(), + contacts_popover: contacts_popover(), + contact_finder: contact_finder(), + contact_list: contact_list(), + toolbar_dropdown_menu: toolbar_dropdown_menu(), + search: search(), + shared_screen: shared_screen(), + update_notification: update_notification(), + simple_message_notification: simple_message_notification(), + tooltip: tooltip(), + terminal: terminal(), + assistant: assistant(), + feedback: feedback(), color_scheme: { ...theme, players: Object.values(theme.players), diff --git a/styles/src/style_tree/assistant.ts b/styles/src/style_tree/assistant.ts index bdde221aca..6df02a0e33 100644 --- a/styles/src/style_tree/assistant.ts +++ b/styles/src/style_tree/assistant.ts @@ -1,8 +1,10 @@ -import { ColorScheme } from "../theme/color_scheme" import { text, border, background, foreground } from "./components" import { interactive } from "../element" +import { useTheme } from "../theme" + +export default function assistant(): any { + const theme = useTheme() -export default function assistant(theme: ColorScheme): any { return { container: { background: background(theme.highest), diff --git a/styles/src/style_tree/command_palette.ts b/styles/src/style_tree/command_palette.ts index 289deef54b..2f7404c8d4 100644 --- a/styles/src/style_tree/command_palette.ts +++ b/styles/src/style_tree/command_palette.ts @@ -1,9 +1,11 @@ -import { ColorScheme } from "../theme/color_scheme" import { with_opacity } from "../theme/color" import { text, background } from "./components" import { toggleable } from "../element" +import { useTheme } from "../theme" + +export default function command_palette(): any { + const theme = useTheme() -export default function command_palette(theme: ColorScheme): any { const key = toggleable({ base: { text: text(theme.highest, "mono", "variant", "default", { diff --git a/styles/src/style_tree/contact_finder.ts b/styles/src/style_tree/contact_finder.ts index e61d100264..2d57e16dfd 100644 --- a/styles/src/style_tree/contact_finder.ts +++ b/styles/src/style_tree/contact_finder.ts @@ -1,8 +1,10 @@ import picker from "./picker" -import { ColorScheme } from "../theme/color_scheme" import { background, border, foreground, text } from "./components" +import { useTheme } from "../theme" + +export default function contact_finder(): any { + const theme = useTheme() -export default function contact_finder(theme: ColorScheme): any { const side_margin = 6 const contact_button = { background: background(theme.middle, "variant"), @@ -12,7 +14,7 @@ export default function contact_finder(theme: ColorScheme): any { corner_radius: 8, } - const picker_style = picker(theme) + const picker_style = picker() const picker_input = { background: background(theme.middle, "on"), corner_radius: 6, diff --git a/styles/src/style_tree/contact_list.ts b/styles/src/style_tree/contact_list.ts index 93f88e2d4a..1955231f59 100644 --- a/styles/src/style_tree/contact_list.ts +++ b/styles/src/style_tree/contact_list.ts @@ -1,4 +1,3 @@ -import { ColorScheme } from "../theme/color_scheme" import { background, border, @@ -7,7 +6,10 @@ import { text, } from "./components" import { interactive, toggleable } from "../element" -export default function contacts_panel(theme: ColorScheme): any { +import { useTheme } from "../theme" +export default function contacts_panel(): any { + const theme = useTheme() + const name_margin = 8 const side_padding = 12 diff --git a/styles/src/style_tree/contact_notification.ts b/styles/src/style_tree/contact_notification.ts index 8de5496d91..365e3a646d 100644 --- a/styles/src/style_tree/contact_notification.ts +++ b/styles/src/style_tree/contact_notification.ts @@ -1,8 +1,10 @@ -import { ColorScheme } from "../theme/color_scheme" import { background, foreground, text } from "./components" import { interactive } from "../element" +import { useTheme } from "../theme" + +export default function contact_notification(): any { + const theme = useTheme() -export default function contact_notification(theme: ColorScheme): any { const avatar_size = 12 const header_padding = 8 diff --git a/styles/src/style_tree/contacts_popover.ts b/styles/src/style_tree/contacts_popover.ts index 4e3f8899e0..0ce63d088a 100644 --- a/styles/src/style_tree/contacts_popover.ts +++ b/styles/src/style_tree/contacts_popover.ts @@ -1,7 +1,9 @@ -import { ColorScheme } from "../theme/color_scheme" +import { useTheme } from "../theme" import { background, border } from "./components" -export default function contacts_popover(theme: ColorScheme): any { +export default function contacts_popover(): any { + const theme = useTheme() + return { background: background(theme.middle), corner_radius: 6, diff --git a/styles/src/style_tree/context_menu.ts b/styles/src/style_tree/context_menu.ts index af45942d2d..d4266a71fe 100644 --- a/styles/src/style_tree/context_menu.ts +++ b/styles/src/style_tree/context_menu.ts @@ -1,8 +1,10 @@ -import { ColorScheme } from "../theme/color_scheme" import { background, border, border_color, text } from "./components" import { interactive, toggleable } from "../element" +import { useTheme } from "../theme" + +export default function context_menu(): any { + const theme = useTheme() -export default function context_menu(theme: ColorScheme): any { return { background: background(theme.middle), corner_radius: 10, diff --git a/styles/src/style_tree/copilot.ts b/styles/src/style_tree/copilot.ts index eee6880e0c..f002db5ef5 100644 --- a/styles/src/style_tree/copilot.ts +++ b/styles/src/style_tree/copilot.ts @@ -1,7 +1,9 @@ -import { ColorScheme } from "../theme/color_scheme" import { background, border, foreground, svg, text } from "./components" import { interactive } from "../element" -export default function copilot(theme: ColorScheme): any { +import { useTheme } from "../theme" +export default function copilot(): any { + const theme = useTheme() + const content_width = 264 const cta_button = diff --git a/styles/src/style_tree/editor.ts b/styles/src/style_tree/editor.ts index af58276d16..31fa86110d 100644 --- a/styles/src/style_tree/editor.ts +++ b/styles/src/style_tree/editor.ts @@ -1,5 +1,5 @@ import { with_opacity } from "../theme/color" -import { ColorScheme, Layer, StyleSets } from "../theme/color_scheme" +import { Layer, StyleSets } from "../theme/color_scheme" import { background, border, @@ -11,8 +11,11 @@ import hover_popover from "./hover_popover" import { build_syntax } from "../theme/syntax" import { interactive, toggleable } from "../element" +import { useTheme } from "../theme" + +export default function editor(): any { + const theme = useTheme() -export default function editor(theme: ColorScheme): any { const { is_light } = theme const layer = theme.highest @@ -248,7 +251,7 @@ export default function editor(theme: ColorScheme): any { invalid_hint_diagnostic: diagnostic(theme.middle, "base"), invalid_information_diagnostic: diagnostic(theme.middle, "base"), invalid_warning_diagnostic: diagnostic(theme.middle, "base"), - hover_popover: hover_popover(theme), + hover_popover: hover_popover(), link_definition: { color: syntax.link_uri.color, underline: syntax.link_uri.underline, diff --git a/styles/src/style_tree/feedback.ts b/styles/src/style_tree/feedback.ts index 9217b60929..2bb63e951b 100644 --- a/styles/src/style_tree/feedback.ts +++ b/styles/src/style_tree/feedback.ts @@ -1,8 +1,10 @@ -import { ColorScheme } from "../theme/color_scheme" import { background, border, text } from "./components" import { interactive } from "../element" +import { useTheme } from "../theme" + +export default function feedback(): any { + const theme = useTheme() -export default function feedback(theme: ColorScheme): any { return { submit_button: interactive({ base: { diff --git a/styles/src/style_tree/hover_popover.ts b/styles/src/style_tree/hover_popover.ts index f469505741..80f2250349 100644 --- a/styles/src/style_tree/hover_popover.ts +++ b/styles/src/style_tree/hover_popover.ts @@ -1,7 +1,9 @@ -import { ColorScheme } from "../theme/color_scheme" +import { useTheme } from "../theme" import { background, border, foreground, text } from "./components" -export default function hover_popover(theme: ColorScheme): any { +export default function hover_popover(): any { + const theme = useTheme() + const base_container = { background: background(theme.middle), corner_radius: 8, diff --git a/styles/src/style_tree/incoming_call_notification.ts b/styles/src/style_tree/incoming_call_notification.ts index ca46596e57..294ec00a73 100644 --- a/styles/src/style_tree/incoming_call_notification.ts +++ b/styles/src/style_tree/incoming_call_notification.ts @@ -1,9 +1,9 @@ -import { ColorScheme } from "../theme/color_scheme" +import { useTheme } from "../theme" import { background, border, text } from "./components" -export default function incoming_call_notification( - theme: ColorScheme -): unknown { +export default function incoming_call_notification(): unknown { + const theme = useTheme() + const avatar_size = 48 return { window_height: 74, diff --git a/styles/src/style_tree/picker.ts b/styles/src/style_tree/picker.ts index 7ca76cd85f..d57021efb8 100644 --- a/styles/src/style_tree/picker.ts +++ b/styles/src/style_tree/picker.ts @@ -1,9 +1,11 @@ -import { ColorScheme } from "../theme/color_scheme" import { with_opacity } from "../theme/color" import { background, border, text } from "./components" import { interactive, toggleable } from "../element" +import { useTheme } from "../theme" + +export default function picker(): any { + const theme = useTheme() -export default function picker(theme: ColorScheme): any { const container = { background: background(theme.lowest), border: border(theme.lowest), diff --git a/styles/src/style_tree/project_diagnostics.ts b/styles/src/style_tree/project_diagnostics.ts index 5962b98a26..1c13b31a4a 100644 --- a/styles/src/style_tree/project_diagnostics.ts +++ b/styles/src/style_tree/project_diagnostics.ts @@ -1,7 +1,9 @@ -import { ColorScheme } from "../theme/color_scheme" +import { useTheme } from "../theme" import { background, text } from "./components" -export default function project_diagnostics(theme: ColorScheme): any { +export default function project_diagnostics(): any { + const theme = useTheme() + return { background: background(theme.highest), tab_icon_spacing: 4, diff --git a/styles/src/style_tree/project_panel.ts b/styles/src/style_tree/project_panel.ts index d1024778f1..af997d0a6e 100644 --- a/styles/src/style_tree/project_panel.ts +++ b/styles/src/style_tree/project_panel.ts @@ -1,4 +1,3 @@ -import { ColorScheme } from "../theme/color_scheme" import { with_opacity } from "../theme/color" import { Border, @@ -10,7 +9,10 @@ import { } from "./components" import { interactive, toggleable } from "../element" import merge from "ts-deepmerge" -export default function project_panel(theme: ColorScheme): any { +import { useTheme } from "../theme" +export default function project_panel(): any { + const theme = useTheme() + const { is_light } = theme type EntryStateProps = { @@ -65,13 +67,12 @@ export default function project_panel(theme: ColorScheme): any { const unselected_hovered_style = merge( base_properties, { background: background(theme.middle, "hovered") }, - unselected?.hovered ?? {}, + unselected?.hovered ?? {} ) const unselected_clicked_style = merge( base_properties, - { background: background(theme.middle, "pressed"), } - , - unselected?.clicked ?? {}, + { background: background(theme.middle, "pressed") }, + unselected?.clicked ?? {} ) const selected_default_style = merge( base_properties, @@ -79,18 +80,15 @@ export default function project_panel(theme: ColorScheme): any { background: background(theme.lowest), text: text(theme.lowest, "sans", { size: "sm" }), }, - selected_style?.default ?? {}, - + selected_style?.default ?? {} ) const selected_hovered_style = merge( base_properties, { background: background(theme.lowest, "hovered"), text: text(theme.lowest, "sans", { size: "sm" }), - }, - selected_style?.hovered ?? {}, - + selected_style?.hovered ?? {} ) const selected_clicked_style = merge( base_properties, @@ -98,8 +96,7 @@ export default function project_panel(theme: ColorScheme): any { background: background(theme.lowest, "pressed"), text: text(theme.lowest, "sans", { size: "sm" }), }, - selected_style?.clicked ?? {}, - + selected_style?.clicked ?? {} ) return toggleable({ diff --git a/styles/src/style_tree/project_shared_notification.ts b/styles/src/style_tree/project_shared_notification.ts index ffda0f4b70..e7c1dcedd5 100644 --- a/styles/src/style_tree/project_shared_notification.ts +++ b/styles/src/style_tree/project_shared_notification.ts @@ -1,9 +1,9 @@ -import { ColorScheme } from "../theme/color_scheme" +import { useTheme } from "../theme" import { background, border, text } from "./components" -export default function project_shared_notification( - theme: ColorScheme -): unknown { +export default function project_shared_notification(): unknown { + const theme = useTheme() + const avatar_size = 48 return { window_height: 74, diff --git a/styles/src/style_tree/search.ts b/styles/src/style_tree/search.ts index df260f95b7..5c16d03233 100644 --- a/styles/src/style_tree/search.ts +++ b/styles/src/style_tree/search.ts @@ -1,9 +1,11 @@ -import { ColorScheme } from "../theme/color_scheme" import { with_opacity } from "../theme/color" import { background, border, foreground, text } from "./components" import { interactive, toggleable } from "../element" +import { useTheme } from "../theme" + +export default function search(): any { + const theme = useTheme() -export default function search(theme: ColorScheme): any { // Search input const editor = { background: background(theme.highest), diff --git a/styles/src/style_tree/shared_screen.ts b/styles/src/style_tree/shared_screen.ts index b57c483f1c..aca7fd7f07 100644 --- a/styles/src/style_tree/shared_screen.ts +++ b/styles/src/style_tree/shared_screen.ts @@ -1,7 +1,9 @@ -import { ColorScheme } from "../theme/color_scheme" +import { useTheme } from "../theme" import { background } from "./components" -export default function sharedScreen(theme: ColorScheme) { +export default function sharedScreen() { + const theme = useTheme() + return { background: background(theme.highest), } diff --git a/styles/src/style_tree/simple_message_notification.ts b/styles/src/style_tree/simple_message_notification.ts index 0b5c1e0c29..35133f04a2 100644 --- a/styles/src/style_tree/simple_message_notification.ts +++ b/styles/src/style_tree/simple_message_notification.ts @@ -1,8 +1,10 @@ -import { ColorScheme } from "../theme/color_scheme" import { background, border, foreground, text } from "./components" import { interactive } from "../element" +import { useTheme } from "../theme" + +export default function simple_message_notification(): any { + const theme = useTheme() -export default function simple_message_notification(theme: ColorScheme): any { const header_padding = 8 return { diff --git a/styles/src/style_tree/status_bar.ts b/styles/src/style_tree/status_bar.ts index bde40d570c..9aeea866f3 100644 --- a/styles/src/style_tree/status_bar.ts +++ b/styles/src/style_tree/status_bar.ts @@ -1,7 +1,9 @@ -import { ColorScheme } from "../theme/color_scheme" import { background, border, foreground, text } from "./components" import { interactive, toggleable } from "../element" -export default function status_bar(theme: ColorScheme): any { +import { useTheme } from "../common" +export default function status_bar(): any { + const theme = useTheme() + const layer = theme.lowest const status_container = { diff --git a/styles/src/style_tree/tab_bar.ts b/styles/src/style_tree/tab_bar.ts index 55fd2c314a..29769f9bae 100644 --- a/styles/src/style_tree/tab_bar.ts +++ b/styles/src/style_tree/tab_bar.ts @@ -1,9 +1,11 @@ -import { ColorScheme } from "../theme/color_scheme" import { with_opacity } from "../theme/color" import { text, border, background, foreground } from "./components" import { interactive, toggleable } from "../element" +import { useTheme } from "../common" + +export default function tab_bar(): any { + const theme = useTheme() -export default function tab_bar(theme: ColorScheme): any { const height = 32 const active_layer = theme.highest diff --git a/styles/src/style_tree/terminal.ts b/styles/src/style_tree/terminal.ts index e902aa4264..5b98eebfcd 100644 --- a/styles/src/style_tree/terminal.ts +++ b/styles/src/style_tree/terminal.ts @@ -1,6 +1,8 @@ -import { ColorScheme } from "../theme/color_scheme" +import { useTheme } from "../theme" + +export default function terminal() { + const theme = useTheme() -export default function terminal(theme: ColorScheme) { /** * Colors are controlled per-cell in the terminal grid. * Cells can be set to any of these more 'theme-capable' colors diff --git a/styles/src/style_tree/titlebar.ts b/styles/src/style_tree/titlebar.ts index 067d619bb5..4dbd8f08f9 100644 --- a/styles/src/style_tree/titlebar.ts +++ b/styles/src/style_tree/titlebar.ts @@ -1,7 +1,7 @@ -import { ColorScheme } from "../common" import { icon_button, toggleable_icon_button } from "../component/icon_button" import { toggleable_text_button } from "../component/text_button" import { interactive, toggleable } from "../element" +import { useTheme } from "../theme" import { with_opacity } from "../theme/color" import { background, border, foreground, text } from "./components" @@ -22,7 +22,9 @@ function build_spacing( } } -function call_controls(theme: ColorScheme) { +function call_controls() { + const theme = useTheme() + const button_height = 18 const space = build_spacing(TITLEBAR_HEIGHT, button_height, ITEM_SPACING) @@ -69,7 +71,9 @@ function call_controls(theme: ColorScheme) { * When logged in shows the user's avatar and a chevron, * When logged out only shows a chevron. */ -function user_menu(theme: ColorScheme) { +function user_menu() { + const theme = useTheme() + const button_height = 18 const space = build_spacing(TITLEBAR_HEIGHT, button_height, ITEM_SPACING) @@ -155,7 +159,9 @@ function user_menu(theme: ColorScheme) { } } -export function titlebar(theme: ColorScheme): any { +export function titlebar(): any { + const theme = useTheme() + const avatar_width = 15 const avatar_outer_width = avatar_width + 4 const follower_avatar_width = 14 @@ -237,14 +243,14 @@ export function titlebar(theme: ColorScheme): any { corner_radius: 6, }, - leave_call_button: icon_button(theme, { + leave_call_button: icon_button({ margin: { left: ITEM_SPACING / 2, right: ITEM_SPACING, }, }), - ...call_controls(theme), + ...call_controls(), toggle_contacts_button: toggleable_icon_button(theme, { margin: { @@ -261,6 +267,6 @@ export function titlebar(theme: ColorScheme): any { background: foreground(theme.lowest, "accent"), }, share_button: toggleable_text_button(theme, {}), - user_menu: user_menu(theme), + user_menu: user_menu(), } } diff --git a/styles/src/style_tree/toolbar_dropdown_menu.ts b/styles/src/style_tree/toolbar_dropdown_menu.ts index dc22ac73cf..97f29ab18c 100644 --- a/styles/src/style_tree/toolbar_dropdown_menu.ts +++ b/styles/src/style_tree/toolbar_dropdown_menu.ts @@ -1,7 +1,9 @@ -import { ColorScheme } from "../theme/color_scheme" import { background, border, text } from "./components" import { interactive, toggleable } from "../element" -export default function dropdown_menu(theme: ColorScheme): any { +import { useTheme } from "../theme" +export default function dropdown_menu(): any { + const theme = useTheme() + return { row_height: 30, background: background(theme.middle), diff --git a/styles/src/style_tree/tooltip.ts b/styles/src/style_tree/tooltip.ts index 2fa5db04d4..54a2d7b78d 100644 --- a/styles/src/style_tree/tooltip.ts +++ b/styles/src/style_tree/tooltip.ts @@ -1,7 +1,9 @@ -import { ColorScheme } from "../theme/color_scheme" +import { useTheme } from "../theme" import { background, border, text } from "./components" -export default function tooltip(theme: ColorScheme): any { +export default function tooltip(): any { + const theme = useTheme() + return { background: background(theme.middle), border: border(theme.middle), diff --git a/styles/src/style_tree/update_notification.ts b/styles/src/style_tree/update_notification.ts index d14e840450..2d0c36d74c 100644 --- a/styles/src/style_tree/update_notification.ts +++ b/styles/src/style_tree/update_notification.ts @@ -1,8 +1,10 @@ -import { ColorScheme } from "../theme/color_scheme" import { foreground, text } from "./components" import { interactive } from "../element" +import { useTheme } from "../theme" + +export default function update_notification(): any { + const theme = useTheme() -export default function update_notification(theme: ColorScheme): any { const header_padding = 8 return { diff --git a/styles/src/style_tree/welcome.ts b/styles/src/style_tree/welcome.ts index fad8dfe235..8ff15d5d26 100644 --- a/styles/src/style_tree/welcome.ts +++ b/styles/src/style_tree/welcome.ts @@ -1,4 +1,3 @@ -import { ColorScheme } from "../theme/color_scheme" import { with_opacity } from "../theme/color" import { border, @@ -9,8 +8,11 @@ import { svg, } from "./components" import { interactive } from "../element" +import { useTheme } from "../theme" + +export default function welcome(): any { + const theme = useTheme() -export default function welcome(theme: ColorScheme): any { const checkbox_base = { corner_radius: 4, padding: { diff --git a/styles/src/style_tree/workspace.ts b/styles/src/style_tree/workspace.ts index 0326de414a..5aee3c987d 100644 --- a/styles/src/style_tree/workspace.ts +++ b/styles/src/style_tree/workspace.ts @@ -1,4 +1,3 @@ -import { ColorScheme } from "../theme/color_scheme" import { with_opacity } from "../theme/color" import { background, @@ -11,9 +10,12 @@ import { import statusBar from "./status_bar" import tabBar from "./tab_bar" import { interactive } from "../element" - import { titlebar } from "./titlebar" -export default function workspace(theme: ColorScheme): any { +import { useTheme } from "../theme" + +export default function workspace(): any { + const theme = useTheme() + const { is_light } = theme return { @@ -85,7 +87,7 @@ export default function workspace(theme: ColorScheme): any { }, leader_border_opacity: 0.7, leader_border_width: 2.0, - tab_bar: tabBar(theme), + tab_bar: tabBar(), modal: { margin: { bottom: 52, @@ -123,8 +125,8 @@ export default function workspace(theme: ColorScheme): any { color: border_color(theme.lowest), width: 1, }, - status_bar: statusBar(theme), - titlebar: titlebar(theme), + status_bar: statusBar(), + titlebar: titlebar(), toolbar: { height: 34, background: background(theme.highest), diff --git a/styles/src/theme/index.ts b/styles/src/theme/index.ts index 22287bf669..100248b1a8 100644 --- a/styles/src/theme/index.ts +++ b/styles/src/theme/index.ts @@ -1,3 +1,24 @@ +import { create } from "zustand" +import { ColorScheme } from "./color_scheme" + +type ThemeState = { + theme: ColorScheme | undefined + setTheme: (theme: ColorScheme) => void +} + +export const useThemeStore = create((set) => ({ + theme: undefined, + setTheme: (theme) => set(() => ({ theme })), +})) + +export const useTheme = (): ColorScheme => { + const { theme } = useThemeStore.getState() + + if (!theme) throw new Error("Tried to use theme before it was loaded") + + return theme +} + export * from "./color_scheme" export * from "./ramps" export * from "./syntax" From 8a5e7047f0e59178e11eadd96a4a7b3ef417fbf7 Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Tue, 4 Jul 2023 00:32:27 -0400 Subject: [PATCH 055/104] Update a few more components --- styles/src/build_tokens.ts | 2 +- styles/src/theme/tokens/color_scheme.ts | 23 ++++++++++++-------- styles/src/theme/tokens/players.ts | 28 ++++++++++++++----------- 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/styles/src/build_tokens.ts b/styles/src/build_tokens.ts index e33c3712e6..f51e5eb6cf 100644 --- a/styles/src/build_tokens.ts +++ b/styles/src/build_tokens.ts @@ -60,7 +60,7 @@ function write_tokens(themes: ColorScheme[], tokens_directory: string) { for (const theme of themes) { const file_name = slugify(theme.name) + ".json" - const tokens = theme_tokens(theme) + const tokens = theme_tokens() const tokens_json = JSON.stringify(tokens, null, 2) const out_path = path.join(tokens_directory, file_name) fs.writeFileSync(out_path, tokens_json, { mode: 0o644 }) diff --git a/styles/src/theme/tokens/color_scheme.ts b/styles/src/theme/tokens/color_scheme.ts index a8ce4ec2d2..efbeaaa901 100644 --- a/styles/src/theme/tokens/color_scheme.ts +++ b/styles/src/theme/tokens/color_scheme.ts @@ -15,6 +15,7 @@ import { PlayersToken, players_token } from "./players" import { color_token } from "./token" import { Syntax } from "../syntax" import editor from "../../style_tree/editor" +import { useTheme } from "@/src/common" interface ColorSchemeTokens { name: SingleOtherToken @@ -39,12 +40,14 @@ const create_shadow_token = ( } } -const popover_shadow_token = (theme: ColorScheme): SingleBoxShadowToken => { +const popover_shadow_token = (): SingleBoxShadowToken => { + const theme = useTheme() const shadow = theme.popover_shadow return create_shadow_token(shadow, "popover_shadow") } -const modal_shadow_token = (theme: ColorScheme): SingleBoxShadowToken => { +const modal_shadow_token = (): SingleBoxShadowToken => { + const theme = useTheme() const shadow = theme.modal_shadow return create_shadow_token(shadow, "modal_shadow") } @@ -68,13 +71,15 @@ function syntax_highlight_style_color_tokens( }, {} as ThemeSyntaxColorTokens) } -const syntax_tokens = (theme: ColorScheme): ColorSchemeTokens["syntax"] => { - const syntax = editor(theme).syntax +const syntax_tokens = (): ColorSchemeTokens["syntax"] => { + const syntax = editor().syntax return syntax_highlight_style_color_tokens(syntax) } -export function theme_tokens(theme: ColorScheme): ColorSchemeTokens { +export function theme_tokens(): ColorSchemeTokens { + const theme = useTheme() + return { name: { name: "themeName", @@ -89,9 +94,9 @@ export function theme_tokens(theme: ColorScheme): ColorSchemeTokens { lowest: layer_token(theme.lowest, "lowest"), middle: layer_token(theme.middle, "middle"), highest: layer_token(theme.highest, "highest"), - popover_shadow: popover_shadow_token(theme), - modal_shadow: modal_shadow_token(theme), - players: players_token(theme), - syntax: syntax_tokens(theme), + popover_shadow: popover_shadow_token(), + modal_shadow: modal_shadow_token(), + players: players_token(), + syntax: syntax_tokens(), } } diff --git a/styles/src/theme/tokens/players.ts b/styles/src/theme/tokens/players.ts index 545a712ff1..85573a1a8f 100644 --- a/styles/src/theme/tokens/players.ts +++ b/styles/src/theme/tokens/players.ts @@ -1,12 +1,14 @@ import { SingleColorToken } from "@tokens-studio/types" import { color_token } from "./token" -import { ColorScheme, Players } from "../color_scheme" +import { Players } from "../color_scheme" +import { useTheme } from "@/src/common" export type PlayerToken = Record<"selection" | "cursor", SingleColorToken> export type PlayersToken = Record -function build_player_token(theme: ColorScheme, index: number): PlayerToken { +function build_player_token(index: number): PlayerToken { + const theme = useTheme() const player_number = index.toString() as keyof Players return { @@ -21,13 +23,15 @@ function build_player_token(theme: ColorScheme, index: number): PlayerToken { } } -export const players_token = (theme: ColorScheme): PlayersToken => ({ - "0": build_player_token(theme, 0), - "1": build_player_token(theme, 1), - "2": build_player_token(theme, 2), - "3": build_player_token(theme, 3), - "4": build_player_token(theme, 4), - "5": build_player_token(theme, 5), - "6": build_player_token(theme, 6), - "7": build_player_token(theme, 7), -}) +export const players_token = (): PlayersToken => { + return { + "0": build_player_token(0), + "1": build_player_token(1), + "2": build_player_token(2), + "3": build_player_token(3), + "4": build_player_token(4), + "5": build_player_token(5), + "6": build_player_token(6), + "7": build_player_token(7), + } +} From 5a1476a1e58c43e64d051e5af9786d8edaa85088 Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Tue, 4 Jul 2023 00:40:01 -0400 Subject: [PATCH 056/104] Remove unused `color_scheme` field in the theme --- crates/theme/src/theme.rs | 1 - styles/src/style_tree/app.ts | 17 +---------------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index e54dcdfd1e..20f0787826 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -65,7 +65,6 @@ pub struct Theme { pub assistant: AssistantStyle, pub feedback: FeedbackStyle, pub welcome: WelcomeStyle, - pub color_scheme: ColorScheme, pub titlebar: Titlebar, } diff --git a/styles/src/style_tree/app.ts b/styles/src/style_tree/app.ts index e4bf232b62..ccfdd60a98 100644 --- a/styles/src/style_tree/app.ts +++ b/styles/src/style_tree/app.ts @@ -57,21 +57,6 @@ export default function app(): any { tooltip: tooltip(), terminal: terminal(), assistant: assistant(), - feedback: feedback(), - color_scheme: { - ...theme, - players: Object.values(theme.players), - ramps: { - neutral: theme.ramps.neutral.colors(100, "hex"), - red: theme.ramps.red.colors(100, "hex"), - orange: theme.ramps.orange.colors(100, "hex"), - yellow: theme.ramps.yellow.colors(100, "hex"), - green: theme.ramps.green.colors(100, "hex"), - cyan: theme.ramps.cyan.colors(100, "hex"), - blue: theme.ramps.blue.colors(100, "hex"), - violet: theme.ramps.violet.colors(100, "hex"), - magenta: theme.ramps.magenta.colors(100, "hex"), - }, - }, + feedback: feedback() } } From c409059dc45e0a677bd61239c35405df6f26bbd1 Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Tue, 4 Jul 2023 00:41:13 -0400 Subject: [PATCH 057/104] Revert "Remove unused `color_scheme` field in the theme" This reverts commit 5a1476a1e58c43e64d051e5af9786d8edaa85088. --- crates/theme/src/theme.rs | 1 + styles/src/style_tree/app.ts | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index 20f0787826..e54dcdfd1e 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -65,6 +65,7 @@ pub struct Theme { pub assistant: AssistantStyle, pub feedback: FeedbackStyle, pub welcome: WelcomeStyle, + pub color_scheme: ColorScheme, pub titlebar: Titlebar, } diff --git a/styles/src/style_tree/app.ts b/styles/src/style_tree/app.ts index ccfdd60a98..e4bf232b62 100644 --- a/styles/src/style_tree/app.ts +++ b/styles/src/style_tree/app.ts @@ -57,6 +57,21 @@ export default function app(): any { tooltip: tooltip(), terminal: terminal(), assistant: assistant(), - feedback: feedback() + feedback: feedback(), + color_scheme: { + ...theme, + players: Object.values(theme.players), + ramps: { + neutral: theme.ramps.neutral.colors(100, "hex"), + red: theme.ramps.red.colors(100, "hex"), + orange: theme.ramps.orange.colors(100, "hex"), + yellow: theme.ramps.yellow.colors(100, "hex"), + green: theme.ramps.green.colors(100, "hex"), + cyan: theme.ramps.cyan.colors(100, "hex"), + blue: theme.ramps.blue.colors(100, "hex"), + violet: theme.ramps.violet.colors(100, "hex"), + magenta: theme.ramps.magenta.colors(100, "hex"), + }, + }, } } From a732b2e04347be269fc096ff5314035e4e492c8c Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Tue, 4 Jul 2023 00:44:12 -0400 Subject: [PATCH 058/104] Remove unused `color_scheme` field in the theme I totally didn't mean to commit this right to main T_T --- crates/theme/src/theme.rs | 1 - styles/src/style_tree/app.ts | 17 +---------------- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index e54dcdfd1e..20f0787826 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -65,7 +65,6 @@ pub struct Theme { pub assistant: AssistantStyle, pub feedback: FeedbackStyle, pub welcome: WelcomeStyle, - pub color_scheme: ColorScheme, pub titlebar: Titlebar, } diff --git a/styles/src/style_tree/app.ts b/styles/src/style_tree/app.ts index e4bf232b62..ccfdd60a98 100644 --- a/styles/src/style_tree/app.ts +++ b/styles/src/style_tree/app.ts @@ -57,21 +57,6 @@ export default function app(): any { tooltip: tooltip(), terminal: terminal(), assistant: assistant(), - feedback: feedback(), - color_scheme: { - ...theme, - players: Object.values(theme.players), - ramps: { - neutral: theme.ramps.neutral.colors(100, "hex"), - red: theme.ramps.red.colors(100, "hex"), - orange: theme.ramps.orange.colors(100, "hex"), - yellow: theme.ramps.yellow.colors(100, "hex"), - green: theme.ramps.green.colors(100, "hex"), - cyan: theme.ramps.cyan.colors(100, "hex"), - blue: theme.ramps.blue.colors(100, "hex"), - violet: theme.ramps.violet.colors(100, "hex"), - magenta: theme.ramps.magenta.colors(100, "hex"), - }, - }, + feedback: feedback() } } From 65dbb3892672447af726b5875dc1e529a8b9ccc1 Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Tue, 4 Jul 2023 01:20:56 -0400 Subject: [PATCH 059/104] `color_scheme` -> `theme` --- docs/zed/syntax-highlighting.md | 2 +- styles/src/build_themes.ts | 16 ++-- styles/src/build_tokens.ts | 17 ++-- styles/src/component/icon_button.ts | 14 +-- styles/src/component/text_button.ts | 14 +-- styles/src/style_tree/components.ts | 2 +- styles/src/style_tree/editor.ts | 4 +- .../{color_scheme.ts => create_theme.ts} | 4 +- styles/src/theme/index.ts | 10 +-- styles/src/theme/ramps.ts | 2 +- styles/src/theme/syntax.ts | 86 +++++++++---------- styles/src/theme/theme_config.ts | 67 --------------- styles/src/theme/tokens/layer.ts | 2 +- styles/src/theme/tokens/players.ts | 4 +- .../tokens/{color_scheme.ts => theme.ts} | 11 ++- 15 files changed, 93 insertions(+), 162 deletions(-) rename styles/src/theme/{color_scheme.ts => create_theme.ts} (98%) rename styles/src/theme/tokens/{color_scheme.ts => theme.ts} (93%) diff --git a/docs/zed/syntax-highlighting.md b/docs/zed/syntax-highlighting.md index 3878fcc6e9..d4331ee367 100644 --- a/docs/zed/syntax-highlighting.md +++ b/docs/zed/syntax-highlighting.md @@ -35,7 +35,7 @@ Match a property identifier and highlight it using the identifier `@property`. I ``` ```ts -function buildDefaultSyntax(colorScheme: ColorScheme): Partial { +function buildDefaultSyntax(colorScheme: Theme): Partial { // ... } ``` diff --git a/styles/src/build_themes.ts b/styles/src/build_themes.ts index a9cbad94e7..17575663a1 100644 --- a/styles/src/build_themes.ts +++ b/styles/src/build_themes.ts @@ -2,7 +2,7 @@ import * as fs from "fs" import { tmpdir } from "os" import * as path from "path" import app from "./style_tree/app" -import { ColorScheme, create_color_scheme } from "./theme/color_scheme" +import { Theme, create_theme } from "./theme/create_theme" import { themes } from "./themes" import { useThemeStore } from "./theme" @@ -21,22 +21,22 @@ function clear_themes(theme_directory: string) { } } -const all_themes: ColorScheme[] = themes.map((theme) => - create_color_scheme(theme) +const all_themes: Theme[] = themes.map((theme) => + create_theme(theme) ) -function write_themes(themes: ColorScheme[], output_directory: string) { +function write_themes(themes: Theme[], output_directory: string) { clear_themes(output_directory) - for (const color_scheme of themes) { + for (const theme of themes) { const { setTheme } = useThemeStore.getState() - setTheme(color_scheme) + setTheme(theme) const style_tree = app() const style_tree_json = JSON.stringify(style_tree, null, 2) - const temp_path = path.join(temp_directory, `${color_scheme.name}.json`) + const temp_path = path.join(temp_directory, `${theme.name}.json`) const out_path = path.join( output_directory, - `${color_scheme.name}.json` + `${theme.name}.json` ) fs.writeFileSync(temp_path, style_tree_json) fs.renameSync(temp_path, out_path) diff --git a/styles/src/build_tokens.ts b/styles/src/build_tokens.ts index f51e5eb6cf..fd6aa18ced 100644 --- a/styles/src/build_tokens.ts +++ b/styles/src/build_tokens.ts @@ -1,9 +1,9 @@ import * as fs from "fs" import * as path from "path" -import { ColorScheme, create_color_scheme } from "./common" +import { Theme, create_theme, useThemeStore } from "./common" import { themes } from "./themes" import { slugify } from "./utils/slugify" -import { theme_tokens } from "./theme/tokens/color_scheme" +import { theme_tokens } from "./theme/tokens/theme" const TOKENS_DIRECTORY = path.join(__dirname, "..", "target", "tokens") const TOKENS_FILE = path.join(TOKENS_DIRECTORY, "$themes.json") @@ -27,7 +27,7 @@ type TokenSet = { selected_token_sets: { [key: string]: "enabled" } } -function build_token_set_order(theme: ColorScheme[]): { +function build_token_set_order(theme: Theme[]): { token_set_order: string[] } { const token_set_order: string[] = theme.map((scheme) => @@ -36,7 +36,7 @@ function build_token_set_order(theme: ColorScheme[]): { return { token_set_order } } -function build_themes_index(theme: ColorScheme[]): TokenSet[] { +function build_themes_index(theme: Theme[]): TokenSet[] { const themes_index: TokenSet[] = theme.map((scheme, index) => { const id = `${scheme.is_light ? "light" : "dark"}_${scheme.name .toLowerCase() @@ -55,10 +55,13 @@ function build_themes_index(theme: ColorScheme[]): TokenSet[] { return themes_index } -function write_tokens(themes: ColorScheme[], tokens_directory: string) { +function write_tokens(themes: Theme[], tokens_directory: string) { clear_tokens(tokens_directory) for (const theme of themes) { + const { setTheme } = useThemeStore.getState() + setTheme(theme) + const file_name = slugify(theme.name) + ".json" const tokens = theme_tokens() const tokens_json = JSON.stringify(tokens, null, 2) @@ -80,8 +83,8 @@ function write_tokens(themes: ColorScheme[], tokens_directory: string) { console.log(`- ${METADATA_FILE} created`) } -const all_themes: ColorScheme[] = themes.map((theme) => - create_color_scheme(theme) +const all_themes: Theme[] = themes.map((theme) => + create_theme(theme) ) write_tokens(all_themes, TOKENS_DIRECTORY) diff --git a/styles/src/component/icon_button.ts b/styles/src/component/icon_button.ts index 18b900e833..6887fc7c30 100644 --- a/styles/src/component/icon_button.ts +++ b/styles/src/component/icon_button.ts @@ -1,6 +1,6 @@ import { interactive, toggleable } from "../element" import { background, foreground } from "../style_tree/components" -import { useTheme, ColorScheme } from "../theme" +import { useTheme, Theme } from "../theme" export type Margin = { top: number @@ -11,15 +11,15 @@ export type Margin = { interface IconButtonOptions { layer?: - | ColorScheme["lowest"] - | ColorScheme["middle"] - | ColorScheme["highest"] - color?: keyof ColorScheme["lowest"] + | Theme["lowest"] + | Theme["middle"] + | Theme["highest"] + color?: keyof Theme["lowest"] margin?: Partial } type ToggleableIconButtonOptions = IconButtonOptions & { - active_color?: keyof ColorScheme["lowest"] + active_color?: keyof Theme["lowest"] } export function icon_button({ color, margin, layer }: IconButtonOptions) { @@ -67,7 +67,7 @@ export function icon_button({ color, margin, layer }: IconButtonOptions) { } export function toggleable_icon_button( - theme: ColorScheme, + theme: Theme, { color, active_color, margin }: ToggleableIconButtonOptions ) { if (!color) color = "base" diff --git a/styles/src/component/text_button.ts b/styles/src/component/text_button.ts index 50737f9766..58b2a1cbf2 100644 --- a/styles/src/component/text_button.ts +++ b/styles/src/component/text_button.ts @@ -5,21 +5,21 @@ import { foreground, text, } from "../style_tree/components" -import { useTheme, ColorScheme } from "../theme" +import { useTheme, Theme } from "../theme" import { Margin } from "./icon_button" interface TextButtonOptions { layer?: - | ColorScheme["lowest"] - | ColorScheme["middle"] - | ColorScheme["highest"] - color?: keyof ColorScheme["lowest"] + | Theme["lowest"] + | Theme["middle"] + | Theme["highest"] + color?: keyof Theme["lowest"] margin?: Partial text_properties?: TextProperties } type ToggleableTextButtonOptions = TextButtonOptions & { - active_color?: keyof ColorScheme["lowest"] + active_color?: keyof Theme["lowest"] } export function text_button({ @@ -75,7 +75,7 @@ export function text_button({ } export function toggleable_text_button( - theme: ColorScheme, + theme: Theme, { color, active_color, margin }: ToggleableTextButtonOptions ) { if (!color) color = "base" diff --git a/styles/src/style_tree/components.ts b/styles/src/style_tree/components.ts index db32712f41..43a5fa9d28 100644 --- a/styles/src/style_tree/components.ts +++ b/styles/src/style_tree/components.ts @@ -1,5 +1,5 @@ import { font_families, font_sizes, FontWeight } from "../common" -import { Layer, Styles, StyleSets, Style } from "../theme/color_scheme" +import { Layer, Styles, StyleSets, Style } from "../theme/create_theme" function is_style_set(key: any): key is StyleSets { return [ diff --git a/styles/src/style_tree/editor.ts b/styles/src/style_tree/editor.ts index 31fa86110d..a2fec11642 100644 --- a/styles/src/style_tree/editor.ts +++ b/styles/src/style_tree/editor.ts @@ -1,5 +1,5 @@ import { with_opacity } from "../theme/color" -import { Layer, StyleSets } from "../theme/color_scheme" +import { Layer, StyleSets } from "../theme/create_theme" import { background, border, @@ -48,7 +48,7 @@ export default function editor(): any { } } - const syntax = build_syntax(theme) + const syntax = build_syntax() return { text_color: syntax.primary.color, diff --git a/styles/src/theme/color_scheme.ts b/styles/src/theme/create_theme.ts similarity index 98% rename from styles/src/theme/color_scheme.ts rename to styles/src/theme/create_theme.ts index 933c616053..dff4c3dbc4 100644 --- a/styles/src/theme/color_scheme.ts +++ b/styles/src/theme/create_theme.ts @@ -8,7 +8,7 @@ import { } from "./theme_config" import { get_ramps } from "./ramps" -export interface ColorScheme { +export interface Theme { name: string is_light: boolean @@ -105,7 +105,7 @@ export interface Style { foreground: string } -export function create_color_scheme(theme: ThemeConfig): ColorScheme { +export function create_theme(theme: ThemeConfig): Theme { const { name, appearance, diff --git a/styles/src/theme/index.ts b/styles/src/theme/index.ts index 100248b1a8..ca8aaa461f 100644 --- a/styles/src/theme/index.ts +++ b/styles/src/theme/index.ts @@ -1,9 +1,9 @@ import { create } from "zustand" -import { ColorScheme } from "./color_scheme" +import { Theme } from "./create_theme" type ThemeState = { - theme: ColorScheme | undefined - setTheme: (theme: ColorScheme) => void + theme: Theme | undefined + setTheme: (theme: Theme) => void } export const useThemeStore = create((set) => ({ @@ -11,7 +11,7 @@ export const useThemeStore = create((set) => ({ setTheme: (theme) => set(() => ({ theme })), })) -export const useTheme = (): ColorScheme => { +export const useTheme = (): Theme => { const { theme } = useThemeStore.getState() if (!theme) throw new Error("Tried to use theme before it was loaded") @@ -19,7 +19,7 @@ export const useTheme = (): ColorScheme => { return theme } -export * from "./color_scheme" +export * from "./create_theme" export * from "./ramps" export * from "./syntax" export * from "./theme_config" diff --git a/styles/src/theme/ramps.ts b/styles/src/theme/ramps.ts index 118d0c7274..c5b915a8c5 100644 --- a/styles/src/theme/ramps.ts +++ b/styles/src/theme/ramps.ts @@ -1,5 +1,5 @@ import chroma, { Color, Scale } from "chroma-js" -import { RampSet } from "./color_scheme" +import { RampSet } from "./create_theme" import { ThemeConfigInputColors, ThemeConfigInputColorsKeys, diff --git a/styles/src/theme/syntax.ts b/styles/src/theme/syntax.ts index c0d68e418e..540a1d0ff9 100644 --- a/styles/src/theme/syntax.ts +++ b/styles/src/theme/syntax.ts @@ -1,6 +1,5 @@ import deepmerge from "deepmerge" -import { FontWeight, font_weights } from "../common" -import { ColorScheme } from "./color_scheme" +import { FontWeight, font_weights, useTheme } from "../common" import chroma from "chroma-js" export interface SyntaxHighlightStyle { @@ -123,7 +122,9 @@ const default_syntax_highlight_style: Omit = { italic: false, } -function build_default_syntax(color_scheme: ColorScheme): Syntax { +function build_default_syntax(): Syntax { + const theme = useTheme() + // Make a temporary object that is allowed to be missing // the "color" property for each style const syntax: { @@ -141,8 +142,8 @@ function build_default_syntax(color_scheme: ColorScheme): Syntax { // predictive color distinct from any other color in the theme const predictive = chroma .mix( - color_scheme.ramps.neutral(0.4).hex(), - color_scheme.ramps.blue(0.4).hex(), + theme.ramps.neutral(0.4).hex(), + theme.ramps.blue(0.4).hex(), 0.45, "lch" ) @@ -151,32 +152,32 @@ function build_default_syntax(color_scheme: ColorScheme): Syntax { // hint color distinct from any other color in the theme const hint = chroma .mix( - color_scheme.ramps.neutral(0.6).hex(), - color_scheme.ramps.blue(0.4).hex(), + theme.ramps.neutral(0.6).hex(), + theme.ramps.blue(0.4).hex(), 0.45, "lch" ) .hex() const color = { - primary: color_scheme.ramps.neutral(1).hex(), - comment: color_scheme.ramps.neutral(0.71).hex(), - punctuation: color_scheme.ramps.neutral(0.86).hex(), + primary: theme.ramps.neutral(1).hex(), + comment: theme.ramps.neutral(0.71).hex(), + punctuation: theme.ramps.neutral(0.86).hex(), predictive: predictive, hint: hint, - emphasis: color_scheme.ramps.blue(0.5).hex(), - string: color_scheme.ramps.orange(0.5).hex(), - function: color_scheme.ramps.yellow(0.5).hex(), - type: color_scheme.ramps.cyan(0.5).hex(), - constructor: color_scheme.ramps.blue(0.5).hex(), - variant: color_scheme.ramps.blue(0.5).hex(), - property: color_scheme.ramps.blue(0.5).hex(), - enum: color_scheme.ramps.orange(0.5).hex(), - operator: color_scheme.ramps.orange(0.5).hex(), - number: color_scheme.ramps.green(0.5).hex(), - boolean: color_scheme.ramps.green(0.5).hex(), - constant: color_scheme.ramps.green(0.5).hex(), - keyword: color_scheme.ramps.blue(0.5).hex(), + emphasis: theme.ramps.blue(0.5).hex(), + string: theme.ramps.orange(0.5).hex(), + function: theme.ramps.yellow(0.5).hex(), + type: theme.ramps.cyan(0.5).hex(), + constructor: theme.ramps.blue(0.5).hex(), + variant: theme.ramps.blue(0.5).hex(), + property: theme.ramps.blue(0.5).hex(), + enum: theme.ramps.orange(0.5).hex(), + operator: theme.ramps.orange(0.5).hex(), + number: theme.ramps.green(0.5).hex(), + boolean: theme.ramps.green(0.5).hex(), + constant: theme.ramps.green(0.5).hex(), + keyword: theme.ramps.blue(0.5).hex(), } // Then assign colors and use Syntax to enforce each style getting it's own color @@ -211,11 +212,11 @@ function build_default_syntax(color_scheme: ColorScheme): Syntax { weight: font_weights.bold, }, link_uri: { - color: color_scheme.ramps.green(0.5).hex(), + color: theme.ramps.green(0.5).hex(), underline: true, }, link_text: { - color: color_scheme.ramps.orange(0.5).hex(), + color: theme.ramps.orange(0.5).hex(), italic: true, }, "text.literal": { @@ -231,7 +232,7 @@ function build_default_syntax(color_scheme: ColorScheme): Syntax { color: color.punctuation, }, "punctuation.special": { - color: color_scheme.ramps.neutral(0.86).hex(), + color: theme.ramps.neutral(0.86).hex(), }, "punctuation.list_marker": { color: color.punctuation, @@ -252,10 +253,10 @@ function build_default_syntax(color_scheme: ColorScheme): Syntax { color: color.string, }, constructor: { - color: color_scheme.ramps.blue(0.5).hex(), + color: theme.ramps.blue(0.5).hex(), }, variant: { - color: color_scheme.ramps.blue(0.5).hex(), + color: theme.ramps.blue(0.5).hex(), }, type: { color: color.type, @@ -264,16 +265,16 @@ function build_default_syntax(color_scheme: ColorScheme): Syntax { color: color.primary, }, label: { - color: color_scheme.ramps.blue(0.5).hex(), + color: theme.ramps.blue(0.5).hex(), }, tag: { - color: color_scheme.ramps.blue(0.5).hex(), + color: theme.ramps.blue(0.5).hex(), }, attribute: { - color: color_scheme.ramps.blue(0.5).hex(), + color: theme.ramps.blue(0.5).hex(), }, property: { - color: color_scheme.ramps.blue(0.5).hex(), + color: theme.ramps.blue(0.5).hex(), }, constant: { color: color.constant, @@ -307,17 +308,18 @@ function build_default_syntax(color_scheme: ColorScheme): Syntax { return default_syntax } -function merge_syntax( - default_syntax: Syntax, - color_scheme: ColorScheme -): Syntax { - if (!color_scheme.syntax) { +export function build_syntax(): Syntax { + const theme = useTheme() + + const default_syntax: Syntax = build_default_syntax() + + if (!theme.syntax) { return default_syntax } - return deepmerge>( + const syntax = deepmerge>( default_syntax, - color_scheme.syntax, + theme.syntax, { arrayMerge: (destinationArray, sourceArray) => [ ...destinationArray, @@ -325,12 +327,6 @@ function merge_syntax( ], } ) -} - -export function build_syntax(color_scheme: ColorScheme): Syntax { - const default_syntax: Syntax = build_default_syntax(color_scheme) - - const syntax = merge_syntax(default_syntax, color_scheme) return syntax } diff --git a/styles/src/theme/theme_config.ts b/styles/src/theme/theme_config.ts index 26462bee6d..bc8f07425f 100644 --- a/styles/src/theme/theme_config.ts +++ b/styles/src/theme/theme_config.ts @@ -66,35 +66,10 @@ type ThemeConfigProperties = ThemeMeta & { override: ThemeConfigOverrides } -// This should be the format a theme is defined as export type ThemeConfig = { [K in keyof ThemeConfigProperties]: ThemeConfigProperties[K] } -interface ThemeColors { - neutral: string[] - red: string[] - orange: string[] - yellow: string[] - green: string[] - cyan: string[] - blue: string[] - violet: string[] - magenta: string[] -} - -type ThemeSyntax = Required - -export type ThemeProperties = ThemeMeta & { - color: ThemeColors - syntax: ThemeSyntax -} - -// This should be a theme after all its properties have been resolved -export type Theme = { - [K in keyof ThemeProperties]: ThemeProperties[K] -} - export enum ThemeAppearance { Light = "light", Dark = "dark", @@ -104,45 +79,3 @@ export enum ThemeLicenseType { MIT = "MIT", Apache2 = "Apache License 2.0", } - -export type ThemeFamilyItem = - | ThemeConfig - | { light: ThemeConfig; dark: ThemeConfig } - -type ThemeFamilyProperties = Partial> & { - name: string - default: ThemeFamilyItem - variants: { - [key: string]: ThemeFamilyItem - } -} - -// Idea: A theme family is a collection of themes that share the same name -// For example, a theme family could be `One Dark` and have a `light` and `dark` variant -// The Ayu family could have `light`, `mirage`, and `dark` variants - -type ThemeFamily = { - [K in keyof ThemeFamilyProperties]: ThemeFamilyProperties[K] -} - -/** The collection of all themes - * - * Example: - * ```ts - * { - * one_dark, - * one_light, - * ayu: { - * name: 'Ayu', - * default: 'ayu_mirage', - * variants: { - * light: 'ayu_light', - * mirage: 'ayu_mirage', - * dark: 'ayu_dark', - * }, - * }, - * ... - * } - * ``` - */ -export type ThemeIndex = Record diff --git a/styles/src/theme/tokens/layer.ts b/styles/src/theme/tokens/layer.ts index a2e539092e..6b4e1d79f7 100644 --- a/styles/src/theme/tokens/layer.ts +++ b/styles/src/theme/tokens/layer.ts @@ -1,5 +1,5 @@ import { SingleColorToken } from "@tokens-studio/types" -import { Layer, Style, StyleSet } from "../color_scheme" +import { Layer, Style, StyleSet } from "../create_theme" import { color_token } from "./token" interface StyleToken { diff --git a/styles/src/theme/tokens/players.ts b/styles/src/theme/tokens/players.ts index 85573a1a8f..4bf605aa93 100644 --- a/styles/src/theme/tokens/players.ts +++ b/styles/src/theme/tokens/players.ts @@ -1,7 +1,7 @@ import { SingleColorToken } from "@tokens-studio/types" import { color_token } from "./token" -import { Players } from "../color_scheme" -import { useTheme } from "@/src/common" +import { Players } from "../create_theme" +import { useTheme } from "../../../src/common" export type PlayerToken = Record<"selection" | "cursor", SingleColorToken> diff --git a/styles/src/theme/tokens/color_scheme.ts b/styles/src/theme/tokens/theme.ts similarity index 93% rename from styles/src/theme/tokens/color_scheme.ts rename to styles/src/theme/tokens/theme.ts index efbeaaa901..f759bc8139 100644 --- a/styles/src/theme/tokens/color_scheme.ts +++ b/styles/src/theme/tokens/theme.ts @@ -5,19 +5,18 @@ import { TokenTypes, } from "@tokens-studio/types" import { - ColorScheme, Shadow, SyntaxHighlightStyle, ThemeSyntax, -} from "../color_scheme" +} from "../create_theme" import { LayerToken, layer_token } from "./layer" import { PlayersToken, players_token } from "./players" import { color_token } from "./token" import { Syntax } from "../syntax" import editor from "../../style_tree/editor" -import { useTheme } from "@/src/common" +import { useTheme } from "../../../src/common" -interface ColorSchemeTokens { +interface ThemeTokens { name: SingleOtherToken appearance: SingleOtherToken lowest: LayerToken @@ -71,13 +70,13 @@ function syntax_highlight_style_color_tokens( }, {} as ThemeSyntaxColorTokens) } -const syntax_tokens = (): ColorSchemeTokens["syntax"] => { +const syntax_tokens = (): ThemeTokens["syntax"] => { const syntax = editor().syntax return syntax_highlight_style_color_tokens(syntax) } -export function theme_tokens(): ColorSchemeTokens { +export function theme_tokens(): ThemeTokens { const theme = useTheme() return { From f461a709702110fec0b1587187e36210bebf1a55 Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Tue, 4 Jul 2023 01:37:45 -0400 Subject: [PATCH 060/104] Remove unused ts aliases --- styles/tsconfig.json | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/styles/tsconfig.json b/styles/tsconfig.json index 925935ebb5..281bd74b21 100644 --- a/styles/tsconfig.json +++ b/styles/tsconfig.json @@ -22,17 +22,9 @@ "strictPropertyInitialization": false, "skipLibCheck": true, "useUnknownInCatchVariables": false, - "baseUrl": ".", - "paths": { - "@/*": ["./*"], - "@element/*": ["./src/element/*"], - "@component/*": ["./src/component/*"], - "@styleTree/*": ["./src/styleTree/*"], - "@theme/*": ["./src/theme/*"], - "@types/*": ["./src/util/*"], - "@themes/*": ["./src/themes/*"], - "@util/*": ["./src/util/*"] - } + "baseUrl": "." }, - "exclude": ["node_modules"] + "exclude": [ + "node_modules" + ] } From 0d18b72cf86d74287f4cfc61da5ecaacd82498cb Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Mon, 3 Jul 2023 23:52:11 -0600 Subject: [PATCH 061/104] vim: Further improve ~ handling Now works with Visual{line} mode, collapses selections like nvim, and doesn't fall off the end of the line. --- crates/vim/src/normal/case.rs | 96 +++++++++++++++------- crates/vim/src/test/neovim_connection.rs | 16 +++- crates/vim/test_data/test_change_case.json | 18 ++++ 3 files changed, 99 insertions(+), 31 deletions(-) create mode 100644 crates/vim/test_data/test_change_case.json diff --git a/crates/vim/src/normal/case.rs b/crates/vim/src/normal/case.rs index ba527af0bb..b3e101262d 100644 --- a/crates/vim/src/normal/case.rs +++ b/crates/vim/src/normal/case.rs @@ -1,29 +1,51 @@ +use editor::scroll::autoscroll::Autoscroll; use gpui::ViewContext; -use language::Point; +use language::{Bias, Point}; use workspace::Workspace; -use crate::{motion::Motion, normal::ChangeCase, Vim}; +use crate::{normal::ChangeCase, state::Mode, Vim}; pub fn change_case(_: &mut Workspace, _: &ChangeCase, cx: &mut ViewContext) { Vim::update(cx, |vim, cx| { - let count = vim.pop_number_operator(cx); + let count = vim.pop_number_operator(cx).unwrap_or(1) as u32; vim.update_active_editor(cx, |editor, cx| { - editor.set_clip_at_line_ends(false, cx); - editor.transact(cx, |editor, cx| { - editor.change_selections(None, cx, |s| { - s.move_with(|map, selection| { - if selection.start == selection.end { - Motion::Right.expand_selection(map, selection, count, true); + let mut ranges = Vec::new(); + let mut cursor_positions = Vec::new(); + let snapshot = editor.buffer().read(cx).snapshot(cx); + for selection in editor.selections.all::(cx) { + match vim.state.mode { + Mode::Visual { line: true } => { + let start = Point::new(selection.start.row, 0); + let end = + Point::new(selection.end.row, snapshot.line_len(selection.end.row)); + ranges.push(start..end); + cursor_positions.push(start..start); + } + Mode::Visual { line: false } => { + ranges.push(selection.start..selection.end); + cursor_positions.push(selection.start..selection.start); + } + Mode::Insert | Mode::Normal => { + let start = selection.start; + let mut end = start; + for _ in 0..count { + end = snapshot.clip_point(end + Point::new(0, 1), Bias::Right); } - }) - }); - let selections = editor.selections.all::(cx); - for selection in selections.into_iter().rev() { + ranges.push(start..end); + + if end.column == snapshot.line_len(end.row) { + end = snapshot.clip_point(end - Point::new(0, 1), Bias::Left); + } + cursor_positions.push(end..end) + } + } + } + editor.transact(cx, |editor, cx| { + for range in ranges.into_iter().rev() { let snapshot = editor.buffer().read(cx).snapshot(cx); editor.buffer().update(cx, |buffer, cx| { - let range = selection.start..selection.end; let text = snapshot - .text_for_range(selection.start..selection.end) + .text_for_range(range.start..range.end) .flat_map(|s| s.chars()) .flat_map(|c| { if c.is_lowercase() { @@ -37,28 +59,46 @@ pub fn change_case(_: &mut Workspace, _: &ChangeCase, cx: &mut ViewContext Date: Tue, 4 Jul 2023 16:00:59 +0200 Subject: [PATCH 062/104] Fix click behaviour of vcs/project dropdowns --- crates/collab_ui/src/collab_titlebar_item.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index 8af3acf7be..3bc890f91b 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -237,9 +237,10 @@ impl CollabTitlebarItem { .into_any_named("title-project-name") }) .with_cursor_style(CursorStyle::PointingHand) - .on_click(MouseButton::Left, move |_, this, cx| { + .on_down(MouseButton::Left, move |_, this, cx| { this.toggle_project_menu(&Default::default(), cx) }) + .on_click(MouseButton::Left, move |_, _, _| {}) .contained() .with_style(project_style.container), ) @@ -267,12 +268,10 @@ impl CollabTitlebarItem { .into_any_named("title-project-branch") }) .with_cursor_style(CursorStyle::PointingHand) - .on_click( - MouseButton::Left, - move |_, this, cx| { - this.toggle_vcs_menu(&Default::default(), cx) - }, - ), + .on_down(MouseButton::Left, move |_, this, cx| { + this.toggle_vcs_menu(&Default::default(), cx) + }) + .on_click(MouseButton::Left, move |_, _, _| {}), ) .with_children(self.render_branches_popover_host(&theme.titlebar, cx)), ), From 48371ab8b2ba823278dc5fb0853673128e3a71c5 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 4 Jul 2023 16:30:17 +0200 Subject: [PATCH 063/104] Remove PickerEvent::Dismiss emission from picker header --- crates/collab_ui/src/branch_list.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/collab_ui/src/branch_list.rs b/crates/collab_ui/src/branch_list.rs index e0f85aa65a..a1693fd6c4 100644 --- a/crates/collab_ui/src/branch_list.rs +++ b/crates/collab_ui/src/branch_list.rs @@ -255,9 +255,7 @@ impl PickerDelegate for BranchListDelegate { Some( MouseEventHandler::::new(0, cx, move |_, _| label) .on_click(MouseButton::Left, move |_, _, _| {}) - .on_down_out(MouseButton::Left, move |_, _, cx| { - cx.emit(PickerEvent::Dismiss) - }) + .on_down_out(MouseButton::Left, move |_, _, _| {}) .into_any(), ) } From 4c51ab8a255910cb30efb2cd819b4bfec13623e0 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Tue, 4 Jul 2023 20:58:33 +0300 Subject: [PATCH 064/104] Accept `null` as a valid action, to disable a keystroke co-authored-by: Mikayla Maki --- crates/gpui/src/app/window.rs | 8 +- crates/gpui/src/gpui.rs | 2 + crates/settings/src/keymap_file.rs | 47 +++++---- crates/zed/src/zed.rs | 161 +++++++++++++++++++++++++++++ 4 files changed, 197 insertions(+), 21 deletions(-) diff --git a/crates/gpui/src/app/window.rs b/crates/gpui/src/app/window.rs index 23fbb33fe1..743f99ee62 100644 --- a/crates/gpui/src/app/window.rs +++ b/crates/gpui/src/app/window.rs @@ -14,8 +14,8 @@ use crate::{ text_layout::TextLayoutCache, util::post_inc, Action, AnyView, AnyViewHandle, AppContext, BorrowAppContext, BorrowWindowContext, Effect, - Element, Entity, Handle, LayoutContext, MouseRegion, MouseRegionId, SceneBuilder, Subscription, - View, ViewContext, ViewHandle, WindowInvalidation, + Element, Entity, Handle, LayoutContext, MouseRegion, MouseRegionId, NoAction, SceneBuilder, + Subscription, View, ViewContext, ViewHandle, WindowInvalidation, }; use anyhow::{anyhow, bail, Result}; use collections::{HashMap, HashSet}; @@ -434,7 +434,11 @@ impl<'a> WindowContext<'a> { MatchResult::None => false, MatchResult::Pending => true, MatchResult::Matches(matches) => { + let no_action_id = (NoAction {}).id(); for (view_id, action) in matches { + if action.id() == no_action_id { + return false; + } if self.dispatch_action(Some(*view_id), action.as_ref()) { self.keystroke_matcher.clear_pending(); handled_by = Some(action.boxed_clone()); diff --git a/crates/gpui/src/gpui.rs b/crates/gpui/src/gpui.rs index 25d022d8ed..3442934b3a 100644 --- a/crates/gpui/src/gpui.rs +++ b/crates/gpui/src/gpui.rs @@ -31,3 +31,5 @@ pub use window::{Axis, SizeConstraint, Vector2FExt, WindowContext}; pub use anyhow; pub use serde_json; + +actions!(zed, [NoAction]); diff --git a/crates/settings/src/keymap_file.rs b/crates/settings/src/keymap_file.rs index d2e656ebe3..93cb2ab3d7 100644 --- a/crates/settings/src/keymap_file.rs +++ b/crates/settings/src/keymap_file.rs @@ -1,7 +1,7 @@ use crate::{settings_store::parse_json_with_comments, SettingsAssets}; use anyhow::{anyhow, Context, Result}; use collections::BTreeMap; -use gpui::{keymap_matcher::Binding, AppContext}; +use gpui::{keymap_matcher::Binding, AppContext, NoAction}; use schemars::{ gen::{SchemaGenerator, SchemaSettings}, schema::{InstanceType, Schema, SchemaObject, SingleOrVec, SubschemaValidation}, @@ -11,18 +11,18 @@ use serde::Deserialize; use serde_json::Value; use util::{asset_str, ResultExt}; -#[derive(Deserialize, Default, Clone, JsonSchema)] +#[derive(Debug, Deserialize, Default, Clone, JsonSchema)] #[serde(transparent)] pub struct KeymapFile(Vec); -#[derive(Deserialize, Default, Clone, JsonSchema)] +#[derive(Debug, Deserialize, Default, Clone, JsonSchema)] pub struct KeymapBlock { #[serde(default)] context: Option, bindings: BTreeMap, } -#[derive(Deserialize, Default, Clone)] +#[derive(Debug, Deserialize, Default, Clone)] #[serde(transparent)] pub struct KeymapAction(Value); @@ -61,21 +61,22 @@ impl KeymapFile { // We want to deserialize the action data as a `RawValue` so that we can // deserialize the action itself dynamically directly from the JSON // string. But `RawValue` currently does not work inside of an untagged enum. - if let Value::Array(items) = action { - let Ok([name, data]): Result<[serde_json::Value; 2], _> = items.try_into() else { - return Some(Err(anyhow!("Expected array of length 2"))); - }; - let serde_json::Value::String(name) = name else { - return Some(Err(anyhow!("Expected first item in array to be a string."))) - }; - cx.deserialize_action( - &name, - Some(data), - ) - } else if let Value::String(name) = action { - cx.deserialize_action(&name, None) - } else { - return Some(Err(anyhow!("Expected two-element array, got {:?}", action))); + match action { + Value::Array(items) => { + let Ok([name, data]): Result<[serde_json::Value; 2], _> = items.try_into() else { + return Some(Err(anyhow!("Expected array of length 2"))); + }; + let serde_json::Value::String(name) = name else { + return Some(Err(anyhow!("Expected first item in array to be a string."))) + }; + cx.deserialize_action( + &name, + Some(data), + ) + }, + Value::String(name) => cx.deserialize_action(&name, None), + Value::Null => Ok(no_action()), + _ => return Some(Err(anyhow!("Expected two-element array, got {action:?}"))), } .with_context(|| { format!( @@ -115,6 +116,10 @@ impl KeymapFile { instance_type: Some(SingleOrVec::Single(Box::new(InstanceType::Array))), ..Default::default() }), + Schema::Object(SchemaObject { + instance_type: Some(SingleOrVec::Single(Box::new(InstanceType::Null))), + ..Default::default() + }), ]), ..Default::default() })), @@ -129,6 +134,10 @@ impl KeymapFile { } } +fn no_action() -> Box { + Box::new(NoAction {}) +} + #[cfg(test)] mod tests { use crate::KeymapFile; diff --git a/crates/zed/src/zed.rs b/crates/zed/src/zed.rs index 874fea6500..0df16f4bab 100644 --- a/crates/zed/src/zed.rs +++ b/crates/zed/src/zed.rs @@ -2074,6 +2074,167 @@ mod tests { line!(), ); + #[track_caller] + fn assert_key_bindings_for<'a>( + window_id: usize, + cx: &TestAppContext, + actions: Vec<(&'static str, &'a dyn Action)>, + line: u32, + ) { + for (key, action) in actions { + // assert that... + assert!( + cx.available_actions(window_id, 0) + .into_iter() + .any(|(_, bound_action, b)| { + // action names match... + bound_action.name() == action.name() + && bound_action.namespace() == action.namespace() + // and key strokes contain the given key + && b.iter() + .any(|binding| binding.keystrokes().iter().any(|k| k.key == key)) + }), + "On {} Failed to find {} with key binding {}", + line, + action.name(), + key + ); + } + } + } + + #[gpui::test] + async fn test_disabled_keymap_binding(cx: &mut gpui::TestAppContext) { + struct TestView; + + impl Entity for TestView { + type Event = (); + } + + impl View for TestView { + fn ui_name() -> &'static str { + "TestView" + } + + fn render(&mut self, _: &mut ViewContext) -> AnyElement { + Empty::new().into_any() + } + } + + let executor = cx.background(); + let fs = FakeFs::new(executor.clone()); + + actions!(test, [A, B]); + // From the Atom keymap + actions!(workspace, [ActivatePreviousPane]); + // From the JetBrains keymap + actions!(pane, [ActivatePrevItem]); + + fs.save( + "/settings.json".as_ref(), + &r#" + { + "base_keymap": "Atom" + } + "# + .into(), + Default::default(), + ) + .await + .unwrap(); + + fs.save( + "/keymap.json".as_ref(), + &r#" + [ + { + "bindings": { + "backspace": "test::A" + } + } + ] + "# + .into(), + Default::default(), + ) + .await + .unwrap(); + + cx.update(|cx| { + cx.set_global(SettingsStore::test(cx)); + theme::init(Assets, cx); + welcome::init(cx); + + cx.add_global_action(|_: &A, _cx| {}); + cx.add_global_action(|_: &B, _cx| {}); + cx.add_global_action(|_: &ActivatePreviousPane, _cx| {}); + cx.add_global_action(|_: &ActivatePrevItem, _cx| {}); + + let settings_rx = watch_config_file( + executor.clone(), + fs.clone(), + PathBuf::from("/settings.json"), + ); + let keymap_rx = + watch_config_file(executor.clone(), fs.clone(), PathBuf::from("/keymap.json")); + + handle_keymap_file_changes(keymap_rx, cx); + handle_settings_file_changes(settings_rx, cx); + }); + + cx.foreground().run_until_parked(); + + let (window_id, _view) = cx.add_window(|_| TestView); + + // Test loading the keymap base at all + assert_key_bindings_for( + window_id, + cx, + vec![("backspace", &A), ("k", &ActivatePreviousPane)], + line!(), + ); + + // Test disabling the key binding for the base keymap + fs.save( + "/keymap.json".as_ref(), + &r#" + [ + { + "bindings": { + "backspace": null + } + } + ] + "# + .into(), + Default::default(), + ) + .await + .unwrap(); + + cx.foreground().run_until_parked(); + + assert_key_bindings_for(window_id, cx, vec![("k", &ActivatePreviousPane)], line!()); + + // Test modifying the base, while retaining the users keymap + fs.save( + "/settings.json".as_ref(), + &r#" + { + "base_keymap": "JetBrains" + } + "# + .into(), + Default::default(), + ) + .await + .unwrap(); + + cx.foreground().run_until_parked(); + + assert_key_bindings_for(window_id, cx, vec![("[", &ActivatePrevItem)], line!()); + + #[track_caller] fn assert_key_bindings_for<'a>( window_id: usize, cx: &TestAppContext, From a7ce602bac0902e62c544b3cf0a9132160d9aef1 Mon Sep 17 00:00:00 2001 From: Nate Butler Date: Tue, 4 Jul 2023 16:18:42 -0400 Subject: [PATCH 065/104] Update collaboration sounds, add sounds to screensharing --- assets/sounds/joined.wav | Bin 16142 -> 0 bytes assets/sounds/joined_call.wav | Bin 0 -> 28808 bytes assets/sounds/leave.wav | Bin 137188 -> 0 bytes assets/sounds/leave_call.wav | Bin 0 -> 30916 bytes assets/sounds/mute.wav | Bin 29314 -> 56088 bytes assets/sounds/start_screenshare.wav | Bin 0 -> 12188 bytes assets/sounds/stop_screenshare.wav | Bin 0 -> 14024 bytes assets/sounds/unmute.wav | Bin 133336 -> 48834 bytes crates/audio/src/audio.rs | 8 ++++++-- crates/call/src/room.rs | 5 +++++ 10 files changed, 11 insertions(+), 2 deletions(-) delete mode 100644 assets/sounds/joined.wav create mode 100644 assets/sounds/joined_call.wav delete mode 100644 assets/sounds/leave.wav create mode 100644 assets/sounds/leave_call.wav create mode 100644 assets/sounds/start_screenshare.wav create mode 100644 assets/sounds/stop_screenshare.wav diff --git a/assets/sounds/joined.wav b/assets/sounds/joined.wav deleted file mode 100644 index 70cd41d16f9b21dcb46a0f91e7f446a4157f8239..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16142 zcmWIYbaP{~XJ80-40BD(Em06)U|?WmU}9*nV_;yYWnf@p;9&6a3=WZEU|{g{bMyBM zb_?NSU|{e`EK4)B&@(sFGc+(@NJ%V7JYdJb&_Fh5Y-ognhKBlvy87C>n%e4`>gww1 znwpxL+S>ZMrpD&x)|QU8uFmeR?yjEh-k#px?w-!hw)Uo$s@jsWyn^hU^vsmh2|Y8W%%8J((UQeWmn>Vlbm^icbLP#QU09HlQCr#8G^uaq)Flg6 zE?>QB^{TaN)~;Q(dhxQk3#QNPoKRMqo*kDM7U>`83kH6^{(fOWNwEc4b(MV`i)OD| zy=C+EZ98}D+O>1nwjCQcuUsPN|zkK!N*`51mFK^j9X?{UJ@5erK~P3CoUl-CN3r|sU)wj>0+H2+Elt|+P*DU&OEyN;`uAEZO>lZeR%fDwgWSl zmNo~)gKU$M6%`W^1=%Josj6UU5b9N)HM?*3hAU?t-Fx}`_3PKKU%h_u^5K(9H+LVM zy`sD|G||FIRU4#B6s$`|QccmyFwCnwduH$UwdarDzxDj-tCz1{y?pib`Q3--z;;!( zMyA?(Xd5ahOG!&eNQg^ID$41o+nY!Fm1j@u+PvcQ;oH|9KYa1*<;xc@pFF$!;KH>% zM;ESX=uOOV^EWV8RF#qumk<}15SNuwQ#94{an6kEtX(-&x`-Ow>5tJEK)OIKb=T1HAzN>W}%UCBh(-99m_zGTj%t!qymxpDQu z{l|}=Jbm=!&i#wm4jf;#xo>7+b!eQOtFDofs;r!hw2ZWZoVv1!p1XZ~SaspdzRjyn z9K3qz?(IhpA3c8X@YbCRS3tTZ%qp#mPI2)uve3|0Qc+M)kXKgJR<|(nbV>}bDV*NB zVa4ISm(Je4`QZM8hxZ@czI*A~;Zy6kPg_vamYD4sXkn|PucD@?sGy*tq^)jd=9Ub}qf_Pu-e?%ld``TDUln|IG$*3y?z>>pw6 zq-Uh6p`a))rzo$cqOWah9^{#m*jBS(+V*v)4qv-;=N2fZ-MxS9*69no4=r2YJH4Ix1>PN-D})>c;wxHX**b$?bIurf*$${NR=Iw{P6NbNBA8J6EoqIJQ}TVot(Um zd;i{@yH{?UIKS<{g0*c^b83QgLsZ;8c9$&iShcPp;cBZE;Oka)EDzwTr%qx|WKnva*_ruBL^Nr+sWtX-0q3 z^4YsLojQE=0x0zF+`Vz@!qvm4HtwFiytzNCEI7`=)7U~wS5;j_MNL&l)6CG-Ho`AI zrK4uS)UB(J?z?#A#pJ2!4$ymsvD_Jd2-_s%S7jLq~4wstfy(b85|*HF{Z zG|_Xk2y#!4t}C3@xn|+MZKsc3xp?!&t=l(lU%Gzs!k!~5w@jX2-JV(y5NYpbY_6lH zp{b#+tzo2VXYS{k7+#Un-?DVhj*Z6-UO0E{+KrpnZ(hEB`og|rYq!l<+|-+078dX7 zZDC_zsI9G~p`&4>V{PK;5FJpE(pEiZ()#85cbz_Q>EhLES8rUpe)`gZ6B~BVUD+|E zs5U0eE6~=_*i=_nTT@5VP}|bT)h5h4E54z0TKB4jyS5%ba{k=qD_5>xx_0K$p;KG- zEneF^ph#+=UC5&s{!w z;oym_dzY@8G^egDt1u$g)5q4%)WlHVP}f+`(#Y95z&$a%B&(x-&eXLlcI`NNVr$=c5~HaI_}v0`%f zl6jlf?cIIk$njGr&Ky0x|Jc^OD>lwp)Hb1{HYqDO!rjZ(&cfWx*xbn4#L3FnIXWOa zp|+^6ZT^gPD|c)^aPa8yW2cUs+IMX0{#9FMFYB6G(UegT5$EmiHtt-yZu-LZ ziDeDx`4REHfi7-#_BPhGRu0zgj)9)BAvsC4MZGO^r>rUM2M-=Pa`4EWgIjj5 z+%$V>&$Q~c?9$lOz;F+5Cue&*I~zw^561wHn4qlqs{F3{nf=S=Z(Or;+rE7V4(&g@ z`{0&6tG3Kr(LcMPyRbSbJ1o{G(AC4y(b3-7-oq)tBRVKEt|F(sW?IjZ+3Q#C*s^!` zfdl&w?K!Y@&zda@R!y4Q+*eYUnirYiAL8Nd;^O4!;^^rd;29m15nGnsS~aC>(ag2W zwr$+KbKkyw2lpJnNy9$_|h75ApPIb9Zy~bo2L$2uO~~ zPpvKLX`I==bk4fv+cxgnzGwHYJ==C|*t%@p>?M6O8@h{XQ}d&e10%cxJiI+TygUND zBLb5m^HXXHy6R?hFPX7+$=0WacW&IiYSV&MQx>#Mscg@wOw5T$ z3=H=P@b>ZX^7jt&j|w?QfdhzjXH6Wt-P++p>N8)*TzRt=zO=_0&b3(`&j4 zYEuhiQbS_`Lj3&weS>_%1L8w7VvExoihAm&cQ2g2a?$!#n>TLRx_R6Btt&SzTs?hp z&&-D2(uS;(gv`kJkg&kO0KZ`0aR0cFwCIAAn!NU^N$qncFP*n~`TBJmH*MUyZp+F| zi`L9s+CRH_LPbknMQToLQg~EIaBx6~UqnD`aB5^;Vnt4Kd0+F4{sps^FIlsC-G=p> z*KS_9aq-&O%O=ikpH$OcRGpchm>Lxm78V*58W0f}6OtU2lUSDBP}bErrFZU(B@0)s zShH^J#?>2FtY5Tx_R>jnJ0{n4l+Q1oteCZA%DkRw&AnC4MU~n4De3X?F;O60v0;f3 z>9Kh!WjS@FZS{SfQzy-yHGjdPrHfW9TrqDsNLTOl*8bYI(we;D^sJ=h_}JKpn6S98 z#E7(*oW$bH>cZx#u9k_t)2Gg!GjHMirSq4~T{d&^l=;0g+9uR@l-CuMX6B@%B*eu< z#)ij*C5ER)XD1YX_8fS=mrjmYtiH zniLlw85b5Gni!TEnHiU#QkGL&+FIY;IdS5&nX~54Su$tY>}4~TOkLPNyK_oYcXd-~ zMP7bpdP;m^R6=+HNLNH=Y+iC{c6CWpU1xj$gefy-%%8P*_Oe;aW-Oh$aKfCfDJ?y< z&1IGO1zG8-2}#iqT`3V6F}X>_SyjaiHSKM^{gb9on>%yStfjM-%~&#Z;lw%JQ(JrM zTFR>m3$ruRlagZ+BND@t!c!vCV{?*(Ns-&gQ&(PEl$)2Hos=1u5tA8{9ha9>lu@2nQ`S`9(cU`&Q;2&Iv6Y zbqy8e#Rd79IVo8QnQ>WhISF|wMVVl`>f76U`@wOxVCLdkpb%L&d2auV?uo6P4UJWm zWkrSAd1*OG*$LSRIf?lx#UNc}jdks9J$)0V!op+blIe@4%$qQ?XL5UYV{=V)c}a0@ zetK?lPC`yXZbE)?QASyARY^llYfD#8-{eWN5OFqj!KB%JQ#<=w+Uo18%FFVLG7D1k zl5!Jr6Z4ac(o1tHi|eYIo7%g2CQg_!W!|(!GnUL)I(^ABkQ=9WPiX6CYN)NOC@je? zOv_KsOUz5mOD;$&&Mq&ku4rgz?dY1&H*M0KsSBnrp0Na^Ys%b-GkPa>cC|FsS5+04 z@=G!cQ}dE?6G6HPGK%xcORB5un_48z(l~)#)Wf!Fvq~s^%CFiFUWEAI=6;)N%H8i!i^>t0@ojGC7r1_KQPo6hv&V(6# zU|r4i^%d1cb0^N8Fdd?+ zrM{uErl>NvG_yFhFr^?RKQ%wCAgeI1xVXHkrm?=GwZCgx|LiH?aGbVa+T4jVx_TR% zON!HzlOhwtqW$CiQbTiM8giz!&Y!k?!N#?lx2@l{dfSAR=`8_i_96O?y5@T3`leov zO?ev^oZb8I>ce{vZ$G?y`Rb}owM{{hx`ql0(sJU`;*y$bZqE4`3uheOcjL;7CvV@p zc=h1PnJY^+m$ih(8`z4=h>J;x%S%~kMSE7IFYmpu_x|;#51u@^dT0O1mD{VQdnD^R zNNbAA%E@c#SenNNPN>_yDXz8mmsJy&6qOJalabcf_4DYc zII#8R)#p#%yngli+4I{EwjFDj6r5yWEv+CfAto*%rXlBJRi3!4_w4Swm!Cg)_2Ti< zi#IkOY?~KRVCAc9BB3ZDqoAax>+f2Vw`9ukt@kfId+_|x!+U4XtypoW>8hMcmJs&Z9F|=eK*r>Dw#o%B!lXn;3h$7ADW@Ikf54*{64( zJiLGB%H>^qC(cOCv-ecfk&%~@k(NYnw7QCmZGQ5? z$*1-|y#4a|%a_kz+{=+?8xPoCVq zf9%4dZ6$r4i8{8j8d7pHa;hrUCJ8}()jOA7JO1R(^T*Gg+`o7F{PGQzZ9Y*t=CVo> z(vnj0a{AfoicclVr_yePHI)>~ayRzX@?UPedN%_1jaX7m0v zS5H2;_4vWvdl#;5J=nJ}rP47}+e%SOUPVRC*wEjjJZs^^BU^8se|+c3g9rC6UEa34 zZ+c>$jk~Ijw7jI0jEsh=qh&_S)b>3aZ(Mlt;Mub$Pj5dsdSTI~@-E*vLmNePSvh%G zO=Vl7IG>Kf^|Q|GxpV2^oqKn$T;F$m_Ughm?*sz}Q2J0()zNXbO^=@3v}@Is6Ay1a zdGPST_3H+d4fq z-^NSbKtWkiK~vS*Fv`0zcjc55J8qqSc<15$o41djUAeVsN@T9Jmxi&Tx{|7vmbH0Q zKx4^@nJ0GNy!hbu{ku1A967agU0rubl9_{wmaKxTtg@n!uD^3x`uqt8w_d;S@ZRIc z_a0unvE#_prFjkB(Z+V_y2`2=YGww0P6hGPnzt`Kci`5=yEkrJKYecV?uqkqs=cF( z?KSjOG&Qx&%>2CyGp2R#SbP5X?Q8e$+`4u4!nQq==jK*;h8S9?YA7fvE9q)FStW&a zRj*%o>cGt__wInk8uuKZy}G0=Ai=~@MMq9aUO`R8!Z6gcI&0yC0~;IKL5-MDz~*1g-;t{y(NbWMF{WU{r3rXFZ4 zN<+=kIK;a$XThWcTdthFckBMWo3~G0+_0y2UV5cln1PL&uCls@hMA$SbAJ4krmc%l z@40s7#^uWwjviaHxo3KMnP<4MgNC7+j<%kqMUZcC){LGVYtA0Iap~6et5=SnT)U-f zYD%HAzpkm0n!KX2lD@W^O?p&c{iY?S4}yGl=kCR8dymaqThSewZtbCCqNc5>X>8zO zpBC9wxn}m!?N?6Sx^n%>nX}vX&RAU96r5z`remtEqoreN;^mr=(A}_h(XoA3FWkCu z(3m$cIn2oi_ZzD@xeM3DPlK|(OsGjnb(++Gnd+6fnb7u}8UB7Me{F3IdGzVW} zTRjs)6C0ZV-|W<$rj-j0>^OJw^2Li6kDuJKYsSLLrl@2m4`VZ3T|I4cLr?pZu;!9Q zQ+IDXee}}BOIJ=^*mY###^$Lh<=)Yju7(zdCYBbSPKlxQ`SW_VFFUd8!qE#SP9E90 zW8u=~?$mtmFiRIhO9OLr8+XsRxSFcj)3eTrQXU`ozx^c_& z*;Tc13GVKe=0^G^dbXy1&S_E2<@2X)-*D{k*|TRa96hsj|J*f=lTu6lVr)H3ZA>j} zY`oo*B5Mn0b#GdHXxr(7XO0{@uw%=jMeSYLg~3ry9u{_HHa3o)zHy0_)l;XfTepAz z$y2A#96Pad_tF*JefdS<5iTxP=H|xMX6_Erfu&g!+Ey*xv+eki)2EJ~+Ybmyr9$M^5uzGlUg$yL<}DL#Sru9o)J4lbUd zkvaLT?ei9F-hAM|v13P$?b)|x{j`}i4JqjXK~7FKR(4kI4q?7IiEWkhCT&`=f5*{- zM-K1Vw`TM7g>~JjB?0ly{x)v5F0P&-p_yq-)w3tAU$S@ekzI#(@7cO;#ms4qjTu=X z;jUhGPIgYNp21=1nf3M4r>|bUbLWAB2M+DpyJq9e`HdY}1z}MhUXG5AcJ7X$J{d9f zh0{7#&E2tX|IYn;ckWuVY3Aal30YNPX&zw?K6V~1UI9T#2^B^CZA)fuUa@E6zOB19 ztzS8BR!2usNnE0TkeipYo4Z#~a8goPX;1fpdF$3~-?3}Y)}5<2&RW#gUr-sF;uq}d z?(F359ORi4R+iCIvtZ(e#XC3b*}h}@x=r(zcTF#8i7yODa0_wrb@lNJjETw5Zmpf! zziQr=RXf&iTfc7Qg1NoDmDQ=4p^;vGZl3O5{sA#DdAUsu)21w2vSGv4ZCkdl**Je` z@6^hsw7jqwZ+|y;cUM2p=-`~hhTE{y^7M+q=TG`$`WA?J; zYuBycuzKyHB~zxiv=x;mrG$q2`TO_;_(g`MCzcmddd3b>y|E`H+xD?TXlJMW^8OoSU_+R37!(*8mJ(l-(_B5Nd%?_=i`T7O zyK4FJIrI7^)wSf7#%F}a1w;mhheanO=jGSc_I1yhzI@@@WowtOT)bfRLtr(&+nhq&{9~Mk{%r!8WtKF6_FfYklj$x z-#&Nh^7(6*ty{5b*}?@=rnYpHRHx=er3A+YMu)`4CTHeWRCTmZpS*bPs>N%Uu3o%k z&df>OZ8a5nIY~)T(czJiG4V;6x#d-@9h0ZdTd-{T%2mr(E?hEwR##t5LtasGT1;GI zRCH8QTuypbQAho>o<-AFE?Bd4_0pw_X3g%IP}`DMk(e8q8k!KA5S^TwT~ylCFtKOe z^cC~hE?&1}<${GXr}nouSCr@EB&Ec}N5{t}rDYbD)YW(QOrO4B!IGs*mn~c}b8i2X zrjF8@tb(NUxWu^lT1HszJ49$XY#bR-pZET zs^r3$?CA8^^yKW^!m7&l=E*(trY@bmV&3w3i)PQ7+Sk+ASX!Q)pOTrFnv|NJnU`Nt z-rUgFHDk)W*$d~-pFeBP#HnpP)lG$!83jq138{%GX=(Y{RmE+!liKG@STudtGBkLusXdsAvZQNE;Bhhr?9-Txv9T<=Hvx47SCQhd;W|Wll!`x8q3Oa@>4St zQxj8C({pl4OB(9B+ow*PGh_bT`Sa$?ojRj?LPL9LZFWgYPGWjeYHC_;R(WA#Wlz(z z?zxi|PG2}{-puJ!d;1&PN^7%AQ}Plr<1>;nGjoedYHK^%Cil&rwqVx6+4E-2nA+dl z+EP_rP?(XGoR*Z5lA4)WR8Ujd-aN5q=9GD}=FgowcgD>A$*tX$jrkSn`H7kFsfnp+ z>G?U8B`r1mtuuP(PM$w)?z9vnEfUG^xLWPJo=T9Lr}xd7 zG-t}J$x|ox_O`TDH56247N_JV=cMFh<`ooHmN(b-v`p@r(Kl=2%!yO_d%IiPY8r~G za!S(+)AG~vvI~kzsw&&h>eX}Rbm@u)gv%9{nv>~@Ttt`1HDL*wYyP&wZrlPI3uX$?6%-&fO zW=xzsp{KW{qq@1cHn%*pC?h{BFE78esHUv7x~Fkc`_!Ik{Zl4P=`j+ zEXgd)E+{B0FR8ESsO<-t(=)Sw`h-dS-9616RZT^;+2!fQX$9%|+4)7qRprgK-OZCa zr}fR4IDOKTiG6+TUG**Hb%hnV#o75ex%qjeh1I3a)m@GK?UQ?^Oqe{We`05UQ+IV+ zNke{BPHA>wZb3moSy5eCTXk>aN`Z z{)s&k+Iky0s+vpc3aWC;a!c}yi%TlY8mijs`kE)VPw$%1Gp%P*cW*~qOI<^GO+iIY zX;w*ANp4wTWkqd$Q(Jp)_r$&_6Q)d<)Z5q9(b`mBT~$_ERG6QipI=y5T2fuvSl8at z)7jrUal*ujeG@u+TRLl7%Ik}&^2&0Ga|;WKN=vFMnrpfmC$vrJ0{g6YLU&htQ*(7) zNmYJXc1d<|PDw#|X>|=~XsxraXHx&<36uKzd%8MWn(OK+DoaWV3kwPg3rmVC%j;`e z8@t>3yC?QdnlNEPPhWd?Lwi+INlku5PH9eYZc$-Ld0AamYkg1i#P+FO(|V>teAZgu zP*GD<*MYfo2SZ-0MZe|KMdcVl}^Q(0|MWqxU1aei@8NqJdqRdZcuQ(xP}&dJ@Ax+iq? zw70i3G*s7=Ru+{Pl;xKdmX}mj*3~sNx3zb6gI1XJ^mKK$gY2rUsw^ujE-fl8Dg)V7 z-PF+5+S%FN+tc6E-__R!wyUDHq@u92ps1j*xTw6OrlPT?t+Bhczhh$e#P0s?o{sj` zrpDUZ@~YzU!m@(W!g7#7HI0p}AcMMldwRONI@?>Do9gPSs>&*g%L>a1D~hYj>cDn& zb@uf3g6(SWZfdV>s;DceEG#Q1DJU)~EiJFAs;_Hp>T2ujoX|C~YeHvVTUT>yeM3!k zMOhihpdye#^;Io(9ZlVBy`6nsyskU1e2yd09z$ zaYb=;XdWO=W#;GbEt+4&ZJKK6Y`a!m}_qBF4wbeCN*H%`RmzI}Q z6jznhmN!hSu7K>YB=m ziqgvBs^XfG`tqi#wz`hSuGa4Mu8z)*w)W=M`ljmoiki}@;>zO6lBzP0&zc(BT01(r zy1Ki&yF0tuI+|MRVBW7Ns3@u^sj8@{scUR#YwBw0ZS8OAZ|-aAZfLJ-uBor8uBxai zt1hiAtuJq?Y^iCl?`Z05>1^w0Yinz6X=tixsH`okDXA){Dyat9Rnyea+S1b~SZ2cQm&)H#XKbRMwT%lvEd07gd+kmep4^*0nUXw{?On>*?z0 z=xXg~YN>0isx7Z7sVFKhEC>0lyr#OozOlI(WLr;5Z*y;BcU?zKYgJQaeMNO;WmQFO zc|%2WWm|P;ZFhZlV|P<$b6ay$Q(a?KeOX;`O<_%8bx}=eT}6FuQ)5eOTW3d4XJ2Pu zM^9T&lxdTdO;2yXt!yyPLb3J6c+r>zk?@%Ib=13##+03&6HjHPkn?v~;%hbo7H@drxa; zQ%hY#bxlP@Sy@SGNoh%0S!HESO?^XCb4y!WXIpn`cT0CuXMKBZOLb#qZDn;;Wlcq0 zMPp@4ReMcWT~A|AQ+G>8OKVGGb4^o4LrGm>Z9#Qmb#ZlB4amvOO&u-W?Y$jfpS5?k zwl+1^*Va^3mY0{6mX(y3R)V9pv7x28wXLnQwX3DOsjI%DwynCkvH@gUb!BZuLq$tv zJ2(`+K4YeTKsw=B1tExbD)qyQ* zZf$OF?r7?01liVF+g#IFU0+iRva6x0xw^Hwy|%NitD&p0v$-AQvzEG+>gI~3vWC+7 z()zNxin{8$`ue7Z*2a#euIBERu9nW0_U6{6riS|Z+S=-xs_Lq$s%r2;<@&}(P&l@< zw{$dvY-_7)t!b`lsIIH2sjaTBYOHFhYOC(3?X2%==xpj}Zfj|7X=tf!scI^31ld+r zS6)|DUt8bM(A?P8)Y074($&({+}YgT)Y8ycUte2OQ(awET?JYfU0YWVwyd?K4Qg9^ zLu*}gZDS3{XAs+}o2%Pu+v_^OcD1*(wl=lax70LOf^91Ug<@TGU0r=sLrY_OQ)hEm zGsLde#-@e_n9snr)z*S6Yie$8ZE0@-g=BkUTRq6Oh8mF1s_H5mDx0cWs@rNnwzW64 zLF{U+ZLMmqXew_guP?8wsI9K8t!=1lu5WEQTg)iu?1 zP}`bXo78p}r0pXJDU!RDqI6Q%f_*wzkIBhL(C*C|1{2)m1fA zHB~p)wAQvk?P_jrY_4yrX{v0fs4uH4t1Snm{My>OhI&Yxb+&Z2bTqd&fkLsqt`-zy zRnX*EQ(ITx(9i@5N3dMwbgai_0^3vO|>m`tqrY>txc`XEzM2M z4NbL;)eV((6}1($6*ZML)wQ6gZ)$95YHMz9>1YK-NNZDbVy1}&SfZ)j|6 z2KlV1wW+nSr5?#NQtFpGH zt`2Mn*sd06j6p*Ylo}z6^g-zZ;<4tI=9Z?G#^#2my2e_FUA48fb+rw(P2iYsYitAA z1&Z~?`i9#2>N=2Z6}6SMRdqG>bqx(*2ZNGydrMn$Yf}p-Ekbq#fVKkE)YjJ3)r0)i z)YRMrvZBZB1>>;81L81lv|qS6y3GTUA?K zR|8ID;J9dMX=!a~ZE0z4Zfa_11n)nnuc-sU+Io;(4Gm3=&5g~CEe$OV%?(ZUjdcxm z^>uZ1b@gDo8ta=Hnj2a`j%jXb27yMHF?BVyU|3gMU)NCI*a&iSb8|}z*sf-As}gx*Fgc@+}s2)rM|wduC}%oWLsSgC;&i? zYHDn5YHk8KsHqtgA@z-5r#FC{Uk|bhWLHBI6gDjV z^PmI^wh$8Bjo<)pZfI_7ZfXLlYN~Il10{gQ+Q!<3I%(kXxQ04%+861+3NUNy@*;QR%(@@(`2a5eBP%?ogZKUK@3r%iy zjrCwvjUek98X+kb>=dwdutWkg1(F%-8$n4HoI=3GOhZj$Ei{e5vQY~tY9JY@t_~Eh zVBgm@)kA#-iq}R^#DUX&T`edBz>_4XOatYBMsU^#*#<7sYU<#&HPwSs2PnLoS|NpO zT@xsE)YgHDhx*!v+QwQ~+%`2rQxPbuA%`^B=it}?ha@Cb*EN9l3xO(FP!S6987TXM z%Dv{6W^lm=k2A1cAip($?P_XhZft_3Sdd-dbPY-*&{zfKAaDw4Y5^71^-bVn22^~) zLFofz86+G*xd;?#&;kn-7qIXFr4djS1F9Hm zKt)JR4al|{u$vp28(W&dB?vTyfbuk?=mXgXjx%tKHG@(SG~a`AJS3dKeh0e-W*azt zfO1enEvVE3`K<<2hCt$?r3vmcP|AmtR>(OYY!^7KLG6MUSXg`p55-0lyO4bb3vFmY z3-TE_K0tW`>~2unfaV}XQ4F&SR1QJo3~Cp+%B!shr~H~aP%f(h`wXfIIema~2-q%A zPONPN*#=1+;6emcXo12JTo8j@1IihYPy`i4;Is%yACT|?ha$Kn0+);6ln=@sP@lnV z0~L_)JPk_sjZL6j4=Nz*K*b0skAdW2A>9P>eFL}<1*b+(PK5X$o~A+NKGaR1m<6Y7 zkbU4{y$D z!0I!Qx8N>^)@M+^fh+*I22}ckY-|9PAfPG~TvLHU8)^!ua7EY#s;fY;hEN4bYoJ^U zu3^BXEXenuT;15z2=g1rE^u8Ab58@r&7gV_Y#Y=ZaJokL4Ag`G1vH{8f`$Mj)}-%-Ape6@fl?V*4LFB@6Bx)UFau;)J;?@(x%bhyhjsGYf1Ns3nKk*9uYy+8zrw1!5aQ6-W|n8fbM#wFMchzdwpgZA4(!x5BKz!+>2SS5yS z5JO=0K@9@g1vUp{4HQGfpbDV51KbRQy9wfaaAMIir! z+p?g>D#Siyg&@B{4FmZND%A)vvH|RBs5I1AnBTxEVPYUtAojsTV77skH6lczhJoz@ ni6ToOYy-(aFf^=@`~_77@)tx2jD#tL@gX$aCJ1+wBtHZID6n*Y diff --git a/assets/sounds/joined_call.wav b/assets/sounds/joined_call.wav new file mode 100644 index 0000000000000000000000000000000000000000..cf6e5ba4dfc482de58d05fddcd652da27eb2b623 GIT binary patch literal 28808 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μ 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 YArTP~3=9lh3=9mx`DrEPiAAXl0L5H08UO$Q diff --git a/assets/sounds/leave_call.wav b/assets/sounds/leave_call.wav new file mode 100644 index 0000000000000000000000000000000000000000..478b28204f24b76d1f43b647e4426f2a18e9a232 GIT binary patch literal 30916 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 IfbkGA06|mZ!~g&Q literal 29314 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 XQy0~OiwiN=k(!rct5mLJZ^r-t74Z?e literal 0 HcmV?d00001 diff --git a/assets/sounds/stop_screenshare.wav b/assets/sounds/stop_screenshare.wav new file mode 100644 index 0000000000000000000000000000000000000000..1fe13e21b4246ed0fdf9d3778955b02b64468e99 GIT binary patch literal 14024 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