ferroui_base/media/
i_pen.rs1use crate::media::immutable::ImmutablePen;
2use crate::media::{IBrush, IDashStyle, Pen, PenLineCap, PenLineJoin};
3use crate::media::ref_adapter::RefAdapter;
4use crate::{FerroObject, ObjectType, Ref, Upcast};
5use std::any::Any;
6use std::rc::Rc;
7
8pub trait IPen: 'static {
12 fn brush(&self) -> Option<Rc<dyn IBrush>>;
14
15 fn dash_style(&self) -> Option<Rc<dyn IDashStyle>>;
17
18 fn line_cap(&self) -> PenLineCap;
20
21 fn line_join(&self) -> PenLineJoin;
23
24 fn miter_limit(&self) -> f64;
27
28 fn thickness(&self) -> f64;
30
31 fn as_any(&self) -> &dyn Any;
33
34 fn as_immutable_pen(&self) -> Option<&ImmutablePen> {
38 self.as_any().downcast_ref::<ImmutablePen>()
39 }
40
41 fn as_object(&self) -> Option<&FerroObject> {
43 None
44 }
45
46 fn as_composition_render_resource(
50 &self,
51 ) -> Option<&dyn crate::rendering::composition::drawing::ICompositionRenderResource> {
52 None
53 }
54
55 fn into_immutable_pen(self: Rc<Self>) -> Rc<ImmutablePen>;
57
58 fn to_shared(&self) -> Option<crate::media::SharedPen> {
61 None
62 }
63
64 #[doc(hidden)]
66 fn reference_id(&self) -> *const () {
67 self as *const Self as *const ()
68 }
69
70 fn equals(&self, other: &dyn IPen) -> bool {
73 self.reference_id() == other.reference_id()
74 }
75}
76
77impl PartialEq for dyn IPen {
78 #[inline]
79 fn eq(&self, other: &Self) -> bool {
80 self.equals(other)
81 }
82}
83
84impl std::fmt::Debug for dyn IPen {
85 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
86 f.debug_struct("IPen")
87 .field("brush", &self.brush())
88 .field("thickness", &self.thickness())
89 .field("dash_style", &self.dash_style())
90 .field("line_cap", &self.line_cap())
91 .field("line_join", &self.line_join())
92 .field("miter_limit", &self.miter_limit())
93 .finish()
94 }
95}
96
97impl<T: ObjectType + Upcast<Pen>> IPen for RefAdapter<T> {
98 fn brush(&self) -> Option<Rc<dyn IBrush>> {
99 Upcast::<Pen>::upcast(&*self.0).brush()
100 }
101
102 fn dash_style(&self) -> Option<Rc<dyn IDashStyle>> {
103 Upcast::<Pen>::upcast(&*self.0).dash_style()
104 }
105
106 #[inline]
107 fn line_cap(&self) -> PenLineCap {
108 Upcast::<Pen>::upcast(&*self.0).line_cap()
109 }
110
111 #[inline]
112 fn line_join(&self) -> PenLineJoin {
113 Upcast::<Pen>::upcast(&*self.0).line_join()
114 }
115
116 #[inline]
117 fn miter_limit(&self) -> f64 {
118 Upcast::<Pen>::upcast(&*self.0).miter_limit()
119 }
120
121 #[inline]
122 fn thickness(&self) -> f64 {
123 Upcast::<Pen>::upcast(&*self.0).thickness()
124 }
125
126 fn as_any(&self) -> &dyn Any {
127 Upcast::<Pen>::upcast(&*self.0)
128 }
129
130 fn as_object(&self) -> Option<&FerroObject> {
131 Some(self.object())
132 }
133
134 fn as_composition_render_resource(
135 &self,
136 ) -> Option<&dyn crate::rendering::composition::drawing::ICompositionRenderResource> {
137 Some(Upcast::<Pen>::upcast(&*self.0))
138 }
139
140 fn into_immutable_pen(self: Rc<Self>) -> Rc<ImmutablePen> {
141 Rc::new(Upcast::<Pen>::upcast(&*self.0).to_immutable())
142 }
143
144 fn reference_id(&self) -> *const () {
145 RefAdapter::reference_id(self)
146 }
147}
148
149impl<T: ObjectType + Upcast<Pen>> From<Ref<T>> for Rc<dyn IPen> {
150 #[inline]
151 fn from(value: Ref<T>) -> Self {
152 Rc::new(RefAdapter(value))
153 }
154}
155
156impl<T: ObjectType + Upcast<Pen>> From<&Ref<T>> for Rc<dyn IPen> {
157 #[inline]
158 fn from(value: &Ref<T>) -> Self {
159 Rc::new(RefAdapter(value.clone()))
160 }
161}