use super::pos::CurvePos;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Eq)]
pub enum CurvePoint {
First(CurvePos),
Inner(CurvePos),
Bezier(CurvePos),
Last(CurvePos),
}
impl CurvePoint {
pub(crate) fn invert_y_axis(&mut self) {
let mut pos = self.pos();
pos.y = 1.0 - pos.y;
self.set_pos(pos);
}
pub(crate) fn invert_x_axis(&mut self) {
let mut pos = self.pos();
pos.x = 4.0 - pos.x;
*self = match self {
CurvePoint::First(_) => CurvePoint::Last(pos),
CurvePoint::Inner(_) => CurvePoint::Inner(pos),
CurvePoint::Bezier(_) => CurvePoint::Bezier(pos),
CurvePoint::Last(_) => CurvePoint::First(pos),
};
}
pub fn is_inner(&self) -> bool {
matches!(self, CurvePoint::Inner(_))
}
pub fn is_outer(&self) -> bool {
matches!(self, CurvePoint::First(_) | CurvePoint::Last(_))
}
pub fn is_bezier(&self) -> bool {
matches!(self, CurvePoint::Bezier(_))
}
pub fn pos(&self) -> CurvePos {
match self {
CurvePoint::First(pos) => *pos,
CurvePoint::Inner(pos) => *pos,
CurvePoint::Bezier(pos) => *pos,
CurvePoint::Last(pos) => *pos,
}
}
pub fn set_pos(&mut self, new_pos: CurvePos) {
match self {
CurvePoint::First(pos) | CurvePoint::Last(pos) => pos.y = new_pos.y,
CurvePoint::Inner(pos) | CurvePoint::Bezier(pos) => *pos = new_pos,
}
}
}