mix 0.2.1

mix - a rust ui library cooked up in half a day! (expect extra salt)
use std::ops::{Deref, DerefMut};
use crate::platform::Cx;
use crate::platform::math::Vec2;
use crate::platform::draw_list::DrawListId;
use crate::draw::turtle::{Turtle, Walk};
use crate::draw::layout::Layout;
use crate::draw::rect::Rect;

pub struct Cx2d<'a> {
    pub cx: &'a mut Cx,
    pub turtles: Vec<Turtle>,
    pub overlay_id: Option<DrawListId>,
}

impl<'a> Deref for Cx2d<'a> {
    type Target = Cx;
    
    fn deref(&self) -> &Self::Target {
        self.cx
    }
}

impl<'a> DerefMut for Cx2d<'a> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        self.cx
    }
}

impl<'a> Cx2d<'a> {
    pub fn new(cx: &'a mut Cx) -> Self {
        Self {
            cx,
            turtles: Vec::with_capacity(64),
            overlay_id: None,
        }
    }
    
    pub fn begin_turtle(&mut self, layout: Layout) -> &mut Turtle {
        let rect = Rect::zero();
        let turtle = Turtle::new(rect, layout);
        self.turtles.push(turtle);
        self.turtles.last_mut().unwrap()
    }
    
    pub fn begin_sized_turtle(&mut self, size: Vec2, layout: Layout) -> &mut Turtle {
        let rect = Rect::new(0.0, 0.0, size.x, size.y);
        let turtle = Turtle::new(rect, layout);
        self.turtles.push(turtle);
        self.turtles.last_mut().unwrap()
    }
    
    pub fn end_turtle(&mut self) -> Option<Turtle> {
        self.turtles.pop()
    }
    
    pub fn peek_turtle(&self) -> Option<&Turtle> {
        self.turtles.last()
    }
    
    pub fn peek_turtle_mut(&mut self) -> Option<&mut Turtle> {
        self.turtles.last_mut()
    }
    
    pub fn peek_walk_turtle(&self, walk: Walk) -> Rect {
        if let Some(turtle) = self.peek_turtle() {
            match walk {
                Walk::Size(size) => {
                    let mut rect = turtle.rect.clone();
                    rect.size = size;
                    rect
                },
                Walk::Compute => {
                    let content_size = turtle.compute_content_size();
                    let mut rect = turtle.rect.clone();
                    rect.size = content_size;
                    rect
                },
            }
        } else {
            Rect::zero()
        }
    }
    
    pub fn walk_turtle(&mut self, walk: Walk) -> Rect {
        if let Some(turtle) = self.peek_turtle_mut() {
            match walk {
                Walk::Size(size) => {
                    turtle.rect.size = size;
                    turtle.rect
                },
                Walk::Compute => {
                    let content_size = turtle.compute_content_size();
                    turtle.rect.size = content_size;
                    turtle.rect
                },
            }
        } else {
            Rect::zero()
        }
    }
    
    pub fn add_turtle_item(&mut self, size: Vec2) -> Option<Rect> {
        if let Some(turtle) = self.peek_turtle_mut() {
            Some(turtle.add_item(size, None))
        } else {
            None
        }
    }
}