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