patica 0.0.3

A terminal based pixel art editor
Documentation
use crate::clock::Ticks;
use orfail::OrFail;
use pati::{Color, Point, Version, VersionedCanvas};
use serde::{Deserialize, Serialize};
use std::{collections::BTreeMap, path::PathBuf};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Frame {
    pub name: String,
    pub path: PathBuf,
    pub top_left_anchor: String,
    pub bottom_right_anchor: String,
    pub start_ticks: Ticks,
    pub end_ticks: Ticks,
}

impl Frame {
    pub fn is_visible(&self, ticks: Ticks) -> bool {
        (self.start_ticks..self.end_ticks).contains(&ticks)
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbeddedFrame {
    pub frame: Frame,
    pub start: Point,
    pub version: Version,
    pub pixels: BTreeMap<Point, Color>,
}

impl EmbeddedFrame {
    pub fn new(frame: Frame, start: Point) -> Self {
        Self {
            frame,
            start,
            version: Version::default(),
            pixels: BTreeMap::new(),
        }
    }

    pub fn sync(&mut self, canvas: &VersionedCanvas) -> orfail::Result<()> {
        let start = canvas
            .anchors()
            .get(&self.frame.top_left_anchor)
            .copied()
            .or_fail()?;
        let end = canvas
            .anchors()
            .get(&self.frame.bottom_right_anchor)
            .copied()
            .or_fail()?;
        self.version = canvas.version();
        self.pixels = canvas
            .range_pixels(start..=end)
            .map(|(p, c)| ((p - start) + self.start, c))
            .collect();
        Ok(())
    }
}