use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::bindings::Discriminator;
#[derive(Deserialize, Clone, PartialEq, Debug)]
#[serde(tag = "type")]
pub enum EventVariant {
#[serde(rename = "key")]
Key(KeyEvent),
#[serde(rename = "mouse")]
Mouse(MouseEvent),
#[serde(rename = "resize")]
Resize { width: u32, height: u32 },
#[serde(rename = "message")]
Message {
sender: Discriminator,
target: Discriminator,
content: Value,
tag: String,
},
#[serde(rename = "focused")]
Focused,
#[serde(rename = "unfocused")]
Unfocused,
#[serde(rename = "value updated")]
ValueUpdated {
label: String,
new: Value,
discrim: Discriminator,
},
#[serde(rename = "value removed")]
ValueRemoved {
label: String,
discrim: Discriminator,
},
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, Hash)]
pub struct KeyEvent {
pub code: KeyCode,
pub modifier: KeyModifier,
}
impl KeyEvent {
pub fn new(code: KeyCode, modifier: KeyModifier) -> Self {
Self { code, modifier }
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, Hash)]
pub enum KeyModifier {
#[serde(rename = "alt")]
Alt,
#[serde(rename = "ctrl")]
Ctrl,
#[serde(rename = "none")]
None,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, Hash)]
pub enum KeyCode {
#[serde(rename = "backspace")]
Backspace,
#[serde(rename = "left")]
Left,
#[serde(rename = "right")]
Right,
#[serde(rename = "up")]
Up,
#[serde(rename = "down")]
Down,
#[serde(rename = "home")]
Home,
#[serde(rename = "end")]
End,
#[serde(rename = "pageup")]
PageUp,
#[serde(rename = "pagedown")]
PageDown,
#[serde(rename = "backtab")]
BackTab,
#[serde(rename = "delete")]
Delete,
#[serde(rename = "insert")]
Insert,
#[serde(rename = "f")]
F(u8),
#[serde(rename = "char")]
Char(char),
#[serde(rename = "null")]
Null,
#[serde(rename = "esc")]
Esc,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub struct MouseEvent {
pub x: u32,
pub y: u32,
pub mousetype: MouseType,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
pub enum MouseType {
#[serde(rename = "left")]
Left,
#[serde(rename = "right")]
Right,
#[serde(rename = "middle")]
Middle,
#[serde(rename = "wheelup")]
WheelUp,
#[serde(rename = "wheeldown")]
WheelDown,
#[serde(rename = "release")]
Release,
#[serde(rename = "hold")]
Hold,
}