Detailed changes
@@ -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,
},
),
@@ -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({
@@ -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),
@@ -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(
@@ -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),
)
@@ -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,
},
)
@@ -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,
},
)
@@ -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,
})
},
@@ -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())
@@ -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)),
@@ -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,
}),
),