Fix non-unique ids passed to MouseEventHandlers

Co-Authored-By: Antonio Scandurra <me@as-cii.com>
This commit is contained in:
Max Brunsfeld
2022-02-17 09:44:02 -08:00
co-authored by Antonio Scandurra
parent 4a6713aef6
commit d173e4ef3c
5 changed files with 76 additions and 66 deletions
+24 -11
View File
@@ -523,6 +523,7 @@ impl ContextMenu {
}
struct CompletionsMenu {
editor_id: usize,
id: CompletionId,
initial_position: Anchor,
buffer: ModelHandle<Buffer>,
@@ -560,6 +561,7 @@ impl CompletionsMenu {
let settings = build_settings(cx);
let completions = self.completions.clone();
let matches = self.matches.clone();
let editor_id = self.editor_id;
let selected_item = self.selected_item;
UniformList::new(self.list.clone(), matches.len(), move |range, items, cx| {
let settings = build_settings(cx);
@@ -569,7 +571,7 @@ impl CompletionsMenu {
let item_ix = start_ix + ix;
items.push(
MouseEventHandler::new::<CompletionTag, _, _, _>(
mat.candidate_id,
(editor_id, mat.candidate_id),
cx,
|state, _| {
let item_style = if item_ix == selected_item {
@@ -666,6 +668,7 @@ impl CompletionsMenu {
#[derive(Clone)]
struct CodeActionsMenu {
editor_id: usize,
actions: Arc<[CodeAction]>,
buffer: ModelHandle<Buffer>,
selected_item: usize,
@@ -702,6 +705,7 @@ impl CodeActionsMenu {
let settings = build_settings(cx);
let actions = self.actions.clone();
let editor_id = self.editor_id;
let selected_item = self.selected_item;
let element =
UniformList::new(self.list.clone(), actions.len(), move |range, items, cx| {
@@ -710,21 +714,28 @@ impl CodeActionsMenu {
for (ix, action) in actions[range].iter().enumerate() {
let item_ix = start_ix + ix;
items.push(
MouseEventHandler::new::<ActionTag, _, _, _>(item_ix, cx, |state, _| {
let item_style = if item_ix == selected_item {
settings.style.autocomplete.selected_item
} else if state.hovered {
settings.style.autocomplete.hovered_item
} else {
settings.style.autocomplete.item
};
MouseEventHandler::new::<ActionTag, _, _, _>(
(editor_id, item_ix),
cx,
|state, _| {
let item_style = if item_ix == selected_item {
settings.style.autocomplete.selected_item
} else if state.hovered {
settings.style.autocomplete.hovered_item
} else {
settings.style.autocomplete.item
};
Text::new(action.lsp_action.title.clone(), settings.style.text.clone())
Text::new(
action.lsp_action.title.clone(),
settings.style.text.clone(),
)
.with_soft_wrap(false)
.contained()
.with_style(item_style)
.boxed()
})
},
)
.with_cursor_style(CursorStyle::PointingHand)
.on_mouse_down(move |cx| {
cx.dispatch_action(ConfirmCodeAction(Some(item_ix)));
@@ -1937,6 +1948,7 @@ impl Editor {
}
let mut menu = CompletionsMenu {
editor_id: this.id(),
id,
initial_position: position,
match_candidates: completions
@@ -2119,6 +2131,7 @@ impl Editor {
if let Some((buffer, actions)) = this.available_code_actions.clone() {
this.show_context_menu(
ContextMenu::CodeActions(CodeActionsMenu {
editor_id: this.handle.id(),
buffer,
actions,
selected_item: Default::default(),