Skip to main content

ferroui_base/rendering/composition/
composition_experimental_acrylic_visual.rs

1use super::visual::CompositionVisualKind;
2use super::{CompositionDrawListVisual, CompositionVisual, Compositor};
3use crate::media::ImmutableExperimentalAcrylicMaterial;
4use crate::{CornerRadius, Visual};
5use std::ops::Deref;
6use std::rc::Rc;
7
8/// A draw list visual that draws an acrylic rectangle below its content.
9#[derive(Clone)]
10pub struct CompositionExperimentalAcrylicVisual(CompositionDrawListVisual);
11
12impl Deref for CompositionExperimentalAcrylicVisual {
13    type Target = CompositionDrawListVisual;
14
15    fn deref(&self) -> &CompositionDrawListVisual {
16        &self.0
17    }
18}
19
20impl CompositionExperimentalAcrylicVisual {
21    pub fn new(compositor: &Rc<Compositor>, visual: &Visual) -> CompositionExperimentalAcrylicVisual {
22        CompositionExperimentalAcrylicVisual(CompositionDrawListVisual::create(compositor, visual, true))
23    }
24
25    /// The handle of `visual` as an acrylic visual, if it is one.
26    pub fn from_visual(visual: &Rc<CompositionVisual>) -> Option<CompositionExperimentalAcrylicVisual> {
27        match &visual.kind {
28            CompositionVisualKind::DrawList(data) if data.acrylic.is_some() => {
29                CompositionDrawListVisual::from_visual(visual).map(CompositionExperimentalAcrylicVisual)
30            }
31            _ => None,
32        }
33    }
34
35    /// The draw list visual this visual is.
36    pub fn as_draw_list_visual(&self) -> &CompositionDrawListVisual {
37        &self.0
38    }
39
40    fn props(&self) -> &super::generated::CompositionExperimentalAcrylicVisualProps {
41        match &self.0.kind {
42            CompositionVisualKind::DrawList(data) => match &data.acrylic {
43                Some(props) => props,
44                None => unreachable!("an acrylic visual handle wraps an acrylic visual"),
45            },
46            _ => unreachable!("an acrylic visual handle wraps an acrylic visual"),
47        }
48    }
49
50    pub fn material(&self) -> ImmutableExperimentalAcrylicMaterial {
51        self.props().material()
52    }
53
54    pub fn set_material(&self, value: ImmutableExperimentalAcrylicMaterial) {
55        let visual: &CompositionVisual = &self.0;
56        self.props().set_material(visual, value)
57    }
58
59    pub fn corner_radius(&self) -> CornerRadius {
60        self.props().corner_radius()
61    }
62
63    pub fn set_corner_radius(&self, value: CornerRadius) {
64        let visual: &CompositionVisual = &self.0;
65        self.props().set_corner_radius(visual, value)
66    }
67}