diff --git a/crates/assistant/src/assistant_panel.rs b/crates/assistant/src/assistant_panel.rs index dbd00e33eb..92e3f215c8 100644 --- a/crates/assistant/src/assistant_panel.rs +++ b/crates/assistant/src/assistant_panel.rs @@ -2023,18 +2023,8 @@ impl FocusableView for ContextEditor { impl Item for ContextEditor { type Event = editor::EditorEvent; - fn tab_content(&self, params: item::TabContentParams, cx: &WindowContext) -> AnyElement { - let color = if params.selected { - Color::Default - } else { - Color::Muted - }; - Label::new(util::truncate_and_trailoff( - &self.title(cx), - Self::MAX_TAB_TITLE_LEN, - )) - .color(color) - .into_any_element() + fn tab_content_text(&self, cx: &WindowContext) -> Option { + Some(util::truncate_and_trailoff(&self.title(cx), Self::MAX_TAB_TITLE_LEN).into()) } fn to_item_events(event: &Self::Event, mut f: impl FnMut(item::ItemEvent)) { @@ -2531,13 +2521,8 @@ impl EventEmitter<()> for ContextHistory {} impl Item for ContextHistory { type Event = (); - fn tab_content(&self, params: item::TabContentParams, _: &WindowContext) -> AnyElement { - let color = if params.selected { - Color::Default - } else { - Color::Muted - }; - Label::new("History").color(color).into_any_element() + fn tab_content_text(&self, _cx: &WindowContext) -> Option { + Some("History".into()) } } diff --git a/crates/collab_ui/src/channel_view.rs b/crates/collab_ui/src/channel_view.rs index dfd19264e5..fcf8d31fcf 100644 --- a/crates/collab_ui/src/channel_view.rs +++ b/crates/collab_ui/src/channel_view.rs @@ -11,20 +11,20 @@ use editor::{ EditorEvent, }; use gpui::{ - actions, AnyElement, AnyView, AppContext, ClipboardItem, Entity as _, EventEmitter, - FocusableView, IntoElement as _, Model, Pixels, Point, Render, Subscription, Task, View, - ViewContext, VisualContext as _, WeakView, WindowContext, + actions, AnyView, AppContext, ClipboardItem, Entity as _, EventEmitter, FocusableView, Model, + Pixels, Point, Render, Subscription, Task, View, ViewContext, VisualContext as _, WeakView, + WindowContext, }; use project::Project; use std::{ any::{Any, TypeId}, sync::Arc, }; -use ui::{prelude::*, Label}; +use ui::prelude::*; use util::ResultExt; use workspace::{item::Dedup, notifications::NotificationId}; use workspace::{ - item::{FollowableItem, Item, ItemEvent, ItemHandle, TabContentParams}, + item::{FollowableItem, Item, ItemEvent, ItemHandle}, searchable::SearchableItemHandle, ItemNavHistory, Pane, SaveIntent, Toast, ViewId, Workspace, WorkspaceId, }; @@ -385,7 +385,7 @@ impl Item for ChannelView { } } - fn tab_content(&self, params: TabContentParams, cx: &WindowContext) -> AnyElement { + fn tab_content_text(&self, cx: &WindowContext) -> Option { let label = if let Some(channel) = self.channel(cx) { match ( self.channel_buffer.read(cx).buffer().read(cx).read_only(), @@ -398,13 +398,7 @@ impl Item for ChannelView { } else { "channel notes (disconnected)".to_string() }; - Label::new(label) - .color(if params.selected { - Color::Default - } else { - Color::Muted - }) - .into_any_element() + Some(label.into()) } fn telemetry_event_text(&self) -> Option<&'static str> { diff --git a/crates/extensions_ui/src/extensions_ui.rs b/crates/extensions_ui/src/extensions_ui.rs index 2517097086..d96cf3c744 100644 --- a/crates/extensions_ui/src/extensions_ui.rs +++ b/crates/extensions_ui/src/extensions_ui.rs @@ -14,7 +14,7 @@ use editor::{Editor, EditorElement, EditorStyle}; use extension::{ExtensionManifest, ExtensionOperation, ExtensionStore}; use fuzzy::{match_strings, StringMatchCandidate}; use gpui::{ - actions, uniform_list, AnyElement, AppContext, EventEmitter, Flatten, FocusableView, FontStyle, + actions, uniform_list, AppContext, EventEmitter, Flatten, FocusableView, FontStyle, InteractiveElement, KeyContext, ParentElement, Render, Styled, Task, TextStyle, UniformListScrollHandle, View, ViewContext, VisualContext, WeakView, WhiteSpace, WindowContext, }; @@ -25,7 +25,6 @@ use settings::Settings; use theme::ThemeSettings; use ui::{prelude::*, CheckboxWithLabel, ContextMenu, PopoverMenu, ToggleButton, Tooltip}; use vim::VimModeSetting; -use workspace::item::TabContentParams; use workspace::{ item::{Item, ItemEvent}, Workspace, WorkspaceId, @@ -1135,14 +1134,8 @@ impl FocusableView for ExtensionsPage { impl Item for ExtensionsPage { type Event = ItemEvent; - fn tab_content(&self, params: TabContentParams, _: &WindowContext) -> AnyElement { - Label::new("Extensions") - .color(if params.selected { - Color::Default - } else { - Color::Muted - }) - .into_any_element() + fn tab_content_text(&self, _cx: &WindowContext) -> Option { + Some("Extensions".into()) } fn telemetry_event_text(&self) -> Option<&'static str> { diff --git a/crates/language_tools/src/lsp_log.rs b/crates/language_tools/src/lsp_log.rs index 2d0527cb5c..6bd4c2ca4f 100644 --- a/crates/language_tools/src/lsp_log.rs +++ b/crates/language_tools/src/lsp_log.rs @@ -3,9 +3,9 @@ use copilot::Copilot; use editor::{actions::MoveToEnd, Editor, EditorEvent}; use futures::{channel::mpsc, StreamExt}; use gpui::{ - actions, div, AnchorCorner, AnyElement, AppContext, Context, EventEmitter, FocusHandle, - FocusableView, IntoElement, Model, ModelContext, ParentElement, Render, Styled, Subscription, - View, ViewContext, VisualContext, WeakModel, WindowContext, + actions, div, AnchorCorner, AppContext, Context, EventEmitter, FocusHandle, FocusableView, + IntoElement, Model, ModelContext, ParentElement, Render, Styled, Subscription, View, + ViewContext, VisualContext, WeakModel, WindowContext, }; use language::{LanguageServerId, LanguageServerName}; use lsp::{IoKind, LanguageServer}; @@ -13,7 +13,7 @@ use project::{search::SearchQuery, Project}; use std::{borrow::Cow, sync::Arc}; use ui::{prelude::*, Button, Checkbox, ContextMenu, Label, PopoverMenu, Selection}; use workspace::{ - item::{Item, ItemHandle, TabContentParams}, + item::{Item, ItemHandle}, searchable::{SearchEvent, SearchableItem, SearchableItemHandle}, ToolbarItemEvent, ToolbarItemLocation, ToolbarItemView, Workspace, }; @@ -697,14 +697,8 @@ impl Item for LspLogView { Editor::to_item_events(event, f) } - fn tab_content(&self, params: TabContentParams, _: &WindowContext<'_>) -> AnyElement { - Label::new("LSP Logs") - .color(if params.selected { - Color::Default - } else { - Color::Muted - }) - .into_any_element() + fn tab_content_text(&self, _cx: &WindowContext) -> Option { + Some("LSP Logs".into()) } fn telemetry_event_text(&self) -> Option<&'static str> { diff --git a/crates/language_tools/src/syntax_tree_view.rs b/crates/language_tools/src/syntax_tree_view.rs index 906bbee104..8208c45857 100644 --- a/crates/language_tools/src/syntax_tree_view.rs +++ b/crates/language_tools/src/syntax_tree_view.rs @@ -1,8 +1,8 @@ use editor::{scroll::Autoscroll, Anchor, Editor, ExcerptId}; use gpui::{ - actions, div, rems, uniform_list, AnyElement, AppContext, Div, EventEmitter, FocusHandle, - FocusableView, Hsla, InteractiveElement, IntoElement, Model, MouseButton, MouseDownEvent, - MouseMoveEvent, ParentElement, Render, Styled, UniformListScrollHandle, View, ViewContext, + actions, div, rems, uniform_list, AppContext, Div, EventEmitter, FocusHandle, FocusableView, + Hsla, InteractiveElement, IntoElement, Model, MouseButton, MouseDownEvent, MouseMoveEvent, + ParentElement, Render, SharedString, Styled, UniformListScrollHandle, View, ViewContext, VisualContext, WeakView, WindowContext, }; use language::{Buffer, OwnedSyntaxLayer}; @@ -11,7 +11,7 @@ use theme::ActiveTheme; use tree_sitter::{Node, TreeCursor}; use ui::{h_flex, ButtonLike, Color, ContextMenu, Label, LabelCommon, PopoverMenu}; use workspace::{ - item::{Item, ItemHandle, TabContentParams}, + item::{Item, ItemHandle}, SplitDirection, ToolbarItemEvent, ToolbarItemLocation, ToolbarItemView, Workspace, }; @@ -380,14 +380,8 @@ impl Item for SyntaxTreeView { fn to_item_events(_: &Self::Event, _: impl FnMut(workspace::item::ItemEvent)) {} - fn tab_content(&self, params: TabContentParams, _: &WindowContext<'_>) -> AnyElement { - Label::new("Syntax Tree") - .color(if params.selected { - Color::Default - } else { - Color::Muted - }) - .into_any_element() + fn tab_content_text(&self, _cx: &WindowContext) -> Option { + Some("Syntax Tree".into()) } fn telemetry_event_text(&self) -> Option<&'static str> { diff --git a/crates/markdown_preview/src/markdown_preview_view.rs b/crates/markdown_preview/src/markdown_preview_view.rs index 55f1cc5a5b..9c547ee665 100644 --- a/crates/markdown_preview/src/markdown_preview_view.rs +++ b/crates/markdown_preview/src/markdown_preview_view.rs @@ -6,13 +6,13 @@ use anyhow::Result; use editor::scroll::{Autoscroll, AutoscrollStrategy}; use editor::{Editor, EditorEvent}; use gpui::{ - list, AnyElement, AppContext, ClickEvent, EventEmitter, FocusHandle, FocusableView, - InteractiveElement, IntoElement, ListState, ParentElement, Render, Styled, Subscription, Task, - View, ViewContext, WeakView, + list, AppContext, ClickEvent, EventEmitter, FocusHandle, FocusableView, InteractiveElement, + IntoElement, ListState, ParentElement, Render, Styled, Subscription, Task, View, ViewContext, + WeakView, }; use language::LanguageRegistry; use ui::prelude::*; -use workspace::item::{Item, ItemHandle, TabContentParams}; +use workspace::item::{Item, ItemHandle}; use workspace::{Pane, Workspace}; use crate::markdown_elements::ParsedMarkdownElement; @@ -456,18 +456,12 @@ impl Item for MarkdownPreviewView { Some(Icon::new(IconName::FileDoc)) } - fn tab_content(&self, params: TabContentParams, _cx: &WindowContext) -> AnyElement { - Label::new(if let Some(description) = &self.tab_description { + fn tab_content_text(&self, _cx: &WindowContext) -> Option { + Some(if let Some(description) = &self.tab_description { description.clone().into() } else { self.fallback_tab_description.clone() }) - .color(if params.selected { - Color::Default - } else { - Color::Muted - }) - .into_any_element() } fn telemetry_event_text(&self) -> Option<&'static str> { diff --git a/crates/search/src/project_search.rs b/crates/search/src/project_search.rs index aa4d19eb24..708916d2f9 100644 --- a/crates/search/src/project_search.rs +++ b/crates/search/src/project_search.rs @@ -35,7 +35,7 @@ use ui::{ }; use util::paths::PathMatcher; use workspace::{ - item::{BreadcrumbText, Item, ItemEvent, ItemHandle, TabContentParams}, + item::{BreadcrumbText, Item, ItemEvent, ItemHandle}, searchable::{Direction, SearchableItem, SearchableItemHandle}, DeploySearch, ItemNavHistory, NewSearch, ToolbarItemEvent, ToolbarItemLocation, ToolbarItemView, Workspace, WorkspaceId, @@ -374,7 +374,7 @@ impl Item for ProjectSearchView { Some(Icon::new(IconName::MagnifyingGlass)) } - fn tab_content(&self, params: TabContentParams, cx: &WindowContext<'_>) -> AnyElement { + fn tab_content_text(&self, cx: &WindowContext) -> Option { let last_query: Option = self .model .read(cx) @@ -385,16 +385,11 @@ impl Item for ProjectSearchView { let query_text = util::truncate_and_trailoff(&query, MAX_TAB_TITLE_LEN); query_text.into() }); - let tab_name = last_query - .filter(|query| !query.is_empty()) - .unwrap_or_else(|| "Project Search".into()); - Label::new(tab_name) - .color(if params.selected { - Color::Default - } else { - Color::Muted - }) - .into_any_element() + Some( + last_query + .filter(|query| !query.is_empty()) + .unwrap_or_else(|| "Project Search".into()), + ) } fn telemetry_event_text(&self) -> Option<&'static str> { diff --git a/crates/semantic_index/src/project_index_debug_view.rs b/crates/semantic_index/src/project_index_debug_view.rs index 1b183c5169..2f7d23663d 100644 --- a/crates/semantic_index/src/project_index_debug_view.rs +++ b/crates/semantic_index/src/project_index_debug_view.rs @@ -9,7 +9,7 @@ use settings::Settings; use std::{path::Path, sync::Arc}; use theme::ThemeSettings; use ui::prelude::*; -use workspace::item::{Item, TabContentParams}; +use workspace::item::Item; pub struct ProjectIndexDebugView { index: Model, @@ -271,14 +271,8 @@ impl EventEmitter<()> for ProjectIndexDebugView {} impl Item for ProjectIndexDebugView { type Event = (); - fn tab_content(&self, params: TabContentParams, _: &WindowContext<'_>) -> AnyElement { - Label::new("Project Index (Debug)") - .color(if params.selected { - Color::Default - } else { - Color::Muted - }) - .into_any_element() + fn tab_content_text(&self, _cx: &WindowContext) -> Option { + Some("Project Index (Debug)".into()) } fn clone_on_split( diff --git a/crates/welcome/src/welcome.rs b/crates/welcome/src/welcome.rs index 98892eb29f..3593eea378 100644 --- a/crates/welcome/src/welcome.rs +++ b/crates/welcome/src/welcome.rs @@ -5,9 +5,9 @@ mod multibuffer_hint; use client::{telemetry::Telemetry, TelemetrySettings}; use db::kvp::KEY_VALUE_STORE; use gpui::{ - actions, svg, AnyElement, AppContext, EventEmitter, FocusHandle, FocusableView, - InteractiveElement, ParentElement, Render, Styled, Subscription, Task, View, ViewContext, - VisualContext, WeakView, WindowContext, + actions, svg, AppContext, EventEmitter, FocusHandle, FocusableView, InteractiveElement, + ParentElement, Render, Styled, Subscription, Task, View, ViewContext, VisualContext, WeakView, + WindowContext, }; use settings::{Settings, SettingsStore}; use std::sync::Arc; @@ -15,7 +15,7 @@ use ui::{prelude::*, CheckboxWithLabel}; use vim::VimModeSetting; use workspace::{ dock::DockPosition, - item::{Item, ItemEvent, TabContentParams}, + item::{Item, ItemEvent}, open_new, AppState, Welcome, Workspace, WorkspaceId, }; @@ -303,14 +303,8 @@ impl FocusableView for WelcomePage { impl Item for WelcomePage { type Event = ItemEvent; - fn tab_content(&self, params: TabContentParams, _: &WindowContext) -> AnyElement { - Label::new("Welcome to Zed!") - .color(if params.selected { - Color::Default - } else { - Color::Muted - }) - .into_any_element() + fn tab_content_text(&self, _cx: &WindowContext) -> Option { + Some("Welcome to Zed!".into()) } fn telemetry_event_text(&self) -> Option<&'static str> { diff --git a/crates/workspace/src/item.rs b/crates/workspace/src/item.rs index d898d775c3..149e949568 100644 --- a/crates/workspace/src/item.rs +++ b/crates/workspace/src/item.rs @@ -31,7 +31,7 @@ use std::{ time::Duration, }; use theme::Theme; -use ui::{Element as _, Icon}; +use ui::{Color, Element as _, Icon, IntoElement, Label, LabelCommon}; use util::ResultExt; pub const LEADER_UPDATE_THROTTLE: Duration = Duration::from_millis(200); @@ -144,8 +144,30 @@ pub struct TabContentParams { pub trait Item: FocusableView + EventEmitter { type Event; - fn tab_content(&self, _params: TabContentParams, _cx: &WindowContext) -> AnyElement { - gpui::Empty.into_any() + + /// Returns the tab contents. + /// + /// By default this returns a [`Label`] that displays that text from + /// `tab_content_text`. + fn tab_content(&self, params: TabContentParams, cx: &WindowContext) -> AnyElement { + let Some(text) = self.tab_content_text(cx) else { + return gpui::Empty.into_any(); + }; + + let color = if params.selected { + Color::Default + } else { + Color::Muted + }; + + Label::new(text).color(color).into_any_element() + } + + /// Returns the textual contents of the tab. + /// + /// Use this if you don't need to customize the tab contents. + fn tab_content_text(&self, _cx: &WindowContext) -> Option { + None } fn tab_icon(&self, _cx: &WindowContext) -> Option { diff --git a/crates/workspace/src/shared_screen.rs b/crates/workspace/src/shared_screen.rs index 6784a75fb5..49af337e09 100644 --- a/crates/workspace/src/shared_screen.rs +++ b/crates/workspace/src/shared_screen.rs @@ -1,5 +1,5 @@ use crate::{ - item::{Item, ItemEvent, TabContentParams}, + item::{Item, ItemEvent}, ItemNavHistory, WorkspaceId, }; use anyhow::Result; @@ -12,7 +12,7 @@ use gpui::{ WindowContext, }; use std::sync::{Arc, Weak}; -use ui::{prelude::*, Icon, IconName, Label}; +use ui::{prelude::*, Icon, IconName}; pub enum Event { Close, @@ -97,14 +97,8 @@ impl Item for SharedScreen { Some(Icon::new(IconName::Screen)) } - fn tab_content(&self, params: TabContentParams, _: &WindowContext<'_>) -> gpui::AnyElement { - Label::new(format!("{}'s screen", self.user.github_login)) - .color(if params.selected { - Color::Default - } else { - Color::Muted - }) - .into_any_element() + fn tab_content_text(&self, _cx: &WindowContext) -> Option { + Some(format!("{}'s screen", self.user.github_login).into()) } fn telemetry_event_text(&self) -> Option<&'static str> {