use TuiInput in handlers

This commit is contained in:
🪞👃🪞 2024-09-15 16:11:26 +03:00
parent d9535b707f
commit 5d00e9f284
11 changed files with 37 additions and 61 deletions

View file

@ -24,7 +24,7 @@ impl Engine for Tui {
type Unit = u16;
type Size = [Self::Unit;2];
type Area = [Self::Unit;4];
type Input = Self;
type Input = TuiInput;
type Handled = bool;
type Output = Self;
fn exited (&self) -> bool {
@ -48,18 +48,6 @@ impl Engine for Tui {
disable_raw_mode().map_err(Into::into)
}
}
impl Input<Tui> for Tui {
type Event = TuiEvent;
fn event (&self) -> TuiEvent {
self.event.read().unwrap().clone().unwrap()
}
fn is_done (&self) -> bool {
self.exited.fetch_and(true, Ordering::Relaxed)
}
fn done (&self) {
self.exited.store(true, Ordering::Relaxed);
}
}
impl Output<Tui> for Tui {
#[inline] fn area (&self) -> <Self as Engine>::Area {
self.area
@ -78,6 +66,22 @@ impl Output<Tui> for Tui {
Ok(next)
}
}
pub struct TuiInput {
event: TuiEvent,
exited: Arc<AtomicBool>,
}
impl Input<Tui> for TuiInput {
type Event = TuiEvent;
fn event (&self) -> &TuiEvent {
&self.event
}
fn is_done (&self) -> bool {
self.exited.fetch_and(true, Ordering::Relaxed)
}
fn done (&self) {
self.exited.store(true, Ordering::Relaxed);
}
}
impl Tui {
/// Run the main loop.
@ -106,7 +110,6 @@ impl Tui {
engine: &Arc<RwLock<Self>>, state: &Arc<RwLock<R>>, poll: Duration
) -> JoinHandle<()> {
let exited = engine.read().unwrap().exited.clone();
let engine = engine.clone();
let state = state.clone();
spawn(move || loop {
if exited.fetch_and(true, Ordering::Relaxed) {
@ -119,8 +122,10 @@ impl Tui {
exited.store(true, Ordering::Relaxed);
},
_ => {
*engine.write().unwrap().event.write().unwrap() = Some(event);
if let Err(e) = state.write().unwrap().handle(&*engine.read().unwrap()) {
if let Err(e) = state.write().unwrap().handle(&TuiInput {
event,
exited: exited.clone()
}) {
panic!("{e}")
}
}