use super::generated::{SpriteVisualHooks, SpriteVisualProps};
use super::server::ServerSpriteVisual;
use super::visual::CompositionVisualKind;
use super::{CompositionBrush, CompositionVisual, Compositor, DropShadow, ICompositionObject};
use std::ops::Deref;
use std::rc::Rc;
impl SpriteVisualHooks for CompositionVisual {}
#[derive(Clone)]
pub struct SpriteVisual(Rc<CompositionVisual>);
impl Deref for SpriteVisual {
type Target = Rc<CompositionVisual>;
fn deref(&self) -> &Rc<CompositionVisual> {
&self.0
}
}
impl SpriteVisual {
pub(crate) fn new(compositor: &Rc<Compositor>) -> SpriteVisual {
let visual = CompositionVisual::create(
compositor,
CompositionVisualKind::Sprite(SpriteVisualProps::new()),
|| Box::new(ServerSpriteVisual::new()),
);
visual.set_clip_to_bounds(false);
SpriteVisual(visual)
}
pub fn from_visual(visual: &Rc<CompositionVisual>) -> Option<SpriteVisual> {
matches!(visual.kind, CompositionVisualKind::Sprite(_)).then(|| SpriteVisual(visual.clone()))
}
pub fn visual(&self) -> &Rc<CompositionVisual> {
&self.0
}
fn props(&self) -> &SpriteVisualProps {
match &self.0.kind {
CompositionVisualKind::Sprite(props) => props,
_ => unreachable!("a sprite visual handle wraps a sprite visual"),
}
}
pub fn brush(&self) -> Option<Rc<CompositionBrush>> {
self.props().brush().and_then(|brush| brush.into_any_rc().downcast::<CompositionBrush>().ok())
}
pub fn set_brush(&self, value: Option<Rc<CompositionBrush>>) {
self.props().set_brush(&*self.0, value.map(|brush| brush as Rc<dyn ICompositionObject>))
}
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>))
}
}