Skip to main content

umya_spreadsheet/structs/drawing/spreadsheet/
picture.rs

1// xdr:pic
2use std::io::Cursor;
3
4use quick_xml::{
5    Reader,
6    Writer,
7    events::{
8        BytesStart,
9        Event,
10    },
11};
12
13use super::{
14    BlipFill,
15    NonVisualPictureProperties,
16    ShapeProperties,
17};
18use crate::{
19    reader::driver::xml_read_loop,
20    structs::raw::RawRelationships,
21    writer::driver::{
22        write_end_tag,
23        write_start_tag,
24    },
25};
26
27#[derive(Clone, Default, Debug)]
28pub struct Picture {
29    non_visual_picture_properties: NonVisualPictureProperties,
30    blip_fill:                     BlipFill,
31    shape_properties:              ShapeProperties,
32}
33
34impl Picture {
35    #[inline]
36    #[must_use]
37    pub fn non_visual_picture_properties(&self) -> &NonVisualPictureProperties {
38        &self.non_visual_picture_properties
39    }
40
41    #[inline]
42    #[must_use]
43    #[deprecated(since = "3.0.0", note = "Use non_visual_picture_properties()")]
44    pub fn get_non_visual_picture_properties(&self) -> &NonVisualPictureProperties {
45        self.non_visual_picture_properties()
46    }
47
48    #[inline]
49    pub fn non_visual_picture_properties_mut(&mut self) -> &mut NonVisualPictureProperties {
50        &mut self.non_visual_picture_properties
51    }
52
53    #[inline]
54    #[deprecated(since = "3.0.0", note = "Use non_visual_picture_properties_mut()")]
55    pub fn get_non_visual_picture_properties_mut(&mut self) -> &mut NonVisualPictureProperties {
56        self.non_visual_picture_properties_mut()
57    }
58
59    #[inline]
60    pub fn set_non_visual_picture_properties(&mut self, value: NonVisualPictureProperties) {
61        self.non_visual_picture_properties = value;
62    }
63
64    #[inline]
65    #[must_use]
66    pub fn blip_fill(&self) -> &BlipFill {
67        &self.blip_fill
68    }
69
70    #[inline]
71    #[must_use]
72    #[deprecated(since = "3.0.0", note = "Use blip_fill()")]
73    pub fn get_blip_fill(&self) -> &BlipFill {
74        self.blip_fill()
75    }
76
77    #[inline]
78    pub fn blip_fill_mut(&mut self) -> &mut BlipFill {
79        &mut self.blip_fill
80    }
81
82    #[inline]
83    #[deprecated(since = "3.0.0", note = "Use blip_fill_mut()")]
84    pub fn get_blip_fill_mut(&mut self) -> &mut BlipFill {
85        self.blip_fill_mut()
86    }
87
88    #[inline]
89    pub fn set_blip_fill(&mut self, value: BlipFill) {
90        self.blip_fill = value;
91    }
92
93    #[inline]
94    #[must_use]
95    pub fn shape_properties(&self) -> &ShapeProperties {
96        &self.shape_properties
97    }
98
99    #[inline]
100    #[must_use]
101    #[deprecated(since = "3.0.0", note = "Use shape_properties()")]
102    pub fn get_shape_properties(&self) -> &ShapeProperties {
103        self.shape_properties()
104    }
105
106    #[inline]
107    pub fn shape_properties_mut(&mut self) -> &mut ShapeProperties {
108        &mut self.shape_properties
109    }
110
111    #[inline]
112    #[deprecated(since = "3.0.0", note = "Use shape_properties_mut()")]
113    pub fn get_shape_properties_mut(&mut self) -> &mut ShapeProperties {
114        self.shape_properties_mut()
115    }
116
117    #[inline]
118    pub fn set_shape_properties(&mut self, value: ShapeProperties) {
119        self.shape_properties = value;
120    }
121
122    pub(crate) fn set_attributes<R: std::io::BufRead>(
123        &mut self,
124        reader: &mut Reader<R>,
125        _e: &BytesStart,
126        drawing_relationships: Option<&RawRelationships>,
127    ) {
128        xml_read_loop!(
129            reader,
130            Event::Start(ref e) => {
131                match e.name().into_inner() {
132                    b"xdr:nvPicPr" | b"nvPicPr" => {
133                        self.non_visual_picture_properties.set_attributes(reader, e);
134                    }
135                    b"xdr:blipFill" | b"blipFill" => {
136                        self.blip_fill
137                            .set_attributes(reader, e, drawing_relationships);
138                        }
139                    b"xdr:spPr" | b"spPr" => {
140                        self.shape_properties.set_attributes(reader, e, drawing_relationships);
141                    }
142                    _ => (),
143                }
144            },
145            Event::End(ref e) => {
146                if matches!(e.name().into_inner(), b"xdr:pic" | b"pic") {
147                    return;
148                }
149            },
150            Event::Eof => panic!("Error: Could not find {} end element", "pic")
151        );
152    }
153
154    pub(crate) fn write_to(
155        &self,
156        writer: &mut Writer<Cursor<Vec<u8>>>,
157        rel_list: &mut Vec<(String, String)>,
158    ) {
159        // xdr:pic
160        write_start_tag(writer, "xdr:pic", vec![], false);
161
162        // xdr:nvPicPr
163        self.non_visual_picture_properties.write_to(writer);
164
165        // xdr:blipFill
166        self.blip_fill.write_to(writer, rel_list);
167
168        // xdr:spPr
169        self.shape_properties.write_to(writer, rel_list);
170
171        write_end_tag(writer, "xdr:pic");
172    }
173}