Syntax tree panel style fixes
This commit is contained in:
@@ -1427,16 +1427,7 @@ impl Interactivity {
|
||||
let line_height = cx.line_height();
|
||||
let scroll_max = (content_size - bounds.size).max(&Size::default());
|
||||
let interactive_bounds = interactive_bounds.clone();
|
||||
let id = self.element_id.clone();
|
||||
cx.on_mouse_event(move |event: &ScrollWheelEvent, phase, cx| {
|
||||
if id == Some(ElementId::Name("SyntaxTreeView".into())) {
|
||||
dbg!(
|
||||
&overflow,
|
||||
event.position,
|
||||
&interactive_bounds,
|
||||
interactive_bounds.visibly_contains(&event.position, cx)
|
||||
);
|
||||
}
|
||||
if phase == DispatchPhase::Bubble
|
||||
&& interactive_bounds.visibly_contains(&event.position, cx)
|
||||
{
|
||||
@@ -1450,15 +1441,9 @@ impl Interactivity {
|
||||
}
|
||||
|
||||
if overflow.y == Overflow::Scroll {
|
||||
if id == Some(ElementId::Name("SyntaxTreeView".into())) {
|
||||
println!("prev scroll offset: {old_scroll_offset:?}, scroll_max: {scroll_max:?}, delta:{delta:?}");
|
||||
scroll_offset.y =
|
||||
(scroll_offset.y + delta.y).clamp(-scroll_max.height, px(0.));
|
||||
}
|
||||
scroll_offset.y =
|
||||
(scroll_offset.y + delta.y).clamp(-scroll_max.height, px(0.));
|
||||
if id == Some(ElementId::Name("SyntaxTreeView".into())) {
|
||||
println!("new scroll offset: {scroll_offset:?}, scroll_max: {scroll_max:?}, delta:{delta:?}");
|
||||
}
|
||||
}
|
||||
|
||||
if *scroll_offset != old_scroll_offset {
|
||||
cx.notify();
|
||||
@@ -1501,16 +1486,16 @@ impl Interactivity {
|
||||
}
|
||||
|
||||
cx.with_z_index(style.z_index.unwrap_or(0), |cx| {
|
||||
if style.background.as_ref().is_some_and(|fill| {
|
||||
fill.color().is_some_and(|color| !color.is_transparent())
|
||||
}) {
|
||||
cx.add_opaque_layer(bounds)
|
||||
}
|
||||
if style.background.as_ref().is_some_and(|fill| {
|
||||
fill.color().is_some_and(|color| !color.is_transparent())
|
||||
}) {
|
||||
cx.add_opaque_layer(bounds)
|
||||
}
|
||||
|
||||
f(style, scroll_offset.unwrap_or_default(), cx)
|
||||
})
|
||||
},
|
||||
);
|
||||
f(style, scroll_offset.unwrap_or_default(), cx)
|
||||
})
|
||||
},
|
||||
);
|
||||
|
||||
if let Some(group) = self.group.as_ref() {
|
||||
GroupBounds::pop(group, cx);
|
||||
|
||||
@@ -2,7 +2,7 @@ use editor::{scroll::autoscroll::Autoscroll, Anchor, Editor, ExcerptId};
|
||||
use gpui::{
|
||||
actions, canvas, div, rems, uniform_list, AnyElement, AppContext, AvailableSpace, Div,
|
||||
EventEmitter, FocusHandle, FocusableView, Hsla, InteractiveElement, IntoElement, Model,
|
||||
MouseButton, MouseDownEvent, MouseMoveEvent, ParentElement, Pixels, Render, Styled, TextStyle,
|
||||
MouseButton, MouseDownEvent, MouseMoveEvent, ParentElement, Pixels, Render, Styled,
|
||||
UniformListScrollHandle, View, ViewContext, VisualContext, WeakView, WindowContext,
|
||||
};
|
||||
use language::{Buffer, OwnedSyntaxLayerInfo};
|
||||
@@ -10,7 +10,7 @@ use settings::Settings;
|
||||
use std::{mem, ops::Range};
|
||||
use theme::{Theme, ThemeSettings};
|
||||
use tree_sitter::{Node, TreeCursor};
|
||||
use ui::{h_stack, popover_menu, ButtonLike, ContextMenu, Label, PopoverMenu};
|
||||
use ui::{h_stack, popover_menu, ButtonLike, Color, ContextMenu, Label, LabelCommon, PopoverMenu};
|
||||
use workspace::{
|
||||
item::{Item, ItemHandle},
|
||||
SplitDirection, ToolbarItemEvent, ToolbarItemLocation, ToolbarItemView, Workspace,
|
||||
@@ -279,63 +279,34 @@ impl SyntaxTreeView {
|
||||
cursor: &TreeCursor,
|
||||
depth: u32,
|
||||
selected: bool,
|
||||
hovered: bool,
|
||||
list_hovered: bool,
|
||||
style: &TextStyle,
|
||||
editor_theme: &Theme,
|
||||
_cx: &AppContext,
|
||||
) -> Div {
|
||||
let editor_colors = editor_theme.colors();
|
||||
let node = cursor.node();
|
||||
let mut range_style = style.clone();
|
||||
range_style.color = editor_colors.editor_line_number;
|
||||
|
||||
let mut anonymous_node_style = style.clone();
|
||||
let string_color = editor_theme
|
||||
.syntax()
|
||||
.highlights
|
||||
.iter()
|
||||
.find_map(|(name, style)| (name == "string").then(|| style.color)?);
|
||||
let property_color = editor_theme
|
||||
.syntax()
|
||||
.highlights
|
||||
.iter()
|
||||
.find_map(|(name, style)| (name == "property").then(|| style.color)?);
|
||||
if let Some(color) = string_color {
|
||||
anonymous_node_style.color = color;
|
||||
}
|
||||
|
||||
let mut row = h_stack().bg(gpui::yellow());
|
||||
let mut row = h_stack();
|
||||
if let Some(field_name) = cursor.field_name() {
|
||||
let mut field_style = style.clone();
|
||||
if let Some(color) = property_color {
|
||||
field_style.color = color;
|
||||
}
|
||||
|
||||
row = row.children([Label::new(field_name), Label::new(": ")]);
|
||||
row = row.children([Label::new(field_name).color(Color::Info), Label::new(": ")]);
|
||||
}
|
||||
|
||||
let node = cursor.node();
|
||||
return row
|
||||
.child(if node.is_named() {
|
||||
Label::new(node.kind()).color(Color::Default)
|
||||
} else {
|
||||
Label::new(format!("\"{}\"", node.kind())).color(Color::Created)
|
||||
})
|
||||
.child(
|
||||
if node.is_named() {
|
||||
Label::new(node.kind())
|
||||
} else {
|
||||
Label::new(format!("\"{}\"", node.kind()))
|
||||
},
|
||||
div()
|
||||
.child(Label::new(format_node_range(node)).color(Color::Muted))
|
||||
.pl_1(),
|
||||
)
|
||||
.child(Label::new(format_node_range(node)))
|
||||
.text_bg(if selected {
|
||||
editor_colors.element_selected
|
||||
} else if hovered && list_hovered {
|
||||
editor_colors.element_active
|
||||
} else {
|
||||
Hsla::default()
|
||||
})
|
||||
// todo!() does not work
|
||||
// .ml(rems(dbg!(depth) as f32 * 10.0))
|
||||
.pl(rems(dbg!(depth) as f32 * 10.0))
|
||||
// .padding(gutter_padding + depth as f32 * 18.0)
|
||||
;
|
||||
.pl(rems(depth as f32))
|
||||
.hover(|style| style.bg(editor_colors.element_active));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -344,21 +315,11 @@ impl Render for SyntaxTreeView {
|
||||
|
||||
fn render(&mut self, cx: &mut gpui::ViewContext<'_, Self>) -> Self::Element {
|
||||
let settings = ThemeSettings::get_global(cx);
|
||||
let font = settings.buffer_font.clone();
|
||||
let font_size = settings.buffer_font_size(cx);
|
||||
|
||||
let editor_theme = settings.active_theme.clone();
|
||||
let editor_colors = editor_theme.colors();
|
||||
let style = TextStyle {
|
||||
color: editor_colors.text,
|
||||
font_family: font.family,
|
||||
font_features: font.features,
|
||||
font_weight: font.weight,
|
||||
font_style: font.style,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
let line_height = cx.text_style().line_height_in_pixels(font_size);
|
||||
let line_height = cx
|
||||
.text_style()
|
||||
.line_height_in_pixels(settings.buffer_font_size(cx));
|
||||
if Some(line_height) != self.line_height {
|
||||
self.line_height = Some(line_height);
|
||||
self.hover_state_changed(cx);
|
||||
@@ -374,8 +335,6 @@ impl Render for SyntaxTreeView {
|
||||
{
|
||||
let layer = layer.clone();
|
||||
let theme = editor_theme.clone();
|
||||
|
||||
let list_hovered = false;
|
||||
let list = uniform_list(
|
||||
cx.view().clone(),
|
||||
"SyntaxTreeView",
|
||||
@@ -401,9 +360,6 @@ impl Render for SyntaxTreeView {
|
||||
&cursor,
|
||||
depth,
|
||||
Some(descendant_ix) == this.selected_descendant_ix,
|
||||
Some(descendant_ix) == this.hovered_descendant_ix,
|
||||
list_hovered,
|
||||
&style,
|
||||
&theme,
|
||||
cx,
|
||||
));
|
||||
|
||||
@@ -3,8 +3,8 @@ use crate::{
|
||||
ListSeparator, ListSubHeader,
|
||||
};
|
||||
use gpui::{
|
||||
px, Action, AppContext, DismissEvent, Div, EventEmitter, FocusHandle, FocusableView,
|
||||
IntoElement, Render, Subscription, View, VisualContext,
|
||||
px, Action, AnyElement, AppContext, DismissEvent, Div, EventEmitter, FocusHandle,
|
||||
FocusableView, IntoElement, Render, Subscription, View, VisualContext,
|
||||
};
|
||||
use menu::{SelectFirst, SelectLast, SelectNext, SelectPrev};
|
||||
use std::{rc::Rc, time::Duration};
|
||||
@@ -18,6 +18,9 @@ enum ContextMenuItem {
|
||||
handler: Rc<dyn Fn(&mut WindowContext)>,
|
||||
action: Option<Box<dyn Action>>,
|
||||
},
|
||||
CustomEntry {
|
||||
entry_render: Box<dyn Fn(&mut WindowContext) -> AnyElement>,
|
||||
},
|
||||
}
|
||||
|
||||
pub struct ContextMenu {
|
||||
@@ -83,6 +86,16 @@ impl ContextMenu {
|
||||
self
|
||||
}
|
||||
|
||||
pub fn custom_entry(
|
||||
mut self,
|
||||
entry_render: impl Fn(&mut WindowContext) -> AnyElement + 'static,
|
||||
) -> Self {
|
||||
self.items.push(ContextMenuItem::CustomEntry {
|
||||
entry_render: Box::new(entry_render),
|
||||
});
|
||||
self
|
||||
}
|
||||
|
||||
pub fn action(mut self, label: impl Into<SharedString>, action: Box<dyn Action>) -> Self {
|
||||
self.items.push(ContextMenuItem::Entry {
|
||||
label: label.into(),
|
||||
@@ -230,9 +243,9 @@ impl Render for ContextMenu {
|
||||
el
|
||||
})
|
||||
.flex_none()
|
||||
.child(
|
||||
List::new().children(self.items.iter().enumerate().map(
|
||||
|(ix, item)| match item {
|
||||
.child(List::new().children(self.items.iter_mut().enumerate().map(
|
||||
|(ix, item)| {
|
||||
match item {
|
||||
ContextMenuItem::Separator => ListSeparator.into_any_element(),
|
||||
ContextMenuItem::Header(header) => {
|
||||
ListSubHeader::new(header.clone()).into_any_element()
|
||||
@@ -255,7 +268,7 @@ impl Render for ContextMenu {
|
||||
Label::new(label.clone()).into_any_element()
|
||||
};
|
||||
|
||||
ListItem::new(label.clone())
|
||||
ListItem::new(ix)
|
||||
.inset(true)
|
||||
.selected(Some(ix) == self.selected_index)
|
||||
.on_click(move |_, cx| handler(cx))
|
||||
@@ -271,9 +284,14 @@ impl Render for ContextMenu {
|
||||
)
|
||||
.into_any_element()
|
||||
}
|
||||
},
|
||||
)),
|
||||
),
|
||||
ContextMenuItem::CustomEntry { entry_render } => ListItem::new(ix)
|
||||
.inset(true)
|
||||
.selected(Some(ix) == self.selected_index)
|
||||
.child(entry_render(cx))
|
||||
.into_any_element(),
|
||||
}
|
||||
},
|
||||
))),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user