flou 0.1.0

Parser for Flou, a flowchart description language.
Documentation
use crate::{
    parse::ast::Direction,
    pos::{pos, PixelPos},
};

#[derive(Debug, Clone, Copy)]
pub(crate) struct Viewport {
    pub(crate) origin: PixelPos,
    pub(crate) size: PixelPos,
}

pub(crate) struct Midpoints {
    pub(crate) top: PixelPos,
    pub(crate) bottom: PixelPos,
    pub(crate) left: PixelPos,
    pub(crate) right: PixelPos,
}

impl Midpoints {
    pub(crate) fn get_from_direction(&self, dir: Direction) -> PixelPos {
        match dir {
            Direction::North => self.top,
            Direction::East => self.right,
            Direction::West => self.left,
            Direction::South => self.bottom,
        }
    }
}

impl Viewport {
    pub(crate) fn new(origin: PixelPos, size: PixelPos) -> Self {
        Self { origin, size }
    }

    pub(crate) fn center(&self) -> PixelPos {
        self.origin + self.size / 2
    }

    pub(crate) fn midpoints(&self) -> Midpoints {
        let rel = self.midpoints_relative();

        Midpoints {
            top: self.origin + rel.top,
            bottom: self.origin + rel.bottom,
            left: self.origin + rel.left,
            right: self.origin + rel.right,
        }
    }

    pub(crate) fn midpoints_relative(&self) -> Midpoints {
        let half = self.size / 2;

        Midpoints {
            top: pos(half.x, 0),
            bottom: pos(half.x, self.size.y),
            left: pos(0, half.y),
            right: pos(self.size.x, half.y),
        }
    }
}