Files
osui/src/extensions/keypress.rs
T
2025-06-28 03:51:13 +02:00

49 lines
1.3 KiB
Rust

use std::sync::Arc;
use crossterm::event::KeyEvent;
use crate::{
events::{Close, Event, EventManager},
extensions::Extension,
Screen,
};
impl Event for KeyEvent {
fn as_any(self: Box<Self>) -> Box<dyn std::any::Any> {
self
}
}
pub trait KeyPressEventHandler {
fn on_keypress(&mut self, events: &Arc<EventManager>, event: Box<KeyEvent>);
}
pub struct KeyPressExtension;
impl Extension for KeyPressExtension {
fn init(&mut self, _: &mut Screen, events: &Arc<EventManager>) {
crossterm::terminal::enable_raw_mode().unwrap();
crate::utils::clear().unwrap();
crate::utils::hide_cursor().unwrap();
events.on(|_, _: Box<Close>| {
crossterm::terminal::disable_raw_mode().unwrap();
crate::utils::show_cursor().unwrap();
crate::utils::clear().unwrap();
});
}
fn tick_start(&mut self, _: &mut Screen, _: &Arc<EventManager>) {}
fn tick_end(&mut self, _: &mut Screen, events: &Arc<EventManager>) {
if crossterm::event::poll(std::time::Duration::from_millis(13)).unwrap() {
match crossterm::event::read().unwrap() {
crossterm::event::Event::Key(e) => {
events.dispatch(e);
}
_ => {}
}
}
}
}