ferroui_base/rendering/composition/
sprite_visual.rs1use super::generated::{SpriteVisualHooks, SpriteVisualProps};
2use super::server::ServerSpriteVisual;
3use super::visual::CompositionVisualKind;
4use super::{CompositionBrush, CompositionVisual, Compositor, DropShadow, ICompositionObject};
5use std::ops::Deref;
6use std::rc::Rc;
7
8impl SpriteVisualHooks for CompositionVisual {}
9
10#[derive(Clone)]
24pub struct SpriteVisual(Rc<CompositionVisual>);
25
26impl Deref for SpriteVisual {
27 type Target = Rc<CompositionVisual>;
28
29 fn deref(&self) -> &Rc<CompositionVisual> {
30 &self.0
31 }
32}
33
34impl SpriteVisual {
35 pub(crate) fn new(compositor: &Rc<Compositor>) -> SpriteVisual {
36 let visual = CompositionVisual::create(
37 compositor,
38 CompositionVisualKind::Sprite(SpriteVisualProps::new()),
39 || Box::new(ServerSpriteVisual::new()),
40 );
41 visual.set_clip_to_bounds(false);
43 SpriteVisual(visual)
44 }
45
46 pub fn from_visual(visual: &Rc<CompositionVisual>) -> Option<SpriteVisual> {
48 matches!(visual.kind, CompositionVisualKind::Sprite(_)).then(|| SpriteVisual(visual.clone()))
49 }
50
51 pub fn visual(&self) -> &Rc<CompositionVisual> {
53 &self.0
54 }
55
56 fn props(&self) -> &SpriteVisualProps {
57 match &self.0.kind {
58 CompositionVisualKind::Sprite(props) => props,
59 _ => unreachable!("a sprite visual handle wraps a sprite visual"),
60 }
61 }
62
63 pub fn brush(&self) -> Option<Rc<CompositionBrush>> {
65 self.props().brush().and_then(|brush| brush.into_any_rc().downcast::<CompositionBrush>().ok())
66 }
67
68 pub fn set_brush(&self, value: Option<Rc<CompositionBrush>>) {
69 self.props().set_brush(&*self.0, value.map(|brush| brush as Rc<dyn ICompositionObject>))
70 }
71
72 pub fn shadow(&self) -> Option<Rc<DropShadow>> {
74 self.props().shadow().and_then(|shadow| shadow.into_any_rc().downcast::<DropShadow>().ok())
75 }
76
77 pub fn set_shadow(&self, value: Option<Rc<DropShadow>>) {
78 self.props().set_shadow(&*self.0, value.map(|shadow| shadow as Rc<dyn ICompositionObject>))
79 }
80}