Rework context menu's custom element API to handle clicks properly

This commit is contained in:
Kirill Bulatov 2023-12-20 18:22:39 +02:00
parent 19d1568140
commit 331af82cb1
2 changed files with 97 additions and 87 deletions

View file

@ -3,9 +3,8 @@ use editor::{Editor, EditorElement, EditorEvent, MoveToEnd};
use futures::{channel::mpsc, StreamExt};
use gpui::{
actions, div, AnchorCorner, AnyElement, AppContext, Context, Div, EventEmitter, FocusHandle,
FocusableView, InteractiveElement, IntoElement, Model, ModelContext, MouseButton,
ParentElement, Render, Styled, Subscription, View, ViewContext, VisualContext, WeakModel,
WindowContext,
FocusableView, IntoElement, Model, ModelContext, ParentElement, Render, Styled, Subscription,
View, ViewContext, VisualContext, WeakModel, WindowContext,
};
use language::{LanguageServerId, LanguageServerName};
use lsp::IoKind;
@ -776,47 +775,48 @@ impl Render for LspLogToolbarItemView {
);
}
menu = menu.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,
);
},
menu = menu.custom_entry(
{
let log_toolbar_view = log_toolbar_view.clone();
move |cx| {
h_stack()
.w_full()
.justify_between()
.child(Label::new(RPC_MESSAGES))
.child(
div().z_index(120).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,
);
cx.stop_propagation();
},
)),
),
),
)
.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()
}
});
)
.into_any_element()
}
},
cx.handler_for(&log_view, move |view, cx| {
view.show_rpc_trace_for_server(row.server_id, cx);
}),
);
if server_selected && row.rpc_trace_selected {
debug_assert_eq!(
Some(ix * 3 + 2),