ferroui_base/rendering/composition/brushes/
composition_nine_grid_brush.rs1use super::composition_brush::{CompositionBrush, CompositionBrushKind};
6use super::{ServerCompositionMaskBrush, ServerCompositionNineGridBrush};
7use crate::rendering::composition::generated::{CompositionMaskBrushProps, CompositionNineGridBrushProps};
8use crate::rendering::composition::{Compositor, ICompositionObject};
9use std::ops::Deref;
10use std::rc::Rc;
11
12#[derive(Clone)]
27pub struct CompositionNineGridBrush(Rc<CompositionBrush>);
28
29impl Deref for CompositionNineGridBrush {
30 type Target = Rc<CompositionBrush>;
31
32 fn deref(&self) -> &Rc<CompositionBrush> {
33 &self.0
34 }
35}
36
37macro_rules! nine_grid_scalar {
38 ($($(#[$meta:meta])* $get:ident / $set:ident;)*) => {
39 impl CompositionNineGridBrush {$(
40 $(#[$meta])*
41 pub fn $get(&self) -> f32 {
42 self.props().$get()
43 }
44
45 pub fn $set(&self, value: f32) {
46 self.props().$set(&*self.0, value)
47 }
48 )*}
49 };
50}
51
52nine_grid_scalar! {
53 left_inset / set_left_inset;
56 top_inset / set_top_inset;
58 right_inset / set_right_inset;
61 bottom_inset / set_bottom_inset;
64 left_inset_scale / set_left_inset_scale;
67 top_inset_scale / set_top_inset_scale;
69 right_inset_scale / set_right_inset_scale;
71 bottom_inset_scale / set_bottom_inset_scale;
73}
74
75impl CompositionNineGridBrush {
76 pub(crate) fn new(compositor: &Rc<Compositor>) -> CompositionNineGridBrush {
77 let brush = CompositionBrush::create(
78 compositor,
79 CompositionBrushKind::NineGrid(CompositionNineGridBrushProps::new()),
80 |c| ServerCompositionNineGridBrush::new(c),
81 );
82 brush.initialize_defaults();
83 CompositionNineGridBrush(brush)
84 }
85
86 pub fn from_brush(brush: &Rc<CompositionBrush>) -> Option<CompositionNineGridBrush> {
88 matches!(brush.kind, CompositionBrushKind::NineGrid(_)).then(|| CompositionNineGridBrush(brush.clone()))
89 }
90
91 pub fn props(&self) -> &CompositionNineGridBrushProps {
93 match &self.0.kind {
94 CompositionBrushKind::NineGrid(props) => props,
95 _ => unreachable!("a nine-grid brush handle wraps a nine-grid brush"),
96 }
97 }
98
99 pub fn source(&self) -> Option<Rc<CompositionBrush>> {
101 self.props().source().and_then(|brush| brush.into_any_rc().downcast::<CompositionBrush>().ok())
102 }
103
104 pub fn set_source(&self, value: Option<Rc<CompositionBrush>>) {
105 self.props().set_source(&*self.0, value.map(|brush| brush as Rc<dyn ICompositionObject>))
106 }
107
108 pub fn is_center_hollow(&self) -> bool {
110 self.props().is_center_hollow()
111 }
112
113 pub fn set_is_center_hollow(&self, value: bool) {
114 self.props().set_is_center_hollow(&*self.0, value)
115 }
116
117 pub fn set_insets(&self, inset: f32) {
119 self.set_insets_with(inset, inset, inset, inset);
120 }
121
122 pub fn set_insets_with(&self, left: f32, top: f32, right: f32, bottom: f32) {
124 self.set_left_inset(left);
125 self.set_top_inset(top);
126 self.set_right_inset(right);
127 self.set_bottom_inset(bottom);
128 }
129
130 pub fn set_inset_scales(&self, scale: f32) {
132 self.set_inset_scales_with(scale, scale, scale, scale);
133 }
134
135 pub fn set_inset_scales_with(&self, left: f32, top: f32, right: f32, bottom: f32) {
137 self.set_left_inset_scale(left);
138 self.set_top_inset_scale(top);
139 self.set_right_inset_scale(right);
140 self.set_bottom_inset_scale(bottom);
141 }
142}
143
144#[derive(Clone)]
155pub struct CompositionMaskBrush(Rc<CompositionBrush>);
156
157impl Deref for CompositionMaskBrush {
158 type Target = Rc<CompositionBrush>;
159
160 fn deref(&self) -> &Rc<CompositionBrush> {
161 &self.0
162 }
163}
164
165impl CompositionMaskBrush {
166 pub(crate) fn new(compositor: &Rc<Compositor>) -> CompositionMaskBrush {
167 let brush = CompositionBrush::create(
168 compositor,
169 CompositionBrushKind::Mask(CompositionMaskBrushProps::new()),
170 |c| ServerCompositionMaskBrush::new(c),
171 );
172 brush.initialize_defaults();
173 CompositionMaskBrush(brush)
174 }
175
176 pub fn from_brush(brush: &Rc<CompositionBrush>) -> Option<CompositionMaskBrush> {
178 matches!(brush.kind, CompositionBrushKind::Mask(_)).then(|| CompositionMaskBrush(brush.clone()))
179 }
180
181 pub fn props(&self) -> &CompositionMaskBrushProps {
183 match &self.0.kind {
184 CompositionBrushKind::Mask(props) => props,
185 _ => unreachable!("a mask brush handle wraps a mask brush"),
186 }
187 }
188
189 pub fn source(&self) -> Option<Rc<CompositionBrush>> {
191 self.props().source().and_then(|brush| brush.into_any_rc().downcast::<CompositionBrush>().ok())
192 }
193
194 pub fn set_source(&self, value: Option<Rc<CompositionBrush>>) {
195 self.props().set_source(&*self.0, value.map(|brush| brush as Rc<dyn ICompositionObject>))
196 }
197
198 pub fn mask(&self) -> Option<Rc<CompositionBrush>> {
200 self.props().mask().and_then(|brush| brush.into_any_rc().downcast::<CompositionBrush>().ok())
201 }
202
203 pub fn set_mask(&self, value: Option<Rc<CompositionBrush>>) {
204 self.props().set_mask(&*self.0, value.map(|brush| brush as Rc<dyn ICompositionObject>))
205 }
206}