gled-model 2.31.2

The data model of gled: projects, scenes, effects, animations, curves and assets
Documentation
use super::pos::CurvePos;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Eq)]
pub enum CurvePoint {
    First(CurvePos),
    /// All other points
    Inner(CurvePos),
    /// In between each Outer and Inner Points are the Bezier points to define the curves
    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,
        }
    }
}