use super::generated::{LayerVisualHooks, LayerVisualProps};
use super::server::ServerLayerVisual;
use super::visual::CompositionVisualKind;
use super::{CompositionBrush, CompositionEffectBrush, CompositionVisual, Compositor, DropShadow, ICompositionObject};
use std::ops::Deref;
use std::rc::Rc;
impl LayerVisualHooks for CompositionVisual {}
#[derive(Clone)]
pub struct LayerVisual(Rc<CompositionVisual>);
impl Deref for LayerVisual {
type Target = Rc<CompositionVisual>;
fn deref(&self) -> &Rc<CompositionVisual> {
&self.0
}
}
impl LayerVisual {
pub(crate) fn new(compositor: &Rc<Compositor>) -> LayerVisual {
let visual = CompositionVisual::create(
compositor,
CompositionVisualKind::Layer(LayerVisualProps::new()),
|| Box::new(ServerLayerVisual::new()),
);
visual.set_clip_to_bounds(false);
LayerVisual(visual)
}
pub fn from_visual(visual: &Rc<CompositionVisual>) -> Option<LayerVisual> {
matches!(visual.kind, CompositionVisualKind::Layer(_)).then(|| LayerVisual(visual.clone()))
}
pub fn visual(&self) -> &Rc<CompositionVisual> {
&self.0
}
fn props(&self) -> &LayerVisualProps {
match &self.0.kind {
CompositionVisualKind::Layer(props) => props,
_ => unreachable!("a layer visual handle wraps a layer visual"),
}
}
pub fn shadow(&self) -> Option<Rc<DropShadow>> {
self.props().shadow().and_then(|shadow| shadow.into_any_rc().downcast::<DropShadow>().ok())
}
pub fn set_shadow(&self, value: Option<Rc<DropShadow>>) {
self.props().set_shadow(&*self.0, value.map(|shadow| shadow as Rc<dyn ICompositionObject>))
}
pub fn effect(&self) -> Option<CompositionEffectBrush> {
self.props()
.effect_brush()
.and_then(|brush| brush.into_any_rc().downcast::<CompositionBrush>().ok())
.and_then(|brush| CompositionEffectBrush::from_brush(&brush))
}
pub fn set_effect(&self, value: Option<CompositionEffectBrush>) {
self.props().set_effect_brush(
&*self.0,
value.map(|brush| brush.brush().clone() as Rc<dyn ICompositionObject>),
)
}
}