1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use crate::state_machine::DeltaTime;
use bracket_terminal::prelude::*;
pub type StateTransition<S, R> = Option<Transition<S, R>>;
pub trait State {
type State: ?Sized;
type StateResult: ?Sized;
#[must_use = "it may trigger a state change"]
fn update(
&mut self,
term: &mut BTerm,
state: &Self::State,
pop_result: &Option<Self::StateResult>,
dt: DeltaTime,
) -> (
StateTransition<Self::State, Self::StateResult>,
TransitionUpdate,
)
where
Self::State: std::marker::Sized,
Self::StateResult: std::marker::Sized;
fn draw(&self, _term: &mut BTerm, _state: &Self::State, _active: bool) {}
fn clear_consoles(&self, _state: &Self::State, _term: &mut BTerm) {
BACKEND_INTERNAL
.lock()
.consoles
.iter_mut()
.for_each(|c| c.console.cls());
}
fn is_transparent(&self) -> bool {
true
}
}
pub enum Transition<S, R> {
Pop(R),
Terminate,
Push(Box<dyn State<State = S, StateResult = R>>),
Switch(Box<dyn State<State = S, StateResult = R>>),
}
#[derive(Debug)]
pub enum TransitionUpdate {
Immediate,
Update,
WaitForEvent,
}
pub enum RunControl {
Quit,
Update,
WaitForEvent,
}