Remove temporary imports, fix syntax_tree_view

Kirill Bulatov created

Change summary

crates/gpui2/src/elements/div.rs               |  39 ++-
crates/gpui2/src/elements/uniform_list.rs      |   5 
crates/language_tools2/src/lsp_log.rs          | 190 +++++++------------
crates/language_tools2/src/syntax_tree_view.rs |  30 ++-
4 files changed, 124 insertions(+), 140 deletions(-)

Detailed changes

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);

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 => {

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<Self>) {
-        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<Self>) {
-        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<LogMenuItem>) -> 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<Self>,
-    ) -> 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 {

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