diff --git a/crates/acp_tools/src/acp_tools.rs b/crates/acp_tools/src/acp_tools.rs index 52a9d03f893d0b82bf6395b4c96bc9ebe14d3afe..ae8a39c8df4f73ae8be6b748694dbde5d2a0c102 100644 --- a/crates/acp_tools/src/acp_tools.rs +++ b/crates/acp_tools/src/acp_tools.rs @@ -13,7 +13,7 @@ use gpui::{ StyleRefinement, Subscription, Task, TextStyleRefinement, Window, actions, list, prelude::*, }; use language::LanguageRegistry; -use markdown::{CodeBlockRenderer, Markdown, MarkdownElement, MarkdownStyle}; +use markdown::{CodeBlockRenderer, CopyButtonVisibility, Markdown, MarkdownElement, MarkdownStyle}; use project::{AgentId, Project}; use settings::Settings; use theme_settings::ThemeSettings; @@ -384,8 +384,11 @@ impl AcpTools { ) .code_block_renderer( CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: expanded, + copy_button_visibility: if expanded { + CopyButtonVisibility::VisibleOnHover + } else { + CopyButtonVisibility::Hidden + }, border: false, }, ), diff --git a/crates/diagnostics/src/diagnostic_renderer.rs b/crates/diagnostics/src/diagnostic_renderer.rs index 27e1cbbac9c779056ecd9da00dd7a56ff3536f17..62b7f4eadf322da1c57a9f1da60b412d7b0dcd68 100644 --- a/crates/diagnostics/src/diagnostic_renderer.rs +++ b/crates/diagnostics/src/diagnostic_renderer.rs @@ -8,7 +8,7 @@ use editor::{ use gpui::{AppContext, Entity, Focusable, WeakEntity}; use language::{BufferId, Diagnostic, DiagnosticEntryRef, LanguageRegistry}; use lsp::DiagnosticSeverity; -use markdown::{Markdown, MarkdownElement}; +use markdown::{CopyButtonVisibility, Markdown, MarkdownElement}; use settings::Settings; use text::{AnchorRangeExt, Point}; use theme_settings::ThemeSettings; @@ -239,8 +239,7 @@ impl DiagnosticBlock { diagnostics_markdown_style(bcx.window, cx), ) .code_block_renderer(markdown::CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: false, + copy_button_visibility: CopyButtonVisibility::Hidden, border: false, }) .on_url_click({ diff --git a/crates/editor/src/code_context_menus.rs b/crates/editor/src/code_context_menus.rs index 3fc6080b4da8ca85d258d04de29d603ea7097623..5d6c037d9b67034423dda9f119a1e78fb1e5b9b2 100644 --- a/crates/editor/src/code_context_menus.rs +++ b/crates/editor/src/code_context_menus.rs @@ -9,7 +9,7 @@ use itertools::Itertools; use language::CodeLabel; use language::{Buffer, LanguageName, LanguageRegistry}; use lsp::CompletionItemTag; -use markdown::{Markdown, MarkdownElement}; +use markdown::{CopyButtonVisibility, Markdown, MarkdownElement}; use multi_buffer::{Anchor, ExcerptId}; use ordered_float::OrderedFloat; use project::lsp_store::CompletionDocumentation; @@ -1118,8 +1118,7 @@ impl CompletionsMenu { div().child( MarkdownElement::new(markdown, hover_markdown_style(window, cx)) .code_block_renderer(markdown::CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: false, + copy_button_visibility: CopyButtonVisibility::Hidden, border: false, }) .on_url_click(open_markdown_url), diff --git a/crates/editor/src/hover_popover.rs b/crates/editor/src/hover_popover.rs index 9b127a8f1bc089d9cee28254c6b8ffc181677765..3bad6c97b6bcba4015331257a5b9a476dd0d3fd3 100644 --- a/crates/editor/src/hover_popover.rs +++ b/crates/editor/src/hover_popover.rs @@ -17,7 +17,7 @@ use gpui::{ use itertools::Itertools; use language::{DiagnosticEntry, Language, LanguageRegistry}; use lsp::DiagnosticSeverity; -use markdown::{Markdown, MarkdownElement, MarkdownStyle}; +use markdown::{CopyButtonVisibility, Markdown, MarkdownElement, MarkdownStyle}; use multi_buffer::{MultiBufferOffset, ToOffset, ToPoint}; use project::{HoverBlock, HoverBlockKind, InlayHintLabelPart}; use settings::Settings; @@ -1040,8 +1040,7 @@ impl InfoPopover { .child( MarkdownElement::new(markdown, hover_markdown_style(window, cx)) .code_block_renderer(markdown::CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: false, + copy_button_visibility: CopyButtonVisibility::Hidden, border: false, }) .on_url_click(open_markdown_url) @@ -1155,8 +1154,7 @@ impl DiagnosticPopover { diagnostics_markdown_style(window, cx), ) .code_block_renderer(markdown::CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: false, + copy_button_visibility: CopyButtonVisibility::Hidden, border: false, }) .on_url_click( diff --git a/crates/editor/src/signature_help.rs b/crates/editor/src/signature_help.rs index 27c26d4691686c16bcbafbf74bba6b5f1156b835..6305fc73e44d745e943c1d4c8ec573e0cce7d9ed 100644 --- a/crates/editor/src/signature_help.rs +++ b/crates/editor/src/signature_help.rs @@ -7,7 +7,7 @@ use gpui::{ }; use language::BufferSnapshot; -use markdown::{Markdown, MarkdownElement}; +use markdown::{CopyButtonVisibility, Markdown, MarkdownElement}; use multi_buffer::{Anchor, MultiBufferOffset, ToOffset}; use settings::Settings; use std::ops::Range; @@ -408,9 +408,8 @@ impl SignatureHelpPopover { hover_markdown_style(window, cx), ) .code_block_renderer(markdown::CodeBlockRenderer::Default { - copy_button: false, + copy_button_visibility: CopyButtonVisibility::Hidden, border: false, - copy_button_on_hover: false, }) .on_url_click(open_markdown_url), ) @@ -421,9 +420,8 @@ impl SignatureHelpPopover { .child( MarkdownElement::new(description, hover_markdown_style(window, cx)) .code_block_renderer(markdown::CodeBlockRenderer::Default { - copy_button: false, + copy_button_visibility: CopyButtonVisibility::Hidden, border: false, - copy_button_on_hover: false, }) .on_url_click(open_markdown_url), ) diff --git a/crates/markdown/src/html/html_rendering.rs b/crates/markdown/src/html/html_rendering.rs index 56ab2db26b682e197c194157a87e646d9e55019d..103e2a6accb7dce9bc429419aafd27cbdf5080ce 100644 --- a/crates/markdown/src/html/html_rendering.rs +++ b/crates/markdown/src/html/html_rendering.rs @@ -497,7 +497,10 @@ mod tests { use gpui::{TestAppContext, size}; use ui::prelude::*; - use crate::{CodeBlockRenderer, Markdown, MarkdownElement, MarkdownOptions, MarkdownStyle}; + use crate::{ + CodeBlockRenderer, CopyButtonVisibility, Markdown, MarkdownElement, MarkdownOptions, + MarkdownStyle, + }; fn ensure_theme_initialized(cx: &mut TestAppContext) { cx.update(|cx| { @@ -530,8 +533,7 @@ mod tests { |_window, _cx| { MarkdownElement::new(markdown, MarkdownStyle::default()).code_block_renderer( CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: false, + copy_button_visibility: CopyButtonVisibility::Hidden, border: false, }, ) @@ -591,8 +593,7 @@ mod tests { |_window, _cx| { MarkdownElement::new(markdown, MarkdownStyle::default()).code_block_renderer( CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: false, + copy_button_visibility: CopyButtonVisibility::Hidden, border: false, }, ) diff --git a/crates/markdown/src/markdown.rs b/crates/markdown/src/markdown.rs index 6063e98229025d4160b9d3aeb4b412494f443e7d..c31ca79e7581926e7696fa596aaccc9371512841 100644 --- a/crates/markdown/src/markdown.rs +++ b/crates/markdown/src/markdown.rs @@ -270,10 +270,16 @@ pub struct MarkdownOptions { pub render_mermaid_diagrams: bool, } +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum CopyButtonVisibility { + Hidden, + AlwaysVisible, + VisibleOnHover, +} + pub enum CodeBlockRenderer { Default { - copy_button: bool, - copy_button_on_hover: bool, + copy_button_visibility: CopyButtonVisibility, border: bool, }, Custom { @@ -826,8 +832,7 @@ impl MarkdownElement { markdown, style, code_block_renderer: CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: true, + copy_button_visibility: CopyButtonVisibility::VisibleOnHover, border: false, }, on_url_click: None, @@ -1686,38 +1691,10 @@ impl Element for MarkdownElement { builder.pop_text_style(); if let CodeBlockRenderer::Default { - copy_button: true, .. - } = &self.code_block_renderer - { - builder.modify_current_div(|el| { - let content_range = parser::extract_code_block_content_range( - &parsed_markdown.source()[range.clone()], - ); - let content_range = content_range.start + range.start - ..content_range.end + range.start; - - let code = parsed_markdown.source()[content_range].to_string(); - let codeblock = render_copy_code_block_button( - range.end, - code, - self.markdown.clone(), - ); - el.child( - h_flex() - .w_4() - .absolute() - .top_1p5() - .right_1p5() - .justify_end() - .child(codeblock), - ) - }); - } - - if let CodeBlockRenderer::Default { - copy_button_on_hover: true, + copy_button_visibility, .. } = &self.code_block_renderer + && *copy_button_visibility != CopyButtonVisibility::Hidden { builder.modify_current_div(|el| { let content_range = parser::extract_code_block_content_range( @@ -1736,10 +1713,17 @@ impl Element for MarkdownElement { h_flex() .w_4() .absolute() - .top_0() - .right_0() .justify_end() - .visible_on_hover("code_block") + .when_else( + *copy_button_visibility + == CopyButtonVisibility::VisibleOnHover, + |this| { + this.top_0() + .right_0() + .visible_on_hover("code_block") + }, + |this| this.top_1p5().right_1p5(), + ) .child(codeblock), ) }); @@ -2772,8 +2756,7 @@ mod tests { |_window, _cx| { MarkdownElement::new(markdown, MarkdownStyle::default()).code_block_renderer( CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: false, + copy_button_visibility: CopyButtonVisibility::Hidden, border: false, }, ) diff --git a/crates/markdown/src/mermaid.rs b/crates/markdown/src/mermaid.rs index 15f3de4d8e8c64010fe96846b05d75f012c5fc0d..b8e40ebe7ec16cbbb8d9b11ab3edfc75da46f3a9 100644 --- a/crates/markdown/src/mermaid.rs +++ b/crates/markdown/src/mermaid.rs @@ -266,7 +266,10 @@ mod tests { CachedMermaidDiagram, MermaidDiagramCache, MermaidState, ParsedMarkdownMermaidDiagramContents, extract_mermaid_diagrams, parse_mermaid_info, }; - use crate::{CodeBlockRenderer, Markdown, MarkdownElement, MarkdownOptions, MarkdownStyle}; + use crate::{ + CodeBlockRenderer, CopyButtonVisibility, Markdown, MarkdownElement, MarkdownOptions, + MarkdownStyle, + }; use collections::HashMap; use gpui::{Context, IntoElement, Render, RenderImage, TestAppContext, Window, size}; use std::sync::Arc; @@ -309,8 +312,7 @@ mod tests { |_window, _cx| { MarkdownElement::new(markdown, MarkdownStyle::default()).code_block_renderer( CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: false, + copy_button_visibility: CopyButtonVisibility::Hidden, border: false, }, ) @@ -581,8 +583,7 @@ mod tests { |_window, _cx| { MarkdownElement::new(markdown.clone(), MarkdownStyle::default()) .code_block_renderer(CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: false, + copy_button_visibility: CopyButtonVisibility::Hidden, border: false, }) }, diff --git a/crates/markdown_preview/src/markdown_preview_view.rs b/crates/markdown_preview/src/markdown_preview_view.rs index 8e289e451dada6170f7b2bd7282ef9f165d26cff..6dbf44c20f3ce453a7ef711e1854b806cf29737a 100644 --- a/crates/markdown_preview/src/markdown_preview_view.rs +++ b/crates/markdown_preview/src/markdown_preview_view.rs @@ -13,7 +13,8 @@ use gpui::{ }; use language::LanguageRegistry; use markdown::{ - CodeBlockRenderer, Markdown, MarkdownElement, MarkdownFont, MarkdownOptions, MarkdownStyle, + CodeBlockRenderer, CopyButtonVisibility, Markdown, MarkdownElement, MarkdownFont, + MarkdownOptions, MarkdownStyle, }; use settings::Settings; use theme_settings::ThemeSettings; @@ -593,8 +594,7 @@ impl MarkdownPreviewView { MarkdownStyle::themed(MarkdownFont::Editor, window, cx), ) .code_block_renderer(CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: true, + copy_button_visibility: CopyButtonVisibility::VisibleOnHover, border: false, }) .scroll_handle(self.scroll_handle.clone()) diff --git a/crates/workspace/src/notifications.rs b/crates/workspace/src/notifications.rs index dbf2accf3dd9910426ca3557daf9cee0e5b0a82b..b4f683fa6952b9d6f26b8933e010f4c7d2de898c 100644 --- a/crates/workspace/src/notifications.rs +++ b/crates/workspace/src/notifications.rs @@ -5,7 +5,7 @@ use gpui::{ DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, PromptLevel, Render, ScrollHandle, Task, TextStyleRefinement, UnderlineStyle, WeakEntity, svg, }; -use markdown::{Markdown, MarkdownElement, MarkdownStyle}; +use markdown::{CopyButtonVisibility, Markdown, MarkdownElement, MarkdownStyle}; use parking_lot::Mutex; use project::project_settings::ProjectSettings; use settings::Settings; @@ -401,8 +401,7 @@ impl Render for LanguageServerPrompt { MarkdownElement::new(self.markdown.clone(), markdown_style(window, cx)) .text_size(TextSize::Small.rems(cx)) .code_block_renderer(markdown::CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: false, + copy_button_visibility: CopyButtonVisibility::Hidden, border: false, }) .on_url_click(|link, _, cx| cx.open_url(&link)), diff --git a/crates/zed/src/zed/telemetry_log.rs b/crates/zed/src/zed/telemetry_log.rs index cc07783f57b27cc57a281089effb208fc3947050..7df7e83d25804edb1a7a73abf055d9adaf080a90 100644 --- a/crates/zed/src/zed/telemetry_log.rs +++ b/crates/zed/src/zed/telemetry_log.rs @@ -12,7 +12,7 @@ use gpui::{ StyleRefinement, Task, TextStyleRefinement, Window, list, prelude::*, }; use language::LanguageRegistry; -use markdown::{CodeBlockRenderer, Markdown, MarkdownElement, MarkdownStyle}; +use markdown::{CodeBlockRenderer, CopyButtonVisibility, Markdown, MarkdownElement, MarkdownStyle}; use project::Project; use settings::Settings; use telemetry_events::{Event, EventWrapper}; @@ -424,8 +424,11 @@ impl TelemetryLogView { }, ) .code_block_renderer(CodeBlockRenderer::Default { - copy_button: false, - copy_button_on_hover: expanded, + copy_button_visibility: if expanded { + CopyButtonVisibility::VisibleOnHover + } else { + CopyButtonVisibility::Hidden + }, border: false, }), ),