A simple CPU rendered GUI IDE experience.
clicking through hovers
bendn 3 weeks ago
parent b1f3556 · commit 545f3f6
-rw-r--r--src/edi/input_handlers/click.rs19
-rw-r--r--src/edi/input_handlers/cursor.rs17
-rw-r--r--src/edi/input_handlers/keyboard.rs2
-rw-r--r--src/edi/st.rs9
-rw-r--r--src/hov.rs15
5 files changed, 50 insertions, 12 deletions
diff --git a/src/edi/input_handlers/click.rs b/src/edi/input_handlers/click.rs
index 2357376..93245c6 100644
--- a/src/edi/input_handlers/click.rs
+++ b/src/edi/input_handlers/click.rs
@@ -53,8 +53,23 @@ impl Editor {
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()
+ Some(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 {
+ 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()),
+ _ => None,
+ })
+
+ })
&& let Err(e) = self.go(&x, w.clone())
{
log::error!("gtd: {e}");
diff --git a/src/edi/input_handlers/cursor.rs b/src/edi/input_handlers/cursor.rs
index 166de8b..e0fc1b5 100644
--- a/src/edi/input_handlers/cursor.rs
+++ b/src/edi/input_handlers/cursor.rs
@@ -107,7 +107,7 @@ impl Editor {
let (lsp, o) = lsp!(self + p).unwrap();
let text = self.text.clone();
let mut rang = None;
- let z = match hover {
+ let tdpp = match hover {
Mapping::Char(_, _, i) => TextDocumentPositionParams {
position: text.to_l_position(i).unwrap(),
text_document: o.tid(),
@@ -152,7 +152,7 @@ impl Editor {
let handle = lsp.runtime.spawn(
lsp.request::<lsp_request!("textDocument/definition")>(
&GotoDefinitionParams {
- text_document_position_params: z.clone(),
+ text_document_position_params: tdpp.clone(),
work_done_progress_params: default(),
partial_result_params: default(),
},
@@ -178,6 +178,12 @@ impl Editor {
Set::Reset
};
+ match x {
+ Set::To((x, y)) =>
+ self.requests.def.request = Some((DropH::new(x), y)),
+ Set::Reset => self.requests.def.result = None,
+ Set::Ignore => {}
+ }
// match self.state.consume(cursor_position) {}
// if let Some((_, c)) = hov.request
// && c == cursor_position
@@ -187,11 +193,12 @@ impl Editor {
// if !running.insert(hover) {return}
let (rx, _) = lsp
.request::<HoverRequest>(&HoverParams {
- text_document_position_params: z,
+ text_document_position_params: tdpp.clone(),
work_done_progress_params: default(),
})
.unwrap();
// println!("rq hov of {hover:?} (cur {})", requests.hovering.request.is_some());
+ let tdp = tdpp.clone();
let handle: tokio::task::JoinHandle<Result<Option<Hovr>, _>> =
lsp.runtime.spawn(async move {
let Some(x) = rx.await? else {
@@ -253,6 +260,7 @@ impl Editor {
Ok(Some(
hov::Hovr {
span,
+ tdpp: tdp,
item: CellBuffer {
c: w,
vo: 0,
@@ -264,8 +272,9 @@ impl Editor {
.into(),
))
});
+
self.state
- .consume(Action::SetHovering(handle, cursor_position))
+ .consume(Action::SetHovering(handle, (cursor_position, tdpp)))
.unwrap();
// self.requests.hovering.request =
// (DropH::new(handle), cursor_position).into();
diff --git a/src/edi/input_handlers/keyboard.rs b/src/edi/input_handlers/keyboard.rs
index 1fc1f00..9a22457 100644
--- a/src/edi/input_handlers/keyboard.rs
+++ b/src/edi/input_handlers/keyboard.rs
@@ -321,7 +321,7 @@ impl Editor {
Some(Do::NavForward) => self.nav_forward(),
Some(
Do::Reinsert
- | Do::GoToDefinition
+ | Do::GoToDefinition(_)
| Do::MoveCursor
| Do::ExtendSelectionToMouse
| Do::Hover
diff --git a/src/edi/st.rs b/src/edi/st.rs
index 17da088..3d0f282 100644
--- a/src/edi/st.rs
+++ b/src/edi/st.rs
@@ -65,7 +65,7 @@ Default => {
K(Key::Named(ArrowUp | ArrowLeft | ArrowDown | ArrowRight | Home | End) if shift()) => Selection [StartSelection],
M(MouseButton::Left if shift()) => Selection [StartSelection],
M(MouseButton::Left if alt()) => _ [InsertCursorAtMouse],
- M(MouseButton::Left if ctrl()) => _ [GoToDefinition],
+ M(MouseButton::Left if ctrl()) => _ [GoToDefinition(Option<TextDocumentPositionParams> => None)],
M(MouseButton::Left) => _ [MoveCursor],
K(Key::Character("=") if ctrl()) => _ [NavForward],
K(Key::Character("-") if ctrl()) => _ [NavBack],
@@ -79,20 +79,21 @@ Default => {
M(_) => _,
},
Hovered => {
- HOnSomething(((usize, usize)) => pos) => Hovering(Rq<Hovr, Option<Hovr>, (usize, usize), RequestError<HoverRequest>> => default()) [SetHovering],
+ HOnSomething(((usize, usize)) => pos) => Hovering(Rq<Hovr, Option<Hovr>, ((usize, usize), TextDocumentPositionParams), RequestError<HoverRequest>> => default()) [SetHovering],
HOnNothing => Default,
},
Hovering(x) => {
// now hovering over something else, cancel existing hover
- HOnSomething(pos if let Some((_, c)) = x.request && dbg!(c != pos)) => _ [SetHovering],
+ HOnSomething(pos if let Some((_, (c, _))) = x.request && (c != pos)) => _ [SetHovering],
HOnSomething(_) => _ [SetHovering],
HOnNothing => Default,
SetHovering((tokio::task::JoinHandle<
Result<Option<Hovr>, RequestError<HoverRequest>>,
- >, (usize, usize)) => (h, d)) => Hovering({ let mut x = x; x.request_d(h, d); x }),
+ >, ((usize, usize), TextDocumentPositionParams)) => (h, d)) => Hovering({ let mut x = x; x.request_d(h, d); x }),
C(_) => _ [Hover],
MovedOut => Default,
K(_) => _,
+ M(MouseButton::Left if ctrl()) => Default [GoToDefinition(x.request.map(|x| x.1.1).or(x.result.map(|x| x.tdpp)))],
M(_) => _ [ClickedHover],
},
Command(_) => K(Key::Named(Escape)) => Default,
diff --git a/src/hov.rs b/src/hov.rs
index da24426..5f27a52 100644
--- a/src/hov.rs
+++ b/src/hov.rs
@@ -1,13 +1,17 @@
use std::iter::{empty, once, repeat_n};
use std::pin::pin;
+use std::str::FromStr;
use std::vec::Vec;
+use Default::default;
use dsb::Cell;
use dsb::cell::Style;
use itertools::Itertools;
+use lsp_types::{TextDocumentIdentifier, TextDocumentPositionParams};
use markdown::mdast::{self, Node};
use ropey::Rope;
use serde_derive::{Deserialize, Serialize};
+use url::Url;
const D: Cell = Cell { letter: None, style: Style::new(FG, BG) };
use crate::{FG, text};
@@ -308,6 +312,15 @@ pub struct Hovr {
pub(crate) item: crate::rnd::CellBuffer,
#[serde(skip)]
pub(crate) range: Option<lsp_types::Range>,
+ #[serde(skip, default = "tdp")]
+ pub(crate) tdpp: TextDocumentPositionParams,
+}
+fn tdp() -> TextDocumentPositionParams {
+ TextDocumentPositionParams {
+ text_document: TextDocumentIdentifier {
+ uri: Url::from_str("/home/").unwrap(),
+ },
+ position: default(),
+ }
}
-
pub type VisualX = usize;