move tui run methods to in/out and relax Sized constraint

This commit is contained in:
🪞👃🪞 2025-01-14 20:04:59 +01:00
parent 44201ebf76
commit 6fd87ce4ed
5 changed files with 169 additions and 211 deletions

View file

@ -1,107 +1,135 @@
use crate::*;
pub use crossterm::event::Event;
use Event as CrosstermEvent;
#[derive(Debug, Clone)]
pub struct TuiIn(pub Arc<AtomicBool>, pub CrosstermEvent);
use std::time::Duration;
use std::thread::{spawn, JoinHandle};
use crossterm::event::{poll, read};
#[derive(Debug, Clone)] pub struct TuiIn(pub Arc<AtomicBool>, pub Event);
impl Input for TuiIn {
type Event = Event;
type Handled = bool;
fn event (&self) -> &CrosstermEvent { &self.1 }
fn event (&self) -> &Event { &self.1 }
fn is_done (&self) -> bool { self.0.fetch_and(true, Relaxed) }
fn done (&self) { self.0.store(true, Relaxed); }
}
impl TuiIn {
/// Spawn the input thread.
pub fn run_input <T: Handle<TuiIn> + 'static> (
engine: &Arc<RwLock<Tui>>,
state: &Arc<RwLock<T>>,
timer: Duration
) -> JoinHandle<()> {
let exited = engine.read().unwrap().exited.clone();
let state = state.clone();
spawn(move || loop {
if exited.fetch_and(true, Relaxed) {
break
}
if poll(timer).is_ok() {
let event = read().unwrap();
match event {
/// Define a key
pub const fn key (code: KeyCode) -> Event {
let modifiers = KeyModifiers::NONE;
let kind = KeyEventKind::Press;
let state = KeyEventState::NONE;
Event::Key(KeyEvent { code, modifiers, kind, state })
}
/// Add Ctrl modifier to key
pub const fn ctrl (event: Event) -> Event {
match event {
Event::Key(mut event) => {
event.modifiers = event.modifiers.union(KeyModifiers::CONTROL)
},
_ => {}
crossterm::event::Event::Key(KeyEvent {
code: KeyCode::Char('c'),
modifiers: KeyModifiers::CONTROL,
kind: KeyEventKind::Press,
state: KeyEventState::NONE
}) => {
exited.store(true, Relaxed);
},
_ => {
let exited = exited.clone();
if let Err(e) = state.write().unwrap().handle(&TuiIn(exited, event)) {
panic!("{e}")
}
}
}
}
})
}
event
}
/// Add Alt modifier to key
pub const fn alt (event: Event) -> Event {
match event {
Event::Key(mut event) => {
event.modifiers = event.modifiers.union(KeyModifiers::ALT)
},
_ => {}
}
event
}
/// Add Shift modifier to key
pub const fn shift (event: Event) -> Event {
match event {
Event::Key(mut event) => {
event.modifiers = event.modifiers.union(KeyModifiers::SHIFT)
},
_ => {}
}
event
}
#[macro_export] macro_rules! kpat {
(Ctrl-Alt-$code:pat) => { kpat!($code, KeyModifiers::CONTROL | KeyModifiers::ALT) };
(Ctrl-$code:pat) => { kpat!($code, KeyModifiers::CONTROL) };
(Alt-$code:pat) => { kpat!($code, KeyModifiers::ALT) };
(Shift-$code:pat) => { kpat!($code, KeyModifiers::SHIFT) };
($code:pat) => {
crossterm::event::Event::Key(KeyEvent {
code: $code,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: KeyEventState::NONE
})
};
($code:pat, $modifiers: pat) => {
crossterm::event::Event::Key(KeyEvent {
code: $code,
modifiers: $modifiers,
kind: KeyEventKind::Press,
state: KeyEventState::NONE
})
};
}
#[macro_export] macro_rules! kexp {
(Ctrl-Alt-$code:ident) => { key_event_expr!($code, KeyModifiers::from_bits(0b0000_0110).unwrap()) };
(Ctrl-$code:ident) => { key_event_expr!($code, KeyModifiers::CONTROL) };
(Alt-$code:ident) => { key_event_expr!($code, KeyModifiers::ALT) };
(Shift-$code:ident) => { key_event_expr!($code, KeyModifiers::SHIFT) };
($code:ident) => { key_event_expr!($code) };
($code:expr) => { key_event_expr!($code) };
}
#[macro_export] macro_rules! key_event_expr {
($code:expr, $modifiers: expr) => {
crossterm::event::Event::Key(KeyEvent {
code: $code,
modifiers: $modifiers,
kind: KeyEventKind::Press,
state: KeyEventState::NONE
})
};
($code:expr) => {
crossterm::event::Event::Key(KeyEvent {
code: $code,
modifiers: KeyModifiers::NONE,
kind: KeyEventKind::Press,
state: KeyEventState::NONE
})
};
}
//.
///// Define a key
//pub const fn key (code: KeyCode) -> Event {
//let modifiers = KeyModifiers::NONE;
//let kind = KeyEventKind::Press;
//let state = KeyEventState::NONE;
//Event::Key(KeyEvent { code, modifiers, kind, state })
//}
///// Add Ctrl modifier to key
//pub const fn ctrl (event: Event) -> Event {
//match event {
//Event::Key(mut event) => {
//event.modifiers = event.modifiers.union(KeyModifiers::CONTROL)
//},
//_ => {}
//}
//event
//}
///// Add Alt modifier to key
//pub const fn alt (event: Event) -> Event {
//match event {
//Event::Key(mut event) => {
//event.modifiers = event.modifiers.union(KeyModifiers::ALT)
//},
//_ => {}
//}
//event
//}
///// Add Shift modifier to key
//pub const fn shift (event: Event) -> Event {
//match event {
//Event::Key(mut event) => {
//event.modifiers = event.modifiers.union(KeyModifiers::SHIFT)
//},
//_ => {}
//}
//event
//}
//#[macro_export] macro_rules! kpat {
//(Ctrl-Alt-$code:pat) => { kpat!($code, KeyModifiers::CONTROL | KeyModifiers::ALT) };
//(Ctrl-$code:pat) => { kpat!($code, KeyModifiers::CONTROL) };
//(Alt-$code:pat) => { kpat!($code, KeyModifiers::ALT) };
//(Shift-$code:pat) => { kpat!($code, KeyModifiers::SHIFT) };
//($code:pat) => {
//crossterm::event::Event::Key(KeyEvent {
//code: $code,
//modifiers: KeyModifiers::NONE,
//kind: KeyEventKind::Press,
//state: KeyEventState::NONE
//})
//};
//($code:pat, $modifiers: pat) => {
//crossterm::event::Event::Key(KeyEvent {
//code: $code,
//modifiers: $modifiers,
//kind: KeyEventKind::Press,
//state: KeyEventState::NONE
//})
//};
//}
//#[macro_export] macro_rules! kexp {
//(Ctrl-Alt-$code:ident) => { key_event_expr!($code, KeyModifiers::from_bits(0b0000_0110).unwrap()) };
//(Ctrl-$code:ident) => { key_event_expr!($code, KeyModifiers::CONTROL) };
//(Alt-$code:ident) => { key_event_expr!($code, KeyModifiers::ALT) };
//(Shift-$code:ident) => { key_event_expr!($code, KeyModifiers::SHIFT) };
//($code:ident) => { key_event_expr!($code) };
//($code:expr) => { key_event_expr!($code) };
//}
//#[macro_export] macro_rules! key_event_expr {
//($code:expr, $modifiers: expr) => {
//crossterm::event::Event::Key(KeyEvent {
//code: $code,
//modifiers: $modifiers,
//kind: KeyEventKind::Press,
//state: KeyEventState::NONE
//})
//};
//($code:expr) => {
//crossterm::event::Event::Key(KeyEvent {
//code: $code,
//modifiers: KeyModifiers::NONE,
//kind: KeyEventKind::Press,
//state: KeyEventState::NONE
//})
//};
//}