Skip to main content

umya_spreadsheet/structs/drawing/spreadsheet/
non_visual_picture_drawing_properties.rs

1// xdr:cNvPicPr
2use std::io::Cursor;
3
4use quick_xml::{
5    Reader,
6    Writer,
7    events::{
8        BytesStart,
9        Event,
10    },
11};
12
13use super::super::PictureLocks;
14use crate::{
15    reader::driver::{
16        get_attribute,
17        set_string_from_xml,
18        xml_read_loop,
19    },
20    structs::BooleanValue,
21    writer::driver::{
22        write_end_tag,
23        write_start_tag,
24    },
25};
26
27#[derive(Clone, Default, Debug)]
28pub struct NonVisualPictureDrawingProperties {
29    prefer_relative_resize: BooleanValue,
30    picture_locks:          Option<PictureLocks>,
31}
32
33impl NonVisualPictureDrawingProperties {
34    #[inline]
35    #[must_use]
36    pub fn prefer_relative_resize(&self) -> bool {
37        self.prefer_relative_resize.value()
38    }
39
40    #[inline]
41    #[must_use]
42    #[deprecated(since = "3.0.0", note = "Use prefer_relative_resize()")]
43    pub fn get_prefer_relative_resize(&self) -> bool {
44        self.prefer_relative_resize()
45    }
46
47    #[inline]
48    pub fn set_prefer_relative_resize(&mut self, value: bool) {
49        self.prefer_relative_resize.set_value(value);
50    }
51
52    #[inline]
53    #[must_use]
54    pub fn picture_locks(&self) -> Option<&PictureLocks> {
55        self.picture_locks.as_ref()
56    }
57
58    #[inline]
59    #[must_use]
60    #[deprecated(since = "3.0.0", note = "Use picture_locks()")]
61    pub fn get_picture_locks(&self) -> Option<&PictureLocks> {
62        self.picture_locks()
63    }
64
65    #[inline]
66    pub fn picture_locks_mut(&mut self) -> Option<&mut PictureLocks> {
67        self.picture_locks.as_mut()
68    }
69
70    #[inline]
71    #[deprecated(since = "3.0.0", note = "Use picture_locks_mut()")]
72    pub fn get_picture_locks_mut(&mut self) -> Option<&mut PictureLocks> {
73        self.picture_locks_mut()
74    }
75
76    #[inline]
77    pub fn set_picture_locks(&mut self, value: PictureLocks) {
78        self.picture_locks = Some(value);
79    }
80
81    pub(crate) fn set_attributes<R: std::io::BufRead>(
82        &mut self,
83        reader: &mut Reader<R>,
84        e: &BytesStart,
85        empty_flag: bool,
86    ) {
87        set_string_from_xml!(self, e, prefer_relative_resize, "preferRelativeResize");
88
89        if empty_flag {
90            return;
91        }
92
93        xml_read_loop!(
94            reader,
95            Event::Empty(ref e) => {
96                if e.name().into_inner() == b"a:picLocks" {
97                    let mut obj = PictureLocks::default();
98                    obj.set_attributes(reader, e);
99                    self.set_picture_locks(obj);
100                }
101            },
102            Event::End(ref e) => {
103                if matches!(e.name().into_inner(), b"xdr:cNvPicPr" | b"cNvPicPr") {
104                    return
105                }
106            },
107            Event::Eof => panic!("Error: Could not find {} end element", "cNvPicPr")
108        );
109    }
110
111    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
112        // xdr:cNvPicPr
113        let mut attributes: crate::structs::AttrCollection = Vec::new();
114        if self.prefer_relative_resize.has_value() {
115            attributes.push(
116                (
117                    "preferRelativeResize",
118                    self.prefer_relative_resize.value_string(),
119                )
120                    .into(),
121            );
122        }
123
124        match &self.picture_locks {
125            Some(v) => {
126                write_start_tag(writer, "xdr:cNvPicPr", attributes, false);
127                v.write_to(writer);
128                write_end_tag(writer, "xdr:cNvPicPr");
129            }
130            None => {
131                write_start_tag(writer, "xdr:cNvPicPr", attributes, true);
132            }
133        }
134    }
135}