ferroui_base/rendering/composition/server/server_composition_visual/
composition_clip.rs1use super::ServerCompositionVisual;
7use crate::rendering::composition::server::{
8 CompositionClipShape, IServerObject, IServerRenderResource, IServerRenderResourceObserver,
9};
10use std::rc::Rc;
11
12impl ServerCompositionVisual {
13 pub fn composition_clip(&self) -> Option<Rc<dyn IServerObject>> {
16 self.props.base().composition_clip()
17 }
18
19 pub fn composition_clip_shape(&self) -> Option<CompositionClipShape> {
22 let clip = self.composition_clip()?;
23 CompositionClipShape::of(&*clip, self.size())
24 }
25
26 fn composition_clip_resource(&self) -> Option<Rc<dyn IServerRenderResource>> {
27 self.composition_clip().and_then(|clip| clip.as_render_resource())
28 }
29
30 pub(super) fn observe_composition_clip(&self, observe: bool) {
33 let (Some(resource), Some(this)) = (self.composition_clip_resource(), self.rc()) else { return };
34 let observer: Rc<dyn IServerRenderResourceObserver> = this;
35 if observe {
36 resource.add_observer(&observer);
37 } else {
38 resource.remove_observer(&observer);
39 }
40 }
41
42 pub(super) fn is_composition_clip(&self, sender: &dyn IServerRenderResource) -> bool {
44 self.composition_clip_resource()
45 .is_some_and(|resource| std::ptr::addr_eq(Rc::as_ptr(&resource), sender as *const dyn IServerRenderResource))
46 }
47
48 pub(super) fn composition_clip_changed(&self) {
51 self.trigger_composition_fields_dirty();
52 self.trigger_clip_size_dirty();
53 self.own_bounds_dirty.set(true);
54 }
55}