yuno 0.2.1

Multimedia 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::interacting::Interactive;
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>>>,
    pub(crate) enabled: RefCell<bool>,
}

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<()> {
        // Skip rendering entirely if the widget is disabled
        if !self.is_enabled() {
            return Ok(());
        }

        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::FillPositive
    }

    fn get_vertical_plan(&self) -> Plan {
        Plan::FillPositive
    }

    fn replan(&self) {
        // Terminal leaf node; no children to cascade replanning to.
    }

    fn try_to_interactive(&self) -> Option<&dyn Interactive> {
        // This backdrop does not support interactive events.
        None
    }

    fn is_enabled(&self) -> bool {
        *self.enabled.borrow()
    }

    fn set_enabled(&self, e: bool) {
        *self.enabled.borrow_mut() = e;
    }

    fn as_drawable(&self) -> &dyn Drawable {
        self
    }
}