use bevy::reflect::Reflect;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Reflect, Default)]
pub enum ButtonState {
JustPressed,
Pressed,
JustReleased,
#[default]
Released,
}
impl ButtonState {
pub fn tick(&mut self) {
use ButtonState::*;
*self = match self {
JustPressed => Pressed,
Pressed => Pressed,
JustReleased => Released,
Released => Released,
}
}
#[inline]
pub fn press(&mut self) {
if *self != ButtonState::Pressed {
*self = ButtonState::JustPressed;
}
}
#[inline]
pub fn release(&mut self) {
if *self != ButtonState::Released {
*self = ButtonState::JustReleased;
}
}
#[inline]
#[must_use]
pub fn pressed(&self) -> bool {
*self == ButtonState::Pressed || *self == ButtonState::JustPressed
}
#[inline]
#[must_use]
pub fn released(&self) -> bool {
*self == ButtonState::Released || *self == ButtonState::JustReleased
}
#[inline]
#[must_use]
pub fn just_pressed(&self) -> bool {
*self == ButtonState::JustPressed
}
#[inline]
#[must_use]
pub fn just_released(&self) -> bool {
*self == ButtonState::JustReleased
}
}