Skip to main content

ferroui_base/media/
bezier_segment.rs

1use crate::media::{PathSegment, PathSegmentImpl};
2use crate::platform::IGeometryContext;
3use crate::{
4    ferro_class, ferro_impl_classes, ferro_property, instantiate, FerroObjectImpl, FerroProperty, Point, Ref,
5    StyledProperty,
6};
7
8/// A cubic Bezier curve segment of a path figure.
9#[repr(C)]
10pub struct BezierSegment {
11    base: PathSegment,
12}
13
14ferro_class!(BezierSegment: PathSegment);
15crate::ferro_class_info!(BezierSegment { new: BezierSegment::new });
16ferro_impl_classes!(BezierSegment: FerroObjectImpl);
17
18impl PathSegmentImpl for BezierSegment {
19    fn apply_to(this: &Self, ctx: &mut dyn IGeometryContext) {
20        ctx.cubic_bezier_to(this.point1(), this.point2(), this.point3(), this.is_stroked());
21    }
22
23    fn to_string(this: &Self) -> String {
24        format!("C {} {} {}", this.point1(), this.point2(), this.point3())
25    }
26}
27
28crate::ferro_properties! { impl BezierSegment {
29    ferro_property!(pub fn point1_property() -> StyledProperty<Point> {
30        FerroProperty::register::<BezierSegment, _>("Point1", Point::default())
31    });
32
33    ferro_property!(pub fn point2_property() -> StyledProperty<Point> {
34        FerroProperty::register::<BezierSegment, _>("Point2", Point::default())
35    });
36
37    ferro_property!(pub fn point3_property() -> StyledProperty<Point> {
38        FerroProperty::register::<BezierSegment, _>("Point3", Point::default())
39    });
40} }
41
42impl BezierSegment {
43    /// Creates the class data.
44    pub fn construct() -> Self {
45        Self { base: PathSegment::construct() }
46    }
47
48    pub fn new() -> Ref<Self> {
49        instantiate(Self::construct())
50    }
51
52    /// The first control point of the curve.
53    pub fn point1(&self) -> Point {
54        self.get_value(Self::point1_property())
55    }
56
57    pub fn set_point1(&self, value: Point) {
58        self.set_value(Self::point1_property(), value)
59    }
60
61    /// The second control point of the curve.
62    pub fn point2(&self) -> Point {
63        self.get_value(Self::point2_property())
64    }
65
66    pub fn set_point2(&self, value: Point) {
67        self.set_value(Self::point2_property(), value)
68    }
69
70    /// The end point of the curve.
71    pub fn point3(&self) -> Point {
72        self.get_value(Self::point3_property())
73    }
74
75    pub fn set_point3(&self, value: Point) {
76        self.set_value(Self::point3_property(), value)
77    }
78}