use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
use super::action::Action;
use super::defaults::default_gesture_binding;
use super::gesture::GestureDirection;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Binding {
Single(Action),
Gesture(BTreeMap<GestureDirection, Action>),
}
impl Binding {
#[must_use]
pub fn click_action(&self) -> Action {
match self {
Binding::Single(action) => action.clone(),
Binding::Gesture(map) => map
.get(&GestureDirection::Click)
.cloned()
.unwrap_or(Action::None),
}
}
#[must_use]
pub fn direction_action(&self, direction: GestureDirection) -> Option<&Action> {
match self {
Binding::Single(_) => None,
Binding::Gesture(map) => map.get(&direction),
}
}
#[must_use]
pub fn is_gesture(&self) -> bool {
matches!(self, Binding::Gesture(_))
}
pub fn upgrade_to_gesture(&mut self) {
if let Binding::Single(action) = self {
let mut map = BTreeMap::new();
map.insert(GestureDirection::Click, action.clone());
*self = Binding::Gesture(map);
}
}
pub fn fill_gesture_defaults(&mut self) {
if let Binding::Gesture(map) = self {
for dir in GestureDirection::ALL {
map.entry(dir)
.or_insert_with(|| default_gesture_binding(dir));
}
}
}
}
impl From<Action> for Binding {
fn from(action: Action) -> Self {
Binding::Single(action)
}
}