umya_spreadsheet/structs/drawing/spreadsheet/
picture.rs

1// xdr:pic
2use super::BlipFill;
3use super::NonVisualPictureProperties;
4use super::ShapeProperties;
5use crate::reader::driver::*;
6use crate::structs::raw::RawRelationships;
7use crate::writer::driver::*;
8use quick_xml::events::{BytesStart, Event};
9use quick_xml::Reader;
10use quick_xml::Writer;
11use std::io::Cursor;
12
13#[derive(Clone, Default, Debug)]
14pub struct Picture {
15    non_visual_picture_properties: NonVisualPictureProperties,
16    blip_fill: BlipFill,
17    shape_properties: ShapeProperties,
18}
19
20impl Picture {
21    #[inline]
22    pub fn get_non_visual_picture_properties(&self) -> &NonVisualPictureProperties {
23        &self.non_visual_picture_properties
24    }
25
26    #[inline]
27    pub fn get_non_visual_picture_properties_mut(&mut self) -> &mut NonVisualPictureProperties {
28        &mut self.non_visual_picture_properties
29    }
30
31    #[inline]
32    pub fn set_non_visual_picture_properties(&mut self, value: NonVisualPictureProperties) {
33        self.non_visual_picture_properties = value;
34    }
35
36    #[inline]
37    pub fn get_blip_fill(&self) -> &BlipFill {
38        &self.blip_fill
39    }
40
41    #[inline]
42    pub fn get_blip_fill_mut(&mut self) -> &mut BlipFill {
43        &mut self.blip_fill
44    }
45
46    #[inline]
47    pub fn set_blip_fill(&mut self, value: BlipFill) {
48        self.blip_fill = value;
49    }
50
51    #[inline]
52    pub fn get_shape_properties(&self) -> &ShapeProperties {
53        &self.shape_properties
54    }
55
56    #[inline]
57    pub fn get_shape_properties_mut(&mut self) -> &mut ShapeProperties {
58        &mut self.shape_properties
59    }
60
61    #[inline]
62    pub fn set_shape_properties(&mut self, value: ShapeProperties) {
63        self.shape_properties = value;
64    }
65
66    pub(crate) fn set_attributes<R: std::io::BufRead>(
67        &mut self,
68        reader: &mut Reader<R>,
69        _e: &BytesStart,
70        drawing_relationships: Option<&RawRelationships>,
71    ) {
72        xml_read_loop!(
73            reader,
74            Event::Start(ref e) => {
75                match e.name().into_inner() {
76                    b"xdr:nvPicPr" => {
77                        self.non_visual_picture_properties.set_attributes(reader, e);
78                    }
79                    b"xdr:blipFill" => {
80                        self.blip_fill
81                            .set_attributes(reader, e, drawing_relationships);
82                        }
83                    b"xdr:spPr" => {
84                        self.shape_properties.set_attributes(reader, e, drawing_relationships);
85                    }
86                    _ => (),
87                }
88            },
89            Event::End(ref e) => {
90                if e.name().into_inner() == b"xdr:pic" {
91                    return;
92                }
93            },
94            Event::Eof => panic!("Error: Could not find {} end element", "xdr:pic")
95        );
96    }
97
98    pub(crate) fn write_to(
99        &self,
100        writer: &mut Writer<Cursor<Vec<u8>>>,
101        rel_list: &mut Vec<(String, String)>,
102    ) {
103        // xdr:pic
104        write_start_tag(writer, "xdr:pic", vec![], false);
105
106        // xdr:nvPicPr
107        self.non_visual_picture_properties.write_to(writer);
108
109        // xdr:blipFill
110        self.blip_fill.write_to(writer, rel_list);
111
112        // xdr:spPr
113        self.shape_properties.write_to(writer, rel_list);
114
115        write_end_tag(writer, "xdr:pic");
116    }
117}