mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-11 22:26:44 +01:00
move tui run methods to in/out and relax Sized constraint
This commit is contained in:
parent
44201ebf76
commit
6fd87ce4ed
5 changed files with 169 additions and 211 deletions
|
|
@ -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
|
||||
//})
|
||||
//};
|
||||
//}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue