@@ -59,12 +59,12 @@ use fuzzy::{StringMatch, StringMatchCandidate};
use git::diff_hunk_to_display;
use gpui::{
div, impl_actions, point, prelude::*, px, relative, rems, size, uniform_list, Action,
- AnyElement, AppContext, AsyncWindowContext, BackgroundExecutor, Bounds, ClipboardItem, Context,
- DispatchPhase, ElementId, EventEmitter, FocusHandle, FocusableView, FontId, FontStyle,
- FontWeight, HighlightStyle, Hsla, InteractiveText, KeyContext, Model, MouseButton,
- ParentElement, Pixels, Render, SharedString, StrikethroughStyle, Styled, StyledText,
- Subscription, Task, TextStyle, UnderlineStyle, UniformListScrollHandle, View, ViewContext,
- ViewInputHandler, VisualContext, WeakView, WhiteSpace, WindowContext,
+ AnyElement, AppContext, AsyncWindowContext, AvailableSpace, BackgroundExecutor, Bounds,
+ ClipboardItem, Context, DispatchPhase, ElementId, EventEmitter, FocusHandle, FocusableView,
+ FontId, FontStyle, FontWeight, HighlightStyle, Hsla, InteractiveText, KeyContext, Model,
+ MouseButton, ParentElement, Pixels, Render, SharedString, StrikethroughStyle, Styled,
+ StyledText, Subscription, Task, TextStyle, UnderlineStyle, UniformListScrollHandle, View,
+ ViewContext, ViewInputHandler, VisualContext, WeakView, WhiteSpace, WindowContext,
};
use highlight_matching_bracket::refresh_matching_bracket_highlights;
use hover_popover::{hide_hover, HoverState};
@@ -10499,6 +10499,41 @@ pub fn diagnostic_block_renderer(diagnostic: Diagnostic, _is_valid: bool) -> Ren
let mut text_style = cx.text_style().clone();
text_style.color = diagnostic_style(diagnostic.severity, true, cx.theme().status());
+ let multi_line_diagnostic = diagnostic.message.contains('\n');
+
+ let buttons = |diagnostic: &Diagnostic, block_id: usize| {
+ if multi_line_diagnostic {
+ v_flex()
+ } else {
+ h_flex()
+ }
+ .children(diagnostic.is_primary.then(|| {
+ IconButton::new(("close-block", block_id), IconName::XCircle)
+ .icon_color(Color::Muted)
+ .size(ButtonSize::Compact)
+ .style(ButtonStyle::Transparent)
+ .visible_on_hover(group_id.clone())
+ .on_click(move |_click, cx| cx.dispatch_action(Box::new(Cancel)))
+ .tooltip(|cx| Tooltip::for_action("Close Diagnostics", &Cancel, cx))
+ }))
+ .child(
+ IconButton::new(("copy-block", block_id), IconName::Copy)
+ .icon_color(Color::Muted)
+ .size(ButtonSize::Compact)
+ .style(ButtonStyle::Transparent)
+ .visible_on_hover(group_id.clone())
+ .on_click({
+ let message = diagnostic.message.clone();
+ move |_click, cx| cx.write_to_clipboard(ClipboardItem::new(message.clone()))
+ })
+ .tooltip(|cx| Tooltip::text("Copy diagnostic message", cx)),
+ )
+ };
+
+ let icon_size = buttons(&diagnostic, cx.block_id)
+ .into_any_element()
+ .measure(AvailableSpace::min_size(), cx);
+
h_flex()
.id(cx.block_id)
.group(group_id.clone())
@@ -10509,9 +10544,10 @@ pub fn diagnostic_block_renderer(diagnostic: Diagnostic, _is_valid: bool) -> Ren
.child(
div()
.flex()
- .w(cx.anchor_x - cx.gutter_dimensions.width)
+ .w(cx.anchor_x - cx.gutter_dimensions.width - icon_size.width)
.flex_shrink(),
)
+ .child(buttons(&diagnostic, cx.block_id))
.child(div().flex().flex_shrink_0().child(
StyledText::new(text_without_backticks.clone()).with_highlights(
&text_style,
@@ -10526,18 +10562,6 @@ pub fn diagnostic_block_renderer(diagnostic: Diagnostic, _is_valid: bool) -> Ren
}),
),
))
- .child(
- IconButton::new(("copy-block", cx.block_id), IconName::Copy)
- .icon_color(Color::Muted)
- .size(ButtonSize::Compact)
- .style(ButtonStyle::Transparent)
- .visible_on_hover(group_id)
- .on_click({
- let message = diagnostic.message.clone();
- move |_click, cx| cx.write_to_clipboard(ClipboardItem::new(message.clone()))
- })
- .tooltip(|cx| Tooltip::text("Copy diagnostic message", cx)),
- )
.into_any_element()
})
}