working terminal library

pull/8675/merge^2
mattwparas 8 months ago
parent a92f14709b
commit ab62d83800

493
Cargo.lock generated

File diff suppressed because it is too large Load Diff

@ -3,13 +3,13 @@ use std::{collections::HashMap, sync::Arc};
use helix_core::Position; use helix_core::Position;
use helix_view::{ use helix_view::{
graphics::{Color, CursorKind, Rect, UnderlineStyle}, graphics::{Color, CursorKind, Rect, UnderlineStyle},
input::{Event, KeyEvent, MouseEvent}, input::{Event, KeyEvent, MouseButton, MouseEvent},
keyboard::{KeyCode, KeyModifiers}, keyboard::{KeyCode, KeyModifiers},
theme::Style, theme::Style,
Editor, Editor,
}; };
use steel::{ use steel::{
rvals::{Custom, FromSteelVal, IntoSteelVal, SteelString}, rvals::{as_underlying_type, Custom, FromSteelVal, IntoSteelVal, SteelString},
steel_vm::{builtin::BuiltInModule, engine::Engine, register_fn::RegisterFn}, steel_vm::{builtin::BuiltInModule, engine::Engine, register_fn::RegisterFn},
SteelVal, SteelVal,
}; };
@ -300,24 +300,40 @@ pub fn helix_component_module() -> BuiltInModule {
matches!(event, Event::Mouse(_)) matches!(event, Event::Mouse(_))
}) })
.register_fn("event-mouse-kind", |event: Event| { .register_fn("event-mouse-kind", |event: Event| {
if let Event::Mouse(MouseEvent { .. }) = event { if let Event::Mouse(MouseEvent { kind, .. }) = event {
todo!() match kind {
helix_view::input::MouseEventKind::Down(MouseButton::Left) => 0,
helix_view::input::MouseEventKind::Down(MouseButton::Right) => 1,
helix_view::input::MouseEventKind::Down(MouseButton::Middle) => 2,
helix_view::input::MouseEventKind::Up(MouseButton::Left) => 3,
helix_view::input::MouseEventKind::Up(MouseButton::Right) => 4,
helix_view::input::MouseEventKind::Up(MouseButton::Middle) => 5,
helix_view::input::MouseEventKind::Drag(MouseButton::Left) => 6,
helix_view::input::MouseEventKind::Drag(MouseButton::Right) => 7,
helix_view::input::MouseEventKind::Drag(MouseButton::Middle) => 8,
helix_view::input::MouseEventKind::Moved => 9,
helix_view::input::MouseEventKind::ScrollDown => 10,
helix_view::input::MouseEventKind::ScrollUp => 11,
helix_view::input::MouseEventKind::ScrollLeft => 12,
helix_view::input::MouseEventKind::ScrollRight => 13,
}
.into_steelval()
} else { } else {
todo!() false.into_steelval()
} }
}) })
.register_fn("event-mouse-row", |event: Event| { .register_fn("event-mouse-row", |event: Event| {
if let Event::Mouse(MouseEvent { .. }) = event { if let Event::Mouse(MouseEvent { row, .. }) = event {
todo!() row.into_steelval()
} else { } else {
todo!() false.into_steelval()
} }
}) })
.register_fn("event-mouse-col", |event: Event| { .register_fn("event-mouse-col", |event: Event| {
if let Event::Mouse(MouseEvent { .. }) = event { if let Event::Mouse(MouseEvent { column, .. }) = event {
todo!() column.into_steelval()
} else { } else {
todo!() false.into_steelval()
} }
}) })
// Is this mouse event within the area provided // Is this mouse event within the area provided
@ -377,14 +393,44 @@ pub fn helix_component_module() -> BuiltInModule {
module module
} }
// fn buffer_set_string(
// buffer: &mut tui::buffer::Buffer,
// x: u16,
// y: u16,
// string: steel::rvals::SteelString,
// style: Style,
// ) {
// buffer.set_string(x, y, string.as_str(), style)
// }
fn buffer_set_string( fn buffer_set_string(
buffer: &mut tui::buffer::Buffer, buffer: &mut tui::buffer::Buffer,
x: u16, x: u16,
y: u16, y: u16,
string: steel::rvals::SteelString, string: SteelVal,
style: Style, style: Style,
) { ) -> steel::rvals::Result<()> {
buffer.set_string(x, y, string.as_str(), style) match string {
SteelVal::StringV(string) => {
buffer.set_string(x, y, string.as_str(), style);
Ok(())
}
SteelVal::Custom(c) => {
if let Some(string) =
as_underlying_type::<steel::steel_vm::ffi::MutableString>(c.borrow().as_ref())
{
buffer.set_string(x, y, string.string.as_str(), style);
Ok(())
} else {
steel::stop!(TypeMismatch => "buffer-set-string! expected a string")
}
}
_ => {
steel::stop!(TypeMismatch => "buffer-set-string! expected a string")
}
}
// buffer.set_string(x, y, string.as_str(), style)
} }
/// A dynamic component, used for rendering /// A dynamic component, used for rendering
@ -579,10 +625,10 @@ impl Component for SteelDynamicComponent {
}, },
))); )));
let event = match event { // let event = match event {
Event::Key(event) => *event, // Event::Key(event) => *event,
_ => return compositor::EventResult::Ignored(None), // _ => return compositor::EventResult::Ignored(None),
}; // };
match ENGINE.with(|x| { match ENGINE.with(|x| {
x.borrow_mut() x.borrow_mut()
@ -602,7 +648,7 @@ impl Component for SteelDynamicComponent {
Ok(SteelEventResult::Consumed) => compositor::EventResult::Consumed(None), Ok(SteelEventResult::Consumed) => compositor::EventResult::Consumed(None),
Ok(SteelEventResult::Ignored) => compositor::EventResult::Ignored(None), Ok(SteelEventResult::Ignored) => compositor::EventResult::Ignored(None),
_ => match event { _ => match event {
ctrl!('c') | key!(Esc) => close_fn, // ctrl!('c') | key!(Esc) => close_fn,
_ => compositor::EventResult::Ignored(None), _ => compositor::EventResult::Ignored(None),
}, },
} }
@ -653,9 +699,9 @@ impl Component for SteelDynamicComponent {
// Pass the `state` object through - this can be used for storing the state of whatever plugin thing we're // Pass the `state` object through - this can be used for storing the state of whatever plugin thing we're
// attempting to render // attempting to render
let thunk = |engine: &mut Engine| { let thunk = |engine: &mut Engine| {
engine.call_function_with_args( engine.call_function_with_args_from_mut_slice(
cursor.clone(), cursor.clone(),
vec![self.state.clone(), area.into_steelval().unwrap()], &mut [self.state.clone(), area.into_steelval().unwrap()],
) )
}; };
@ -666,7 +712,10 @@ impl Component for SteelDynamicComponent {
match result { match result {
Ok(v) => (v, CursorKind::Block), Ok(v) => (v, CursorKind::Block),
// TODO: Figure out how to pop up an error message // TODO: Figure out how to pop up an error message
Err(_e) => (None, CursorKind::Block), Err(_e) => {
log::info!("Error: {:?}", _e);
(None, CursorKind::Block)
},
} }
} else { } else {
(None, helix_view::graphics::CursorKind::Hidden) (None, helix_view::graphics::CursorKind::Hidden)
@ -691,9 +740,9 @@ impl Component for SteelDynamicComponent {
// call the engine instance. Otherwise, all computation happens inside the engine. // call the engine instance. Otherwise, all computation happens inside the engine.
match ENGINE match ENGINE
.with(|x| { .with(|x| {
x.borrow_mut().call_function_with_args( x.borrow_mut().call_function_with_args_from_mut_slice(
required_size.clone(), required_size.clone(),
vec![self.state.clone(), viewport.into_steelval().unwrap()], &mut [self.state.clone(), viewport.into_steelval().unwrap()],
) )
}) })
.and_then(|x| Option::<(u16, u16)>::from_steelval(&x)) .and_then(|x| Option::<(u16, u16)>::from_steelval(&x))

@ -7,7 +7,10 @@ pub fn document_id_to_usize(doc_id: &DocumentId) -> usize {
#[cfg(feature = "steel")] #[cfg(feature = "steel")]
mod steel_implementations { mod steel_implementations {
use steel::{gc::unsafe_erased_pointers::CustomReference, rvals::Custom}; use steel::{
gc::unsafe_erased_pointers::CustomReference,
rvals::{as_underlying_type, Custom},
};
use crate::{ use crate::{
document::Mode, document::Mode,
@ -39,7 +42,15 @@ mod steel_implementations {
impl Custom for UnderlineStyle {} impl Custom for UnderlineStyle {}
impl CustomReference for Event {} impl CustomReference for Event {}
impl Custom for Rect {} impl Custom for Rect {
fn equality_hint(&self, other: &dyn steel::rvals::CustomType) -> bool {
if let Some(other) = as_underlying_type::<Rect>(other) {
self == other
} else {
false
}
}
}
impl Custom for crate::graphics::CursorKind {} impl Custom for crate::graphics::CursorKind {}
impl Custom for DocumentId {} impl Custom for DocumentId {}
impl Custom for ViewId {} impl Custom for ViewId {}

Loading…
Cancel
Save