ferroui_base/rendering/composition/
composition_surface_visual.rs1use super::generated::{CompositionSurfaceVisualHooks, CompositionSurfaceVisualProps};
2use super::server::ServerCompositionSurfaceVisual;
3use super::visual::CompositionVisualKind;
4use super::{CompositionSurface, CompositionVisual, Compositor, ICompositionObject};
5use std::ops::Deref;
6use std::rc::Rc;
7
8impl CompositionSurfaceVisualHooks for CompositionVisual {}
9
10#[derive(Clone)]
12pub struct CompositionSurfaceVisual(Rc<CompositionVisual>);
13
14impl Deref for CompositionSurfaceVisual {
15 type Target = Rc<CompositionVisual>;
16
17 fn deref(&self) -> &Rc<CompositionVisual> {
18 &self.0
19 }
20}
21
22impl CompositionSurfaceVisual {
23 pub(crate) fn new(compositor: &Rc<Compositor>) -> CompositionSurfaceVisual {
24 CompositionSurfaceVisual(CompositionVisual::create(
25 compositor,
26 CompositionVisualKind::Surface(CompositionSurfaceVisualProps::new()),
27 || Box::new(ServerCompositionSurfaceVisual::new()),
28 ))
29 }
30
31 pub fn from_visual(visual: &Rc<CompositionVisual>) -> Option<CompositionSurfaceVisual> {
33 matches!(visual.kind, CompositionVisualKind::Surface(_)).then(|| CompositionSurfaceVisual(visual.clone()))
34 }
35
36 fn props(&self) -> &CompositionSurfaceVisualProps {
37 match &self.0.kind {
38 CompositionVisualKind::Surface(props) => props,
39 _ => unreachable!("a surface visual handle wraps a surface visual"),
40 }
41 }
42
43 pub fn surface(&self) -> Option<Rc<CompositionSurface>> {
44 self.props().surface().and_then(|o| o.into_any_rc().downcast::<CompositionSurface>().ok())
45 }
46
47 pub fn set_surface(&self, value: Option<Rc<CompositionSurface>>) {
48 self.props().set_surface(&*self.0, value.map(|v| v as Rc<dyn ICompositionObject>))
49 }
50}