umya_spreadsheet/structs/drawing/
transform2d.rs1use crate::reader::driver::*;
3use crate::structs::drawing::Point2DType;
4use crate::structs::drawing::PositiveSize2DType;
5use crate::writer::driver::*;
6use crate::StringValue;
7use quick_xml::events::{BytesStart, Event};
8use quick_xml::Reader;
9use quick_xml::Writer;
10use std::io::Cursor;
11
12#[derive(Clone, Default, Debug)]
13pub struct Transform2D {
14 offset: Point2DType,
15 extents: PositiveSize2DType,
16 child_offset: Option<Box<Point2DType>>,
17 child_extents: Option<Box<PositiveSize2DType>>,
18 rot: StringValue,
19 flip_v: StringValue,
20 flip_h: StringValue,
21}
22
23impl Transform2D {
24 #[inline]
25 pub fn get_offset(&self) -> &Point2DType {
26 &self.offset
27 }
28
29 #[inline]
30 pub fn get_offset_mut(&mut self) -> &mut Point2DType {
31 &mut self.offset
32 }
33
34 #[inline]
35 pub fn set_offset(&mut self, value: Point2DType) {
36 self.offset = value;
37 }
38
39 #[inline]
40 pub fn get_extents(&self) -> &PositiveSize2DType {
41 &self.extents
42 }
43
44 #[inline]
45 pub fn get_extents_mut(&mut self) -> &mut PositiveSize2DType {
46 &mut self.extents
47 }
48
49 #[inline]
50 pub fn set_extents(&mut self, value: PositiveSize2DType) {
51 self.extents = value;
52 }
53
54 #[inline]
55 pub fn get_child_offset(&self) -> Option<&Point2DType> {
56 self.child_offset.as_deref()
57 }
58
59 #[inline]
60 pub fn get_child_offset_mut(&mut self) -> Option<&mut Point2DType> {
61 self.child_offset.as_deref_mut()
62 }
63
64 #[inline]
65 pub fn set_child_offset(&mut self, value: Point2DType) {
66 self.child_offset = Some(Box::new(value));
67 }
68
69 #[inline]
70 pub fn get_child_extents(&self) -> Option<&PositiveSize2DType> {
71 self.child_extents.as_deref()
72 }
73
74 #[inline]
75 pub fn get_child_extents_mut(&mut self) -> Option<&mut PositiveSize2DType> {
76 self.child_extents.as_deref_mut()
77 }
78
79 #[inline]
80 pub fn set_child_extents(&mut self, value: PositiveSize2DType) {
81 self.child_extents = Some(Box::new(value));
82 }
83
84 #[inline]
85 pub fn get_rot(&self) -> Option<&str> {
86 self.rot.get_value()
87 }
88
89 #[inline]
90 pub fn set_rot<S: Into<String>>(&mut self, value: S) {
91 self.rot.set_value(value);
92 }
93
94 #[inline]
95 pub fn get_flip_v(&self) -> Option<&str> {
96 self.flip_v.get_value()
97 }
98
99 #[inline]
100 pub fn set_flip_v<S: Into<String>>(&mut self, value: S) {
101 self.flip_v.set_value(value);
102 }
103
104 #[inline]
105 pub fn get_flip_h(&self) -> Option<&str> {
106 self.flip_h.get_value()
107 }
108
109 #[inline]
110 pub fn set_flip_h<S: Into<String>>(&mut self, value: S) {
111 self.flip_h.set_value(value);
112 }
113
114 pub(crate) fn set_attributes<R: std::io::BufRead>(
115 &mut self,
116 reader: &mut Reader<R>,
117 e: &BytesStart,
118 ) {
119 if let Some(v) = get_attribute(e, b"rot") {
120 self.set_rot(v);
121 }
122
123 if let Some(v) = get_attribute(e, b"flipH") {
124 self.set_flip_h(v);
125 }
126
127 if let Some(v) = get_attribute(e, b"flipV") {
128 self.set_flip_v(v);
129 }
130
131 xml_read_loop!(
132 reader,
133 Event::Empty(ref e) => {
134 match e.name().into_inner() {
135 b"a:off" => {
136 self.offset.set_attributes(reader, e);
137 }
138 b"a:ext" => {
139 self.extents.set_attributes(reader, e);
140 }
141 b"a:chOff" => {
142 let mut obj = Point2DType::default();
143 obj.set_attributes(reader, e);
144 self.set_child_offset(obj);
145 }
146 b"a:chExt" => {
147 let mut obj = PositiveSize2DType::default();
148 obj.set_attributes(reader, e);
149 self.set_child_extents(obj);
150 }
151 _ => (),
152 }
153 },
154 Event::End(ref e) => {
155 if e.name().into_inner() == b"a:xfrm" {
156 return;
157 }
158 },
159 Event::Eof => panic!("Error: Could not find {} end element", "a:xfrm")
160 );
161 }
162
163 pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
164 let mut attributes: Vec<(&str, &str)> = Vec::new();
166 if let Some(v) = self.rot.get_value() {
167 attributes.push(("rot", v))
168 }
169 if let Some(v) = self.flip_h.get_value() {
170 attributes.push(("flipH", v))
171 }
172 if let Some(v) = self.flip_v.get_value() {
173 attributes.push(("flipV", v))
174 }
175 write_start_tag(writer, "a:xfrm", attributes, false);
176
177 self.offset.write_to_off(writer);
179
180 self.extents.write_to_ext(writer);
182
183 match &self.child_offset {
185 Some(v) => {
186 v.write_to_ch_off(writer);
187 }
188 None => {}
189 }
190
191 match &self.child_extents {
193 Some(v) => {
194 v.write_to_ch_ext(writer);
195 }
196 None => {}
197 }
198
199 write_end_tag(writer, "a:xfrm");
200 }
201}