From 7b83d65debcba1c1b4967be88843b98a9f8f200d Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Mon, 18 Dec 2023 19:15:54 +0200 Subject: [PATCH] Remove temporary imports, fix syntax_tree_view --- crates/gpui2/src/elements/div.rs | 39 ++-- crates/gpui2/src/elements/uniform_list.rs | 5 + crates/language_tools2/src/lsp_log.rs | 190 +++++++----------- .../language_tools2/src/syntax_tree_view.rs | 30 ++- 4 files changed, 124 insertions(+), 140 deletions(-) diff --git a/crates/gpui2/src/elements/div.rs b/crates/gpui2/src/elements/div.rs index 908b302dfc..24784d695c 100644 --- a/crates/gpui2/src/elements/div.rs +++ b/crates/gpui2/src/elements/div.rs @@ -1427,8 +1427,16 @@ 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) { @@ -1442,9 +1450,15 @@ impl Interactivity { } if overflow.y == Overflow::Scroll { - scroll_offset.y = - (scroll_offset.y + delta.y).clamp(-scroll_max.height, px(0.)); + 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.)); + 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(); @@ -1487,15 +1501,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) - } - f(style, scroll_offset.unwrap_or_default(), cx) - }) - }, - ); + 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) + }) + }, + ); if let Some(group) = self.group.as_ref() { GroupBounds::pop(group, cx); diff --git a/crates/gpui2/src/elements/uniform_list.rs b/crates/gpui2/src/elements/uniform_list.rs index e8587683d6..016f016024 100644 --- a/crates/gpui2/src/elements/uniform_list.rs +++ b/crates/gpui2/src/elements/uniform_list.rs @@ -127,6 +127,7 @@ impl Element for UniformList { .map(|s| s.item_size) .unwrap_or_else(|| self.measure_item(None, cx)); + let element_id = self.interactivity.element_id.clone(); let (layout_id, interactive) = self.interactivity .layout(state.map(|s| s.interactive), cx, |style, cx| { @@ -143,6 +144,10 @@ impl Element for UniformList { item_size.width } }); + + if element_id == Some(ElementId::Name("SyntaxTreeView".into())) { + dbg!(known_dimensions, available_space.height); + } let height = match available_space.height { AvailableSpace::Definite(height) => desired_height.min(height), AvailableSpace::MinContent | AvailableSpace::MaxContent => { diff --git a/crates/language_tools2/src/lsp_log.rs b/crates/language_tools2/src/lsp_log.rs index 3cff408280..9a8ec9f71a 100644 --- a/crates/language_tools2/src/lsp_log.rs +++ b/crates/language_tools2/src/lsp_log.rs @@ -2,18 +2,16 @@ use collections::{HashMap, VecDeque}; use editor::{Editor, EditorElement, EditorEvent, MoveToEnd}; use futures::{channel::mpsc, StreamExt}; use gpui::{ - actions, div, red, AnchorCorner, AnyElement, AppContext, Context, CursorStyle, Div, - EventEmitter, FocusHandle, FocusableView, InteractiveElement, IntoElement, Model, ModelContext, - MouseButton, ParentElement, Render, Styled, Subscription, View, ViewContext, VisualContext, - WeakModel, WindowContext, + actions, div, AnchorCorner, AnyElement, AppContext, Context, Div, EventEmitter, FocusHandle, + FocusableView, InteractiveElement, IntoElement, Model, ModelContext, MouseButton, + ParentElement, Render, Styled, Subscription, View, ViewContext, VisualContext, WeakModel, + WindowContext, }; use language::{LanguageServerId, LanguageServerName}; use lsp::IoKind; use project::{search::SearchQuery, Project}; use std::{borrow::Cow, sync::Arc}; -use ui::{ - h_stack, popover_menu, v_stack, Button, Checkbox, Clickable, ContextMenu, Divider, Label, -}; +use ui::{h_stack, popover_menu, Button, Checkbox, Clickable, ContextMenu, Label, Selection}; use workspace::{ item::{Item, ItemHandle}, searchable::{SearchEvent, SearchableItem, SearchableItemHandle}, @@ -729,38 +727,86 @@ impl Render for LspLogToolbarItemView { } }); + let log_toolbar_view = cx.view().clone(); let lsp_menu = popover_menu("LspLogView") .anchor(AnchorCorner::TopLeft) - .trigger(Self::render_language_server_menu_header(current_server)) + .trigger(Button::new( + "language_server_menu_header", + current_server + .and_then(|row| { + Some(Cow::Owned(format!( + "{} ({}) - {}", + row.server_name.0, + row.worktree_root_name, + if row.rpc_trace_selected { + RPC_MESSAGES + } else { + SERVER_LOGS + }, + ))) + }) + .unwrap_or_else(|| "No server selected".into()), + )) .menu(move |cx| { let menu_rows = menu_rows.clone(); let log_view = log_view.clone(); + let log_toolbar_view = log_toolbar_view.clone(); ContextMenu::build(cx, move |mut menu, cx| { - for row in menu_rows { + for (ix, row) in menu_rows.into_iter().enumerate() { menu = menu .header(format!( "{} ({})", row.server_name.0, row.worktree_root_name )) .entry( - format!("{SERVER_LOGS} ({})", row.server_name.0), - |cx| { - dbg!("????????????????????"); - }, // cx.handler_for(&log_view, move |view, cx| { - // // todo!() why does not it work??? - // dbg!("~~~~~~~~~~~~~~~~~~~~~~~~~~??@@@#", row.server_id); - // view.show_logs_for_server(row.server_id, cx) - // }), - ) - // TODO kb custom element with checkbox & toggle logging for server - .entry( - format!("{RPC_MESSAGES} ({})", row.server_name.0), - |cx| { - dbg!("?????????????@@@@@@@@@@@@@@@"); - }, // cx.handler_for(&log_view, move |view, cx| { - // view.show_rpc_trace_for_server(row.server_id, cx) - // }), + SERVER_LOGS, + cx.handler_for(&log_view, move |view, cx| { + view.show_logs_for_server(row.server_id, cx) + }), ) + .custom_entry({ + let log_view = log_view.clone(); + let log_toolbar_view = log_toolbar_view.clone(); + move |cx| { + h_stack() + .w_full() + .justify_between() + .child(Label::new(RPC_MESSAGES)) + .child( + Checkbox::new( + ix, + if row.rpc_trace_enabled { + Selection::Selected + } else { + Selection::Unselected + }, + ) + .on_click( + cx.listener_for( + &log_toolbar_view, + move |view, selection, cx| { + let enabled = matches!( + selection, + Selection::Selected + ); + view.toggle_logging_for_server( + row.server_id, + enabled, + cx, + ); + }, + ), + ), + ) + .on_mouse_down( + MouseButton::Left, + cx.listener_for(&log_view, move |view, _, cx| { + view.show_rpc_trace_for_server(row.server_id, cx) + }), + ) + .into_any_element() + } + }) } menu }) @@ -816,98 +862,6 @@ impl LspLogToolbarItemView { } cx.notify(); } - - fn show_logs_for_server(&mut self, id: LanguageServerId, cx: &mut ViewContext) { - if let Some(log_view) = &self.log_view { - log_view.update(cx, |view, cx| view.show_logs_for_server(id, cx)); - cx.notify(); - } - } - - fn show_rpc_trace_for_server(&mut self, id: LanguageServerId, cx: &mut ViewContext) { - if let Some(log_view) = &self.log_view { - log_view.update(cx, |view, cx| view.show_rpc_trace_for_server(id, cx)); - cx.notify(); - } - } - - fn render_language_server_menu_header(current_server: Option) -> Button { - Button::new( - "language_server_menu_header", - current_server - .and_then(|row| { - Some(Cow::Owned(format!( - "{} ({}) - {}", - row.server_name.0, - row.worktree_root_name, - if row.rpc_trace_selected { - RPC_MESSAGES - } else { - SERVER_LOGS - }, - ))) - }) - .unwrap_or_else(|| "No server selected".into()), - ) - } - - fn render_language_server_menu_item( - id: LanguageServerId, - name: LanguageServerName, - worktree_root_name: &str, - rpc_trace_enabled: bool, - _logs_selected: bool, - _rpc_trace_selected: bool, - cx: &mut ViewContext, - ) -> Div { - v_stack() - .size_full() - .child(Label::new(format!("{} ({})", name.0, worktree_root_name))) - .child( - div() - .child(Label::new(SERVER_LOGS)) - .cursor(CursorStyle::PointingHand) - .on_mouse_down( - MouseButton::Left, - cx.listener(move |view, _, cx| { - view.show_logs_for_server(id, cx); - }), - ), - ) - .child( - h_stack() - .size_full() - .child(Label::new(RPC_MESSAGES)) - .child( - Checkbox::new( - id.0, - if rpc_trace_enabled { - ui::Selection::Selected - } else { - ui::Selection::Unselected - }, - ) - .on_click(cx.listener( - move |this, selection, cx| { - let enabled = matches!(selection, ui::Selection::Selected); - this.toggle_logging_for_server(id, enabled, cx); - }, - )), - ) - .border_1() - .border_color(red()) - .cursor(CursorStyle::PointingHand) - .on_mouse_down( - MouseButton::Left, - cx.listener(move |view, _, cx| { - view.show_rpc_trace_for_server(id, cx); - }), - ), - ) - .border_1() - .border_color(red()) - .bg(red()) - } } pub enum Event { diff --git a/crates/language_tools2/src/syntax_tree_view.rs b/crates/language_tools2/src/syntax_tree_view.rs index 9b205cb28b..62efda19b5 100644 --- a/crates/language_tools2/src/syntax_tree_view.rs +++ b/crates/language_tools2/src/syntax_tree_view.rs @@ -1,9 +1,9 @@ use editor::{scroll::autoscroll::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, Pixels, Render, Styled, TextStyle, UniformListScrollHandle, - View, ViewContext, VisualContext, WeakView, WindowContext, + 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, + UniformListScrollHandle, View, ViewContext, VisualContext, WeakView, WindowContext, }; use language::{Buffer, OwnedSyntaxLayerInfo}; use settings::Settings; @@ -305,7 +305,7 @@ impl SyntaxTreeView { anonymous_node_style.color = color; } - let mut row = h_stack().size_full(); + let mut row = h_stack().bg(gpui::yellow()); if let Some(field_name) = cursor.field_name() { let mut field_style = style.clone(); if let Some(color) = property_color { @@ -332,7 +332,8 @@ impl SyntaxTreeView { Hsla::default() }) // todo!() does not work - .ml(rems(depth as f32 * 180.0)) + // .ml(rems(dbg!(depth) as f32 * 10.0)) + .pl(rems(dbg!(depth) as f32 * 10.0)) // .padding(gutter_padding + depth as f32 * 18.0) ; } @@ -341,7 +342,7 @@ impl SyntaxTreeView { impl Render for SyntaxTreeView { type Element = Div; - fn render(&mut self, cx: &mut gpui::ViewContext<'_, Self>) -> Div { + 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); @@ -363,7 +364,7 @@ impl Render for SyntaxTreeView { self.hover_state_changed(cx); } - let mut rendered = div(); + let mut rendered = div().flex_1(); if let Some(layer) = self .editor @@ -417,7 +418,7 @@ impl Render for SyntaxTreeView { items }, ) - // todo!() does scroll either editor or the tree + .size_full() .track_scroll(self.list_scroll_handle.clone()) .on_mouse_move(cx.listener(move |tree_view, event: &MouseMoveEvent, cx| { tree_view.mouse_y = Some(event.position.y); @@ -431,7 +432,16 @@ impl Render for SyntaxTreeView { ) .text_bg(editor_colors.background); - rendered = rendered.child(list); + rendered = rendered.child( + canvas(move |bounds, cx| { + list.into_any_element().draw( + bounds.origin, + bounds.size.map(AvailableSpace::Definite), + cx, + ) + }) + .size_full(), + ); } rendered