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