cranpose_ui/modifier/
blur.rs1use std::rc::Rc;
2
3use cranpose_ui_graphics::{BlurredEdgeTreatment, Dp, GraphicsLayer, LayerShape, RenderEffect};
4
5use super::{inspector_metadata, Modifier};
6use crate::modifier_nodes::LazyGraphicsLayerElement;
7
8impl Modifier {
9 pub fn blur(self, radius: Dp) -> Self {
16 self.blur_with_edge_treatment(radius, BlurredEdgeTreatment::default())
17 }
18
19 pub fn blur_with_edge_treatment(
25 self,
26 radius: Dp,
27 edge_treatment: BlurredEdgeTreatment,
28 ) -> Self {
29 self.blur_xy(radius, radius, edge_treatment)
30 }
31
32 pub fn blur_xy(self, radius_x: Dp, radius_y: Dp, edge_treatment: BlurredEdgeTreatment) -> Self {
36 if radius_x.0 <= 0.0 && radius_y.0 <= 0.0 && !edge_treatment.clip() {
37 return self;
38 }
39
40 let modifier = Self::with_element(LazyGraphicsLayerElement::new(Rc::new(move || {
41 let density = crate::render_state::current_density();
42 let radius_x_px = radius_x.to_px(density).max(0.0);
43 let radius_y_px = radius_y.to_px(density).max(0.0);
44 let render_effect = if radius_x_px > 0.0 && radius_y_px > 0.0 {
45 Some(RenderEffect::blur_xy(
46 radius_x_px,
47 radius_y_px,
48 edge_treatment.tile_mode(),
49 ))
50 } else {
51 None
52 };
53 GraphicsLayer {
54 render_effect,
55 shape: edge_treatment.shape().unwrap_or(LayerShape::Rectangle),
56 clip: edge_treatment.clip(),
57 ..Default::default()
58 }
59 })))
60 .with_inspector_metadata(inspector_metadata("blur", move |info| {
61 info.add_property("radiusX", radius_x.0.to_string());
62 info.add_property("radiusY", radius_y.0.to_string());
63 info.add_property("edgeTreatment", format!("{edge_treatment:?}"));
64 }));
65 self.then(modifier)
66 }
67}