yuno 0.1.0

A declarative UI layout and rendering framework powered by Skia.
use std::cell::RefCell;
use std::rc::Rc;

#[allow(deprecated)]
use skia_safe::{Canvas, Color, Paint, Point, TileMode, gradient_shader};

use crate::drawing::{Drawable, Plan};
use crate::layouts::{HasPlanner, Layout};
#[allow(deprecated)]
use skia_safe::gradient_shader::GradientShaderColors;

pub struct GradientBackdrop {
    pub(crate) colors: [Color; 2],
    pub(crate) planner: RefCell<Option<Rc<dyn Layout>>>,
}

impl HasPlanner for GradientBackdrop {
    fn planner(&self) -> &RefCell<Option<Rc<dyn Layout>>> {
        &self.planner
    }
    fn set_planner(&self, p: Option<Rc<dyn Layout>>) {
        *self.planner.borrow_mut() = p;
    }
}

impl Drawable for GradientBackdrop {
    fn draw(&self, canvas: &Canvas) -> anyhow::Result<()> {
        let area = self.get_planned_drawing_area(canvas);

        #[allow(deprecated)]
        let shader = gradient_shader::linear(
            (
                Point::new(area.left, area.top),
                Point::new(area.left, area.bottom),
            ),
            GradientShaderColors::Colors(&self.colors),
            None,
            TileMode::Clamp,
            None,
            None,
        );

        if let Some(shader) = shader {
            let mut paint = Paint::default();
            paint.set_anti_alias(true).set_shader(shader);
            canvas.draw_rect(area, &paint);
        }
        Ok(())
    }
    fn get_horizontal_plan(&self) -> Plan {
        Plan::Fill
    }
    fn get_vertical_plan(&self) -> Plan {
        Plan::Fill
    }
}