A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs108
1 files changed, 103 insertions, 5 deletions
diff --git a/src/main.rs b/src/main.rs
index 3cbb307..bc1a4f9 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -35,6 +35,7 @@
use std::borrow::Cow;
use std::iter::once;
mod act;
+mod sym;
use std::num::NonZeroU32;
use std::os::fd::AsFd;
use std::path::{Path, PathBuf};
@@ -73,6 +74,7 @@ use winit::window::Icon;
use crate::bar::Bar;
use crate::hov::Hovr;
use crate::lsp::{RedrawAfter, RequestError, RqS};
+use crate::sym::Symbols;
use crate::text::{Diff, Mapping, TextArea, col, is_word};
mod bar;
pub mod com;
@@ -222,7 +224,7 @@ pub(crate) fn entry(event_loop: EventLoop<()>) {
let (a, b) = Connection::memory();
std::thread::Builder::new()
.name("Rust Analyzer".into())
- .stack_size(1024 * 1024 * 8)
+ .stack_size(1024 * 1024 * 8)
.spawn(move || {
let ra = std::thread::current_id();
std::panic::set_hook(Box::new(move |info| {
@@ -404,6 +406,15 @@ pub(crate) fn entry(event_loop: EventLoop<()>) {
f.ok().flatten().map(|x| {Complete {r:x,start:c,selection:0,vo:0,}})
}, &l.runtime);
};
+
+ if let State::Symbols(x) = &mut state {
+ x.poll(|x, (_, p)| x.ok().map(|r| {
+ sym::Symbols {
+ tedit: p.map(_.tedit).unwrap_or_default(),
+ r,..default() // dont care about previous selection
+ }
+ }), &l.runtime);
+ }
if let State::CodeAction(x) = &mut state {
x.poll(|x, _| {
let lems: Vec<CodeAction> = x.ok()??.into_iter().map(|x| match x {
@@ -683,7 +694,9 @@ pub(crate) fn entry(event_loop: EventLoop<()>) {
let mut r = c.len()/columns;
assert_eq!(c.len()%columns, 0);
let (w, h) = dsb::size(&fonts.regular, ppem, ls, (columns, r));
- if w >= window.inner_size().width as usize || position.1 + h >= window.inner_size().height as usize {
+ if w >= window.inner_size().width as usize
+ // || position.1 + h >= window.inner_size().height as usize
+ {
unsafe { dsb::render_owned(c, (columns, c.len() / columns), 18.0, fonts, 1.1, true).save("fail.png") };
return Err(());
}
@@ -778,6 +791,15 @@ pub(crate) fn entry(event_loop: EventLoop<()>) {
let Ok((is_above,left, top, w, mut h)) = place_around((_x, _y), &mut fonts, i.as_mut(), &c, m, ppem, ls, 0., 0., 0.)else { println!("ra?"); break 'out};
i.r#box((left .saturating_sub(1) as _, top.saturating_sub(1) as _), w as _,h as _, BORDER);
},
+ State::Symbols(Rq { result: Some(x),..}) => 'out: {
+ let ws = workspace.as_deref().unwrap();
+ let c = x.cells(50,ws);
+ // let (_x, _y) = text.cursor_visual();
+ let _x = 0;
+ let _y = r - 1;
+ let Ok((is_above,left, top, w, mut h)) = place_around((_x, _y), &mut fonts, i.as_mut(), &c, 50, ppem, ls, 0., 0., 0.)else { println!("ra?"); break 'out};
+ i.r#box((left .saturating_sub(1) as _, top.saturating_sub(1) as _), w as _,h as _, BORDER);
+ }
_ =>{},
}
let com = match complete {
@@ -1137,13 +1159,18 @@ hovering.request = (DropH::new(handle), cursor_position).into();
},
..
} if event.state == ElementState::Pressed => {
+ // if event.logical_key == Key::Named(NamedKey::F12) {
+ // lsp.unwrap().runtime.spawn(async move {
+ // lsp.unwrap().symbols().await;
+ // });
+ // }
if matches!(
event.logical_key,
Key::Named(Shift | Alt | Control | Super)
) {
return;
}
- let mut o = state
+ let mut o: Option<Do> = state
.consume(Action::K(event.logical_key.clone()))
.unwrap();
match o {
@@ -1156,6 +1183,62 @@ hovering.request = (DropH::new(handle), cursor_position).into();
_ => {}
}
match o {
+ Some(Do::Symbols) => {
+ if let Some(lsp) = lsp {
+ state = State::Symbols(Rq::new(lsp.runtime.spawn(window.redraw_after(lsp.symbols("".into())))));
+ }
+ }
+ Some(Do::SymbolsHandleKey) => {
+ if let Some(lsp) = lsp {
+ let State::Symbols(Rq { result :Some(x), request}) = &mut state else {unreachable!()};
+ let ptedit = x.tedit.rope.clone();
+ if handle2(&event.logical_key, &mut x.tedit).is_some() || ptedit != x.tedit.rope {
+ *request = Some((DropH::new(lsp.runtime.spawn(window.redraw_after(lsp.symbols(x.tedit.rope.to_string())))), ()));
+ // state = State::Symbols(Rq::new(lsp.runtime.spawn(lsp.symbols("".into()))));
+ }
+ }
+ }
+ Some(Do::SymbolsSelectNext) => {
+ let State::Symbols(Rq { result :Some(x), ..}) = &mut state else {unreachable!()};
+ x.next();
+ },
+ Some(Do::SymbolsSelectPrev) => {
+ let State::Symbols(Rq { result :Some(x), ..}) = &mut state else {unreachable!()};
+ x.back();
+ },
+ Some(Do::SymbolsSelect)
+ => { let State::Symbols(Rq { result :Some(x), ..}) = &mut state else {unreachable!()};
+ let x = x.sel(); // TODO dedup
+ let _: anyhow::Result<()> = try {
+ let f = x.location.uri.to_file_path().map_err(|()| anyhow::anyhow!("dammit"))?.canonicalize().map_err(anyhow::Error::from)?;
+ origin = Some(f.clone());
+ let r = text.r;
+ text = default();
+ text.r = r;
+ let new = std::fs::read_to_string(f).map_err(anyhow::Error::from)?;
+ text.insert(&new);
+ text.cursor = text.l_position(x.location.range.start).ok_or(anyhow::anyhow!("dangit"))?;
+ text.scroll_to_cursor_centering();
+ hist = Hist {
+ history: vec![],
+ redo_history: vec![],
+ last: text.clone(),
+ last_edit: Instant::now(),
+ changed: false,
+ };
+ complete = CompletionState::None;
+ mtime = modify!();
+
+ lsp!().map(|(x, origin)| {
+ (def, semantic_tokens, inlay, sig_help, complete, hovering) = (default(), default(), default(), default(), default(), default());
+ x.open(&origin,new).unwrap();
+ x.rq_semantic_tokens(&mut semantic_tokens, origin, Some(window.clone())).unwrap();
+ });
+ state = State::Default;
+ bar.last_action = "open".to_string();
+ };
+
+ },
Some(Do::CodeAction) => {
if let Some((lsp, f)) = lsp!() {
let r = lsp.request::<lsp_request!("textDocument/codeAction")>(&CodeActionParams {
@@ -1590,6 +1673,7 @@ Default => {
K(Key::Character(x) if x == "f" && ctrl()) => Procure((default(), InputRequest::Search)),
K(Key::Character(x) if x == "o" && ctrl()) => Procure((default(), InputRequest::OpenFile)),
K(Key::Character(x) if x == "c" && ctrl()) => _,
+ K(Key::Character(x) if x == "l" && ctrl()) => _ [Symbols],
K(Key::Character(x) if x == "." && ctrl()) => _ [CodeAction],
K(Key::Named(ArrowUp | ArrowLeft | ArrowDown | ArrowRight | Home | End) if shift()) => Selection(Range<usize> => 0..0) [StartSelection],
M(MouseButton => MouseButton::Left if shift()) => Selection(Range<usize> => 0..0) [StartSelection],
@@ -1601,14 +1685,28 @@ Default => {
K(_) => _ [Edit],
M(_) => _,
},
-CodeAction(Rq<act::CodeActions, Option<CodeActionResponse>,()> => Rq { result : Some(_x), request: None, }) => {
+Symbols(Rq { result: Some(_x), request: None }) => {
+ K(Key::Named(Tab) if shift()) => _ [SymbolsSelectNext],
+ K(Key::Named(ArrowDown)) => _ [SymbolsSelectNext],
+ K(Key::Named(ArrowUp | Tab)) => _ [SymbolsSelectPrev],
+ K(Key::Named(Enter)) => _ [SymbolsSelect],
+ K(Key::Named(Escape)) => Default,
+ K(_) => _ [SymbolsHandleKey],
+},
+Symbols(Rq::<Symbols, Vec<SymbolInformation>, (), RequestError<lsp_request!("workspace/symbol")>> => _rq) => {
+ K(Key::Named(Escape)) => Default,
+ C(_) => _,
+ M(_) => _,
+ K(_) => _,
+},
+CodeAction(Rq { result : Some(_x), request }) => {
K(Key::Named(Tab) if shift()) => _ [CASelectPrev],
K(Key::Named(ArrowDown | Tab)) => _ [CASelectNext],
K(Key::Named(ArrowUp)) => _ [CASelectPrev],
K(Key::Named(Enter | ArrowRight)) => _ [CASelectRight],
K(Key::Named(ArrowLeft)) => _ [CASelectLeft],
},
-CodeAction(Rq<act::CodeActions, Option<CodeActionResponse>,(), RequestError<lsp_request!("textDocument/codeAction")>> => rq) => {
+CodeAction(RqS<act::CodeActions, lsp_request!("textDocument/codeAction")> => rq) => {
K(Key::Named(Escape)) => Default,
C(_) => _,
M(_) => _,