use Cursive;
use std::ops::Deref;
use std::rc::Rc;
#[derive(Clone)]
pub struct Callback(Rc<Box<Fn(&mut Cursive)>>);
impl Callback {
pub fn from_fn<F: Fn(&mut Cursive) + 'static>(f: F) -> Self {
Callback(Rc::new(Box::new(f)))
}
}
impl Deref for Callback {
type Target = Box<Fn(&mut Cursive)>;
fn deref<'a>(&'a self) -> &'a Box<Fn(&mut Cursive)> {
&self.0
}
}
impl From<Rc<Box<Fn(&mut Cursive)>>> for Callback {
fn from(f: Rc<Box<Fn(&mut Cursive)>>) -> Self {
Callback(f)
}
}
impl From<Box<Fn(&mut Cursive) + Send>> for Callback {
fn from(f: Box<Fn(&mut Cursive) + Send>) -> Self {
Callback(Rc::new(f))
}
}
impl From<Box<Fn(&mut Cursive)>> for Callback {
fn from(f: Box<Fn(&mut Cursive)>) -> Self {
Callback(Rc::new(f))
}
}
pub enum EventResult {
Ignored,
Consumed(Option<Callback>), }
impl EventResult {
pub fn with_cb<F: 'static + Fn(&mut Cursive)>(f: F) -> Self {
EventResult::Consumed(Some(Callback::from_fn(f)))
}
pub fn is_consumed(&self) -> bool {
match *self {
EventResult::Consumed(_) => true,
EventResult::Ignored => false,
}
}
pub fn process(self, s: &mut Cursive) {
if let EventResult::Consumed(Some(cb)) = self {
cb(s);
}
}
}
#[derive(PartialEq,Eq,Clone,Copy,Hash,Debug)]
pub enum Key {
Enter,
Tab,
Backspace,
Esc,
Left,
Right,
Up,
Down,
Ins,
Del,
Home,
End,
PageUp,
PageDown,
PauseBreak,
NumpadCenter,
F0,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
}
impl Key {
pub fn from_f(n: u8) -> Key {
match n {
0 => Key::F0,
1 => Key::F1,
2 => Key::F2,
3 => Key::F3,
4 => Key::F4,
5 => Key::F5,
6 => Key::F6,
7 => Key::F7,
8 => Key::F8,
9 => Key::F9,
10 => Key::F10,
11 => Key::F11,
12 => Key::F12,
_ => panic!("unknown function key: F{}", n),
}
}
}
#[derive(PartialEq,Eq,Clone,Copy,Hash,Debug)]
pub enum Event {
WindowResize,
Refresh,
Char(char),
CtrlChar(char),
AltChar(char),
Key(Key),
Shift(Key),
Alt(Key),
AltShift(Key),
Ctrl(Key),
CtrlShift(Key),
CtrlAlt(Key),
Unknown(i32),
#[doc(hidden)]
Exit,
}
impl From<char> for Event {
fn from(c: char) -> Event {
Event::Char(c)
}
}
impl From<Key> for Event {
fn from(k: Key) -> Event {
Event::Key(k)
}
}