umya_spreadsheet/structs/drawing/spreadsheet/
shape_properties.rs1use super::super::BlipFill;
3use super::super::EffectList;
4use super::super::ExtensionList;
5use super::super::NoFill;
6use super::super::Outline;
7use super::super::PresetGeometry;
8use super::super::SolidFill;
9use super::super::Transform2D;
10use crate::reader::driver::*;
11use crate::structs::raw::RawRelationships;
12use crate::writer::driver::*;
13use quick_xml::events::{BytesStart, Event};
14use quick_xml::Reader;
15use quick_xml::Writer;
16use std::io::Cursor;
17
18#[derive(Clone, Default, Debug)]
19pub struct ShapeProperties {
20 transform2d: Option<Box<Transform2D>>,
21 preset_geometry: PresetGeometry,
22 blip_fill: Option<Box<BlipFill>>,
23 solid_fill: Option<Box<SolidFill>>,
24 outline: Option<Box<Outline>>,
25 effect_list: Option<Box<EffectList>>,
26 no_fill: Option<NoFill>,
27 extension_list: Option<ExtensionList>,
28}
29impl ShapeProperties {
30 #[inline]
31 pub fn get_transform2d(&self) -> Option<&Transform2D> {
32 self.transform2d.as_deref()
33 }
34
35 #[inline]
36 pub fn get_transform2d_mut(&mut self) -> Option<&mut Transform2D> {
37 self.transform2d.as_deref_mut()
38 }
39
40 #[inline]
41 pub fn set_transform2d(&mut self, value: Transform2D) -> &mut Self {
42 self.transform2d = Some(Box::new(value));
43 self
44 }
45
46 #[inline]
47 pub fn get_geometry(&self) -> &PresetGeometry {
48 &self.preset_geometry
49 }
50
51 #[inline]
52 pub fn get_geometry_mut(&mut self) -> &mut PresetGeometry {
53 &mut self.preset_geometry
54 }
55
56 #[inline]
57 pub fn set_geometry(&mut self, value: PresetGeometry) -> &mut Self {
58 self.preset_geometry = value;
59 self
60 }
61
62 #[inline]
63 pub fn get_blip_fill(&self) -> Option<&BlipFill> {
64 self.blip_fill.as_deref()
65 }
66
67 #[inline]
68 pub fn get_blip_fill_mut(&mut self) -> Option<&mut BlipFill> {
69 self.blip_fill.as_deref_mut()
70 }
71
72 #[inline]
73 pub fn set_blip_fill(&mut self, value: BlipFill) -> &mut Self {
74 self.blip_fill = Some(Box::new(value));
75 self
76 }
77
78 #[inline]
79 pub fn get_solid_fill(&self) -> Option<&SolidFill> {
80 self.solid_fill.as_deref()
81 }
82
83 #[inline]
84 pub fn get_solid_fill_mut(&mut self) -> Option<&mut SolidFill> {
85 self.solid_fill.as_deref_mut()
86 }
87
88 #[inline]
89 pub fn set_solid_fill(&mut self, value: SolidFill) -> &mut Self {
90 self.solid_fill = Some(Box::new(value));
91 self
92 }
93
94 #[inline]
95 pub fn get_outline(&self) -> Option<&Outline> {
96 self.outline.as_deref()
97 }
98
99 #[inline]
100 pub fn get_outline_mut(&mut self) -> Option<&mut Outline> {
101 self.outline.as_deref_mut()
102 }
103
104 #[inline]
105 pub fn set_outline(&mut self, value: Outline) -> &mut Self {
106 self.outline = Some(Box::new(value));
107 self
108 }
109
110 #[inline]
111 pub fn get_effect_list(&self) -> Option<&EffectList> {
112 self.effect_list.as_deref()
113 }
114
115 #[inline]
116 pub fn get_effect_list_mut(&mut self) -> Option<&mut EffectList> {
117 self.effect_list.as_deref_mut()
118 }
119
120 #[inline]
121 pub fn set_effect_list(&mut self, value: EffectList) -> &mut Self {
122 self.effect_list = Some(Box::new(value));
123 self
124 }
125
126 #[inline]
127 pub fn get_no_fill(&self) -> Option<&NoFill> {
128 self.no_fill.as_ref()
129 }
130
131 #[inline]
132 pub fn get_no_fill_mut(&mut self) -> Option<&mut NoFill> {
133 self.no_fill.as_mut()
134 }
135
136 #[inline]
137 pub fn set_no_fill(&mut self, value: NoFill) -> &mut Self {
138 self.no_fill = Some(value);
139 self
140 }
141
142 #[inline]
143 pub fn get_extension_list(&self) -> Option<&ExtensionList> {
144 self.extension_list.as_ref()
145 }
146
147 #[inline]
148 pub fn get_extension_list_mut(&mut self) -> Option<&mut ExtensionList> {
149 self.extension_list.as_mut()
150 }
151
152 #[inline]
153 pub fn set_extension_list(&mut self, value: ExtensionList) -> &mut Self {
154 self.extension_list = Some(value);
155 self
156 }
157
158 pub(crate) fn set_attributes<R: std::io::BufRead>(
159 &mut self,
160 reader: &mut Reader<R>,
161 _e: &BytesStart,
162 drawing_relationships: Option<&RawRelationships>,
163 ) {
164 xml_read_loop!(
165 reader,
166 Event::Start(ref e) => {
167 match e.name().into_inner() {
168 b"a:xfrm" => {
169 let mut obj = Transform2D::default();
170 obj.set_attributes(reader, e);
171 self.set_transform2d(obj);
172 }
173 b"a:prstGeom" => {
174 self.preset_geometry.set_attributes(reader, e);
175 }
176 b"a:blipFill" => {
177 let mut obj = BlipFill::default();
178 obj.set_attributes(reader, e, drawing_relationships);
179 self.set_blip_fill(obj);
180 }
181 b"a:ln" => {
182 let mut outline = Outline::default();
183 outline.set_attributes(reader, e);
184 self.set_outline(outline);
185 }
186 b"a:solidFill" => {
187 let mut solid_fill = SolidFill::default();
188 solid_fill.set_attributes(reader, e);
189 self.set_solid_fill(solid_fill);
190 }
191 b"a:effectLst" => {
192 let mut effect_list = EffectList::default();
193 effect_list.set_attributes(reader, e, false);
194 self.set_effect_list(effect_list);
195 }
196 b"a:extLst" => {
197 let mut obj = ExtensionList::default();
198 obj.set_attributes(reader, e);
199 self.set_extension_list(obj);
200 }
201 _ => (),
202 }
203 },
204 Event::Empty(ref e) => {
205 if e.name().into_inner() == b"a:noFill" {
206 let mut obj = NoFill::default();
207 obj.set_attributes(reader, e, true);
208 self.set_no_fill(obj);
209 }
210 },
211 Event::End(ref e) => {
212 if e.name().into_inner() == b"xdr:spPr" {
213 return;
214 }
215 },
216 Event::Eof => panic!("Error: Could not find {} end element", "xdr:spPr")
217 );
218 }
219
220 pub(crate) fn write_to(
221 &self,
222 writer: &mut Writer<Cursor<Vec<u8>>>,
223 rel_list: &mut Vec<(String, String)>,
224 ) {
225 write_start_tag(writer, "xdr:spPr", vec![], false);
227
228 if let Some(v) = &self.transform2d {
230 v.write_to(writer);
231 }
232
233 self.preset_geometry.write_to(writer);
235
236 if let Some(v) = &self.blip_fill {
238 v.write_to(writer, rel_list);
239 }
240
241 if let Some(v) = &self.solid_fill {
243 v.write_to(writer);
244 }
245
246 if let Some(v) = &self.no_fill {
248 v.write_to(writer);
249 }
250
251 if let Some(v) = &self.outline {
253 v.write_to(writer);
254 }
255
256 if let Some(v) = &self.effect_list {
258 v.write_to(writer);
259 }
260
261 write_end_tag(writer, "xdr:spPr");
262 }
263}