use std::sync::Arc; use rust_fsm::StateMachine; use winit::event::MouseButton; use winit::window::Window; use crate::edi::*; impl Editor { pub fn click( &mut self, bt: MouseButton, cursor_position: (usize, usize), w: Arc, ) { let text = &mut self.text; _ = self .requests .complete .consume(CompletionAction::Click) .unwrap(); match self.state.consume(Action::M(bt)).unwrap() { Some(Do::MoveCursor) => { text.cursor.just( text.mapped_index_at(cursor_position), &text.rope, ); if let Some((lsp, path)) = lsp!(self + p) { if self.requests.sig_help.result.is_some() { self.requests.sig_help.request(lsp.runtime.spawn( lsp.request_sig_help( path, text.primary_cursor(), ), )); } } self.hist.lc = text.cursor.clone(); self.chist.push(text.primary_cursor()); 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) => { let p = text.mapped_index_at(cursor_position); text.cursor.first_mut().extend_selection_to(p, &text.rope); } Some(Do::StartSelection) => { let p = text.mapped_index_at(cursor_position); let x = *text.cursor.first(); text.cursor.first_mut().sel = Some((x..x).into()); text.cursor.first_mut().extend_selection_to(p, &text.rope); self.hist.lc = text.cursor.clone(); } Some(Do::GoToDefinition) => { if let Some(x) = self.requests.def.result.clone() && let Err(e) = self.go(&x, w.clone()) { 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); } None => {} _ => unreachable!(), } } }