Skip to main content

ferroui_base/media/
quadratic_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 quadratic Bezier curve segment of a path figure.
9#[repr(C)]
10pub struct QuadraticBezierSegment {
11    base: PathSegment,
12}
13
14ferro_class!(QuadraticBezierSegment: PathSegment);
15crate::ferro_class_info!(QuadraticBezierSegment { new: QuadraticBezierSegment::new });
16ferro_impl_classes!(QuadraticBezierSegment: FerroObjectImpl);
17
18impl PathSegmentImpl for QuadraticBezierSegment {
19    fn apply_to(this: &Self, ctx: &mut dyn IGeometryContext) {
20        ctx.quadratic_bezier_to(this.point1(), this.point2(), this.is_stroked());
21    }
22
23    fn to_string(this: &Self) -> String {
24        format!("Q {} {}", this.point1(), this.point2())
25    }
26}
27
28crate::ferro_properties! { impl QuadraticBezierSegment {
29    ferro_property!(pub fn point1_property() -> StyledProperty<Point> {
30        FerroProperty::register::<QuadraticBezierSegment, _>("Point1", Point::default())
31    });
32
33    ferro_property!(pub fn point2_property() -> StyledProperty<Point> {
34        FerroProperty::register::<QuadraticBezierSegment, _>("Point2", Point::default())
35    });
36} }
37
38impl QuadraticBezierSegment {
39    /// Creates the class data.
40    pub fn construct() -> Self {
41        Self { base: PathSegment::construct() }
42    }
43
44    pub fn new() -> Ref<Self> {
45        instantiate(Self::construct())
46    }
47
48    /// The control point of the curve.
49    pub fn point1(&self) -> Point {
50        self.get_value(Self::point1_property())
51    }
52
53    pub fn set_point1(&self, value: Point) {
54        self.set_value(Self::point1_property(), value)
55    }
56
57    /// The end point of the curve.
58    pub fn point2(&self) -> Point {
59        self.get_value(Self::point2_property())
60    }
61
62    pub fn set_point2(&self, value: Point) {
63        self.set_value(Self::point2_property(), value)
64    }
65}