diff --git a/Cargo.lock b/Cargo.lock index 108dd2c2e7e6b477668ae914c4a85a4ec85bd882..02b27566e42f29eccd5b4a0ca145567e885cf36b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8439,7 +8439,7 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zed" -version = "0.79.0" +version = "0.80.0" dependencies = [ "activity_indicator", "anyhow", diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index fbaf72b332d57227c87ef69076f96c6a9f65191a..3228f7d5a6f3a0b987e4c80694b9ff8777cfe630 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -89,7 +89,7 @@ impl View for CollabTitlebarItem { let theme = cx.global::().theme.clone(); let mut left_container = Flex::row(); - let mut right_container = Flex::row(); + let mut right_container = Flex::row().align_children_center(); left_container.add_child( Label::new(project_title, theme.workspace.titlebar.title.clone()) @@ -117,6 +117,7 @@ impl View for CollabTitlebarItem { let status = workspace.read(cx).client().status(); let status = &*status.borrow(); + if matches!(status, client::Status::Connected { .. }) { right_container.add_child(self.render_toggle_contacts_button(&theme, cx)); right_container.add_child(self.render_user_menu_button(&theme, cx)); diff --git a/crates/collab_ui/src/sharing_status_indicator.rs b/crates/collab_ui/src/sharing_status_indicator.rs index 541194ec66a5953fbd8d69b75aa15e63cbf68a02..e16d4a2d894e7898e55784573f4a0836579ab0dc 100644 --- a/crates/collab_ui/src/sharing_status_indicator.rs +++ b/crates/collab_ui/src/sharing_status_indicator.rs @@ -21,6 +21,8 @@ pub fn init(cx: &mut MutableAppContext) { } else if let Some((window_id, _)) = status_indicator.take() { cx.remove_status_bar_item(window_id); } + } else if let Some((window_id, _)) = status_indicator.take() { + cx.remove_status_bar_item(window_id); } }) .detach(); diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 69e39b65d3825066b48f4a742ac28314214a9e0d..780f8cd1d539bfff43d4c914f303a9e322efb71f 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -576,13 +576,16 @@ impl EditorElement { for (ix, fold_indicator) in layout.fold_indicators.iter_mut().enumerate() { if let Some(indicator) = fold_indicator.as_mut() { - let mut x = bounds.width() - layout.gutter_padding; - let mut y = ix as f32 * line_height - scroll_top; - - x += ((layout.gutter_padding + layout.gutter_margin) - indicator.size().x()) / 2.; - y += (line_height - indicator.size().y()) / 2.; + let position = vec2f( + bounds.width() - layout.gutter_padding, + ix as f32 * line_height - (scroll_top % line_height), + ); + let centering_offset = vec2f( + (layout.gutter_padding + layout.gutter_margin - indicator.size().x()) / 2., + (line_height - indicator.size().y()) / 2., + ); - let indicator_origin = bounds.origin() + vec2f(x, y); + let indicator_origin = bounds.origin() + position + centering_offset; indicator.paint(indicator_origin, visible_bounds, cx); } diff --git a/crates/language_selector/src/active_buffer_language.rs b/crates/language_selector/src/active_buffer_language.rs index ce9fd5a3b0696b2f298105d1ddd46742e35f41b9..ce4b3aebdd3668340c409bd52c1f37a8abc305ac 100644 --- a/crates/language_selector/src/active_buffer_language.rs +++ b/crates/language_selector/src/active_buffer_language.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use workspace::{item::ItemHandle, StatusItemView}; pub struct ActiveBufferLanguage { - active_language: Option>, + active_language: Option>>, _observe_active_editor: Option, } @@ -27,12 +27,12 @@ impl ActiveBufferLanguage { } fn update_language(&mut self, editor: ViewHandle, cx: &mut ViewContext) { - self.active_language.take(); + self.active_language = Some(None); let editor = editor.read(cx); if let Some((_, buffer, _)) = editor.active_excerpt(cx) { if let Some(language) = buffer.read(cx).language() { - self.active_language = Some(language.name()); + self.active_language = Some(Some(language.name())); } } @@ -50,23 +50,27 @@ impl View for ActiveBufferLanguage { } fn render(&mut self, cx: &mut RenderContext) -> ElementBox { - let active_language = if let Some(active_language) = self.active_language.as_ref() { - active_language.to_string() - } else { - "Unkown".to_string() - }; + if let Some(active_language) = self.active_language.as_ref() { + let active_language_text = if let Some(active_language_text) = active_language { + active_language_text.to_string() + } else { + "Unknown".to_string() + }; - MouseEventHandler::::new(0, cx, |state, cx| { - let theme = &cx.global::().theme.workspace.status_bar; - let style = theme.active_language.style_for(state, false); - Label::new(active_language, style.text.clone()) - .contained() - .with_style(style.container) - .boxed() - }) - .with_cursor_style(CursorStyle::PointingHand) - .on_click(MouseButton::Left, |_, cx| cx.dispatch_action(crate::Toggle)) - .boxed() + MouseEventHandler::::new(0, cx, |state, cx| { + let theme = &cx.global::().theme.workspace.status_bar; + let style = theme.active_language.style_for(state, false); + Label::new(active_language_text, style.text.clone()) + .contained() + .with_style(style.container) + .boxed() + }) + .with_cursor_style(CursorStyle::PointingHand) + .on_click(MouseButton::Left, |_, cx| cx.dispatch_action(crate::Toggle)) + .boxed() + } else { + Empty::new().boxed() + } } } diff --git a/crates/project/src/terminals.rs b/crates/project/src/terminals.rs index f7b4105dd2ac8f52a52e2a524ca7afced24ace0d..0f3092ca41d757437963a0658c502c87f913d262 100644 --- a/crates/project/src/terminals.rs +++ b/crates/project/src/terminals.rs @@ -43,11 +43,12 @@ impl Project { .push(terminal_handle.downgrade()); let id = terminal_handle.id(); - cx.observe_release(&terminal_handle, move |project, _terminal, _cx| { + cx.observe_release(&terminal_handle, move |project, _terminal, cx| { let handles = &mut project.terminals.local_handles; if let Some(index) = handles.iter().position(|terminal| terminal.id() == id) { handles.remove(index); + cx.notify(); } }) .detach(); diff --git a/crates/terminal_view/src/terminal_button.rs b/crates/terminal_view/src/terminal_button.rs index 8c723ad4d41ae91e758684192065bfc2dade3c12..87f0a2deba9b300b949c5033282a2577656899f4 100644 --- a/crates/terminal_view/src/terminal_button.rs +++ b/crates/terminal_view/src/terminal_button.rs @@ -19,7 +19,6 @@ pub struct FocusTerminal { terminal_handle: WeakModelHandle, } -//actions!(terminal, [DeployTerminalMenu]); impl_internal_actions!(terminal, [FocusTerminal, DeployTerminalMenu]); pub fn init(cx: &mut MutableAppContext) { @@ -56,13 +55,14 @@ impl View for TerminalButton { .unwrap_or(false); let has_terminals = !project.local_terminal_handles().is_empty(); + let terminal_count = project.local_terminal_handles().len() as i32; let theme = cx.global::().theme.clone(); Stack::new() .with_child( MouseEventHandler::::new(0, cx, { let theme = theme.clone(); - move |state, _| { + move |state, _cx| { let style = theme .workspace .status_bar @@ -70,10 +70,23 @@ impl View for TerminalButton { .item .style_for(state, active); - Svg::new("icons/terminal_12.svg") - .with_color(style.icon_color) + Flex::row() + .with_child( + Svg::new("icons/terminal_12.svg") + .with_color(style.icon_color) + .constrained() + .with_width(style.icon_size) + .aligned() + .named("terminals-icon"), + ) + .with_children(has_terminals.then(|| { + Label::new(terminal_count.to_string(), style.label.text.clone()) + .contained() + .with_style(style.label.container) + .aligned() + .boxed() + })) .constrained() - .with_width(style.icon_size) .with_height(style.icon_size) .contained() .with_style(style.container) @@ -112,8 +125,7 @@ impl View for TerminalButton { impl TerminalButton { pub fn new(workspace: ViewHandle, cx: &mut ViewContext) -> Self { - // When terminal moves, redraw so that the icon and toggle status matches. - cx.subscribe(&workspace, |_, _, _, cx| cx.notify()).detach(); + cx.observe(&workspace, |_, _, cx| cx.notify()).detach(); Self { workspace: workspace.downgrade(), popup_menu: cx.add_view(|cx| { diff --git a/crates/theme/src/theme.rs b/crates/theme/src/theme.rs index 87de31f635d7246dc8bee0c2c510f846114bdfaa..d64a1d2499a690e245e16e94b1d76dcdc7327132 100644 --- a/crates/theme/src/theme.rs +++ b/crates/theme/src/theme.rs @@ -340,12 +340,13 @@ pub struct Sidebar { pub container: ContainerStyle, } -#[derive(Clone, Copy, Deserialize, Default)] +#[derive(Clone, Deserialize, Default)] pub struct SidebarItem { #[serde(flatten)] pub container: ContainerStyle, pub icon_color: Color, pub icon_size: f32, + pub label: ContainedText, } #[derive(Deserialize, Default)] diff --git a/crates/workspace/src/sidebar.rs b/crates/workspace/src/sidebar.rs index 214f2277579f37dd057b7c75d3c8d4bf85cc0472..37375b7e4a1aafe5095a33fffdf09bf10d372f33 100644 --- a/crates/workspace/src/sidebar.rs +++ b/crates/workspace/src/sidebar.rs @@ -230,7 +230,7 @@ impl View for SidebarButtons { let tooltip_style = theme.tooltip.clone(); let theme = &theme.workspace.status_bar.sidebar_buttons; let sidebar = self.sidebar.read(cx); - let item_style = theme.item; + let item_style = theme.item.clone(); let badge_style = theme.badge; let active_ix = sidebar.active_item_ix; let is_open = sidebar.is_open; @@ -254,7 +254,7 @@ impl View for SidebarButtons { sidebar_side, item_index: ix, }; - MouseEventHandler::::new(ix, cx, move |state, cx| { + MouseEventHandler::::new(ix, cx, |state, cx| { let is_active = is_open && ix == active_ix; let style = item_style.style_for(state, is_active); Stack::new() diff --git a/crates/zed/Cargo.toml b/crates/zed/Cargo.toml index 4ae59fe4295aa33c5fcce81a4861298be3835f22..4d7ce828d69635a4e8f43fafb7b05e0089c0aa5e 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.79.0" +version = "0.80.0" publish = false [lib] diff --git a/crates/zed/src/languages/installation.rs b/crates/zed/src/languages/installation.rs index 80bb1c95009b9f285fe1ea68c1d4ed24613471e7..c5aff17e566b69b33e788ded686fd2eb8acef1d3 100644 --- a/crates/zed/src/languages/installation.rs +++ b/crates/zed/src/languages/installation.rs @@ -64,7 +64,6 @@ pub async fn npm_install_packages( let output = smol::process::Command::new("npm") .args(["-fetch-retry-mintimeout", "2000"]) .args(["-fetch-retry-maxtimeout", "5000"]) - .args(["-fetch-timeout", "5000"]) .arg("install") .arg("--prefix") .arg(directory) diff --git a/styles/src/styleTree/statusBar.ts b/styles/src/styleTree/statusBar.ts index b7e9696488d5712ecc065ecac68bd2c7b1182afa..41961c46157764ed56ba48b53979251866df85ca 100644 --- a/styles/src/styleTree/statusBar.ts +++ b/styles/src/styleTree/statusBar.ts @@ -100,6 +100,10 @@ export default function statusBar(colorScheme: ColorScheme) { ...statusContainer, iconSize: 16, iconColor: foreground(layer, "variant"), + label: { + margin: { left: 6 }, + ...text(layer, "sans", { size: "sm" }), + }, hover: { iconColor: foreground(layer, "hovered"), background: background(layer, "variant"), diff --git a/styles/src/styleTree/workspace.ts b/styles/src/styleTree/workspace.ts index e3c24a0a6a54b80a29881335e1c6018c5f021ff6..6edbfe7c55a9e6fd8161cbd3fafc5a37f63d5f5a 100644 --- a/styles/src/styleTree/workspace.ts +++ b/styles/src/styleTree/workspace.ts @@ -174,6 +174,9 @@ export default function workspace(colorScheme: ColorScheme) { // Sign in buttom // FlatButton, Variant signInPrompt: { + margin: { + left: itemSpacing + }, ...titlebarButton, },