Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'src/edi/input_handlers/click.rs')
| -rw-r--r-- | src/edi/input_handlers/click.rs | 72 |
1 files changed, 47 insertions, 25 deletions
diff --git a/src/edi/input_handlers/click.rs b/src/edi/input_handlers/click.rs index d687c60..82ddd2b 100644 --- a/src/edi/input_handlers/click.rs +++ b/src/edi/input_handlers/click.rs @@ -11,15 +11,23 @@ impl Editor { bt: MouseButton, cursor_position: (usize, usize), w: Arc<dyn Window>, + lsp_mn: &mut LSPM, ) { - let text = &mut self.text; _ = self .requests .complete .consume(CompletionAction::Click) - .unwrap(); - match self.state.consume(Action::M(bt)).unwrap() { - Some(Do::ClickedHover | Do::MoveCursor) => { + .inspect_err(|x| log::error!("transition comact {x:?}")); + + let Some(mut o) = self.transition(Action::M(bt)) else { return }; + if let Do::Reinsert = o { + let Some(o2) = self.transition(Action::M(bt)) else { return }; + o = o2; + }; + + let text = &mut self.text; + match o { + Do::MoveCursor => { text.cursor.just( text.mapped_index_at(cursor_position), &text.rope, @@ -36,13 +44,13 @@ impl Editor { text.cursor.first().setc(&text.rope); self.refresh_document_highlights(); } - Some(Do::NavForward) => self.nav_forward(), - Some(Do::NavBack) => self.nav_back(), - Some(Do::ExtendSelectionToMouse) => { + Do::NavForward => self.nav_forward(), + Do::NavBack => self.nav_back(), + Do::ExtendSelectionToMouse => { let p = text.mapped_index_at(cursor_position); text.cursor.first_mut().extend_selection_to(p, &text.rope); } - Some(Do::StartSelection) => { + Do::StartSelection => { let p = text.mapped_index_at(cursor_position); let x = *text.cursor.first(); @@ -50,37 +58,51 @@ impl Editor { text.cursor.first_mut().extend_selection_to(p, &text.rope); self.hist.lc = text.cursor.clone(); } - Some(Do::GoToDefinition(tdpp)) => { + Do::GoToDefinition(tdpp) => { dbg!(&tdpp); - if let Some(x) = self.requests.def.result.clone().or_else(|| { - tdpp.zip(lsp!(self)).and_then(|(tdpp, lsp)| { - lsp.request_immediate::<lsp_request!("textDocument/definition")>( - &GotoDefinitionParams { + if let Some(x) = self.requests.def.result.clone() + && let Err(e) = self.go(&x, w.clone(), lsp_mn) + { + log::error!("gtd: {e}"); + } else if let Some(x) = { + tdpp.zip(lsp!(self)).and_then(|(tdpp, lsp)| { + lsp.request_immediate::< lsp_request!("textDocument/definition")>( + &DefinitionParams { text_document_position_params: tdpp, work_done_progress_params: default(), partial_result_params: default(), }, ).ok() }).flatten().and_then(|x| match &x { - GotoDefinitionResponse::Link([x, ..]) => Some(x.clone()), + DefinitionResponse::Definition(Definition::Location(x)) => Some(x.clone()), + DefinitionResponse::Definition(Definition::LocationList([x])) => Some(x.clone()), + // DefinitionResponse::DefinitionLinkList([x, ..]) => Some(x.clone()), _ => None, }) - }) - && let Err(e) = self.go(&x, w.clone()) + } && let Err(e) = self.go(&x, w.clone(), lsp_mn) { log::error!("gtd: {e}"); } } - Some(Do::InsertCursorAtMouse) => { - text.cursor.add( - text.mapped_index_at(cursor_position), - &text.rope, - ); - self.hist.lc = text.cursor.clone(); - self.chist.push(text.primary_cursor()); - text.cursor.first().setc(&text.rope); + Do::InsertCursorAtMouse => { + let p = text.mapped_index_at(cursor_position); + + let v = (text.cursor.inner.len() != 1) + .then(|| { + text.cursor + .inner + .extract_if(.., |x| *x == p) + .next() + }) + .flatten(); + if let None = v { + text.cursor.add(p, &text.rope); + self.hist.lc = text.cursor.clone(); + self.chist.push(text.primary_cursor()); + text.cursor.first().setc(&text.rope); + } } - None => {} + _ => unreachable!(), } } |