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.rs72
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!(),
}
}