ferroui_base/rendering/composition/
layer_visual.rs1use super::generated::{LayerVisualHooks, LayerVisualProps};
2use super::server::ServerLayerVisual;
3use super::visual::CompositionVisualKind;
4use super::{CompositionBrush, CompositionEffectBrush, CompositionVisual, Compositor, DropShadow, ICompositionObject};
5use std::ops::Deref;
6use std::rc::Rc;
7
8impl LayerVisualHooks for CompositionVisual {}
9
10#[derive(Clone)]
28pub struct LayerVisual(Rc<CompositionVisual>);
29
30impl Deref for LayerVisual {
31 type Target = Rc<CompositionVisual>;
32
33 fn deref(&self) -> &Rc<CompositionVisual> {
34 &self.0
35 }
36}
37
38impl LayerVisual {
39 pub(crate) fn new(compositor: &Rc<Compositor>) -> LayerVisual {
40 let visual = CompositionVisual::create(
41 compositor,
42 CompositionVisualKind::Layer(LayerVisualProps::new()),
43 || Box::new(ServerLayerVisual::new()),
44 );
45 visual.set_clip_to_bounds(false);
47 LayerVisual(visual)
48 }
49
50 pub fn from_visual(visual: &Rc<CompositionVisual>) -> Option<LayerVisual> {
52 matches!(visual.kind, CompositionVisualKind::Layer(_)).then(|| LayerVisual(visual.clone()))
53 }
54
55 pub fn visual(&self) -> &Rc<CompositionVisual> {
57 &self.0
58 }
59
60 fn props(&self) -> &LayerVisualProps {
61 match &self.0.kind {
62 CompositionVisualKind::Layer(props) => props,
63 _ => unreachable!("a layer visual handle wraps a layer visual"),
64 }
65 }
66
67 pub fn shadow(&self) -> Option<Rc<DropShadow>> {
69 self.props().shadow().and_then(|shadow| shadow.into_any_rc().downcast::<DropShadow>().ok())
70 }
71
72 pub fn set_shadow(&self, value: Option<Rc<DropShadow>>) {
73 self.props().set_shadow(&*self.0, value.map(|shadow| shadow as Rc<dyn ICompositionObject>))
74 }
75
76 pub fn effect(&self) -> Option<CompositionEffectBrush> {
80 self.props()
81 .effect_brush()
82 .and_then(|brush| brush.into_any_rc().downcast::<CompositionBrush>().ok())
83 .and_then(|brush| CompositionEffectBrush::from_brush(&brush))
84 }
85
86 pub fn set_effect(&self, value: Option<CompositionEffectBrush>) {
87 self.props().set_effect_brush(
88 &*self.0,
89 value.map(|brush| brush.brush().clone() as Rc<dyn ICompositionObject>),
90 )
91 }
92}