use serde::{Deserialize, Serialize};
use std::fmt;
pub const KP_OFFSET: isize = 1000;
#[derive(Copy, Clone, Serialize, Deserialize)]
pub enum EventKind {
Quit,
Resize {
width: i32,
height: i32,
},
MouseMove {
x: i32,
y: i32,
dx: i32,
dy: i32,
},
MouseDown {
button_code: MouseCode,
x: i32,
y: i32,
},
MouseUp {
button_code: MouseCode,
x: i32,
y: i32,
},
MouseWheel {
button_code: MouseCode,
},
TouchMove {
x: i32,
y: i32,
dx: i32,
dy: i32,
},
TouchDown {
x: i32,
y: i32,
},
TouchUp {
x: i32,
y: i32,
},
PinchMove {
pos_a: (i32, i32),
pos_b: (i32, i32),
vel_a: (i32, i32),
vel_b: (i32, i32),
},
PinchDown {
a: (i32, i32),
b: (i32, i32),
},
PinchUp {
dx0: i32,
dy0: i32,
dx1: i32,
dy1: i32,
},
KeyDown {
code: KeyCode,
},
KeyUp {
code: KeyCode,
},
}
#[derive(Copy, Clone, PartialEq, Serialize, Deserialize)]
#[allow(non_camel_case_types)]
pub enum KeyCode {
KEY_A = 'a' as isize,
KEY_B = 'b' as isize,
KEY_C = 'c' as isize,
KEY_D = 'd' as isize,
KEY_E = 'e' as isize,
KEY_F = 'f' as isize,
KEY_G = 'g' as isize,
KEY_H = 'h' as isize,
KEY_I = 'i' as isize,
KEY_J = 'j' as isize,
KEY_K = 'k' as isize,
KEY_L = 'l' as isize,
KEY_M = 'm' as isize,
KEY_N = 'n' as isize,
KEY_O = 'o' as isize,
KEY_P = 'p' as isize,
KEY_Q = 'q' as isize,
KEY_R = 'r' as isize,
KEY_S = 's' as isize,
KEY_T = 't' as isize,
KEY_U = 'u' as isize,
KEY_V = 'v' as isize,
KEY_W = 'w' as isize,
KEY_X = 'x' as isize,
KEY_Y = 'y' as isize,
KEY_Z = 'z' as isize,
NUM_0 = ('0' as isize) + 0,
NUM_1 = ('1' as isize) + 0,
NUM_2 = ('2' as isize) + 0,
NUM_3 = ('3' as isize) + 0,
NUM_4 = ('4' as isize) + 0,
NUM_5 = ('5' as isize) + 0,
NUM_6 = ('6' as isize) + 0,
NUM_7 = ('7' as isize) + 0,
NUM_8 = ('8' as isize) + 0,
NUM_9 = ('9' as isize) + 0,
MINUS = '-' as isize,
EQUALS = '=' as isize,
BRACKET_LEFT = '{' as isize,
BRAKET_RIGHT = '}' as isize,
COLON = ';' as isize,
SPACE = ' ' as isize,
TAB = '\t' as isize,
BACK_QUOTE = '`' as isize,
QUOTE = '\'' as isize,
BACKSLASH = '\\' as isize,
COMMA = ',' as isize,
PERIOD = '.' as isize,
FORWARD_SLASH = '/' as isize,
ENTER = '\n' as isize,
ARROW_LEFT = 128,
ARROW_RIGHT = 129,
ARROW_UP,
ARROW_DOWN,
PAREN_RIGHT,
PARENT_LEFT,
HOME,
INSERT,
ALT_L,
ALT_R,
CTRL_L,
CTRL_R,
SHIFT_L,
SHIFT_R,
SUPER_L,
MENU,
NUMLOCK,
PAUSE,
PAGE_DOWN,
PAGE_UP,
POWER,
PRINT_SCREEN,
SUPER_R,
SCROLL_LOCK,
SLEEP,
WAKE,
BACKSPACE,
CAPSLOCK,
AT,
DELETE,
END,
ESC,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
KP_0 = '0' as isize + KP_OFFSET,
KP_1 = '1' as isize + KP_OFFSET,
KP_2 = '2' as isize + KP_OFFSET,
KP_3 = '3' as isize + KP_OFFSET,
KP_4 = '4' as isize + KP_OFFSET,
KP_5 = '5' as isize + KP_OFFSET,
KP_6 = '6' as isize + KP_OFFSET,
KP_7 = '7' as isize + KP_OFFSET,
KP_8 = '8' as isize + KP_OFFSET,
KP_9 = '9' as isize + KP_OFFSET,
KP_STAR = '*' as isize + KP_OFFSET,
KP_ENTER = '\n' as isize + KP_OFFSET,
KP_INS,
KP_END,
KP_ARROW_DOWN,
KP_PAGE_DOWN,
KP_PLUS,
KP_MINUS,
KP_ARROW_LEFT,
KP_ARROW_RIGHT,
KP_HOME,
KP_ARROW_UP,
KP_PAGE_UP,
KP_DECIMAL,
KP_DEL,
KP_DASH,
KP_FORWARD_SLASH,
}
impl KeyCode {
pub fn key_val(self)->Option<char>{
let code: i128 = self.into();
if (code > KeyCode::KEY_A.into()) || (code < KeyCode::KEY_Z.into()) {
let c = code as u8 as char;
Some(c)
}else{
None
}
}
}
impl Into<i128> for KeyCode {
fn into(self) -> i128 {
use std::mem::transmute_copy;
unsafe { transmute_copy(&self) }
}
}
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Serialize, Deserialize)]
pub enum MouseCode {
LEFT_BUTTON,
RIGHT_BUTTON,
WHEEL { direction: i32 },
}
impl fmt::Display for MouseCode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
MouseCode::LEFT_BUTTON => writeln!(f, "left button"),
MouseCode::RIGHT_BUTTON => writeln!(f, "right button"),
MouseCode::WHEEL { direction } => writeln!(f, "wheel dir:{}", direction),
}
}
}