Skip to main content

umya_spreadsheet/structs/drawing/
effect_list.rs

1// a:effectLst
2use std::io::Cursor;
3
4use quick_xml::{
5    Reader,
6    Writer,
7    events::{
8        BytesStart,
9        Event,
10    },
11};
12
13use super::{
14    Glow,
15    OuterShadow,
16    SoftEdge,
17};
18use crate::{
19    reader::driver::xml_read_loop,
20    writer::driver::{
21        write_end_tag,
22        write_start_tag,
23    },
24};
25
26#[derive(Clone, Default, Debug)]
27pub struct EffectList {
28    glow:         Option<Box<Glow>>,
29    outer_shadow: Option<Box<OuterShadow>>,
30    soft_edge:    Option<Box<SoftEdge>>,
31}
32
33impl EffectList {
34    #[inline]
35    #[must_use]
36    pub fn glow(&self) -> Option<&Glow> {
37        self.glow.as_deref()
38    }
39
40    #[inline]
41    #[must_use]
42    #[deprecated(since = "3.0.0", note = "Use glow()")]
43    pub fn get_glow(&self) -> Option<&Glow> {
44        self.glow()
45    }
46
47    #[inline]
48    pub fn glow_mut(&mut self) -> Option<&mut Glow> {
49        self.glow.as_deref_mut()
50    }
51
52    #[inline]
53    #[deprecated(since = "3.0.0", note = "Use glow_mut()")]
54    pub fn get_glow_mut(&mut self) -> Option<&mut Glow> {
55        self.glow_mut()
56    }
57
58    #[inline]
59    pub fn set_glow(&mut self, value: Glow) {
60        self.glow = Some(Box::new(value));
61    }
62
63    #[inline]
64    #[must_use]
65    pub fn outer_shadow(&self) -> Option<&OuterShadow> {
66        self.outer_shadow.as_deref()
67    }
68
69    #[inline]
70    #[must_use]
71    #[deprecated(since = "3.0.0", note = "Use outer_shadow()")]
72    pub fn get_outer_shadow(&self) -> Option<&OuterShadow> {
73        self.outer_shadow()
74    }
75
76    #[inline]
77    pub fn outer_shadow_mut(&mut self) -> Option<&mut OuterShadow> {
78        self.outer_shadow.as_deref_mut()
79    }
80
81    #[inline]
82    #[deprecated(since = "3.0.0", note = "Use outer_shadow_mut()")]
83    pub fn get_outer_shadow_mut(&mut self) -> Option<&mut OuterShadow> {
84        self.outer_shadow_mut()
85    }
86
87    #[inline]
88    pub fn set_outer_shadow(&mut self, value: OuterShadow) {
89        self.outer_shadow = Some(Box::new(value));
90    }
91
92    #[inline]
93    #[must_use]
94    pub fn soft_edge(&self) -> Option<&SoftEdge> {
95        self.soft_edge.as_deref()
96    }
97
98    #[inline]
99    #[must_use]
100    #[deprecated(since = "3.0.0", note = "Use soft_edge()")]
101    pub fn get_soft_edge(&self) -> Option<&SoftEdge> {
102        self.soft_edge()
103    }
104
105    #[inline]
106    pub fn soft_edge_mut(&mut self) -> Option<&mut SoftEdge> {
107        self.soft_edge.as_deref_mut()
108    }
109
110    #[inline]
111    #[deprecated(since = "3.0.0", note = "Use soft_edge_mut()")]
112    pub fn get_soft_edge_mut(&mut self) -> Option<&mut SoftEdge> {
113        self.soft_edge_mut()
114    }
115
116    #[inline]
117    pub fn set_soft_edge(&mut self, value: SoftEdge) {
118        self.soft_edge = Some(Box::new(value));
119    }
120
121    pub(crate) fn set_attributes<R: std::io::BufRead>(
122        &mut self,
123        reader: &mut Reader<R>,
124        _e: &BytesStart,
125        empty_flag: bool,
126    ) {
127        if empty_flag {
128            return;
129        }
130
131        xml_read_loop!(
132            reader,
133            Event::Empty(ref e) => {
134                if e.name().into_inner() == b"a:softEdge" {
135                    let mut obj = SoftEdge::default();
136                    obj.set_attributes(reader, e);
137                    self.set_soft_edge(obj);
138                }
139            },
140            Event::Start(ref e) => {
141                match e.name().into_inner() {
142                    b"a:glow" => {
143                        let mut obj = Glow::default();
144                        obj.set_attributes(reader, e);
145                        self.set_glow(obj);
146                    }
147                    b"a:outerShdw" => {
148                        let mut obj = OuterShadow::default();
149                        obj.set_attributes(reader, e);
150                        self.set_outer_shadow(obj);
151                    }
152                    _ => (),
153                }
154            },
155            Event::End(ref e) => {
156                if e.name().into_inner() == b"a:effectLst" {
157                    return;
158                }
159            },
160            Event::Eof => panic!("Error: Could not find {} end element", "a:effectLst")
161        );
162    }
163
164    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
165        let empty_flag =
166            self.glow.is_none() && self.outer_shadow.is_none() && self.soft_edge.is_none();
167
168        // a:effectLst
169        write_start_tag(writer, "a:effectLst", vec![], empty_flag);
170
171        if !empty_flag {
172            // a:glow
173            if let Some(v) = &self.glow {
174                v.write_to(writer);
175            }
176
177            // a:outerShdow
178            if let Some(v) = &self.outer_shadow {
179                v.write_to(writer);
180            }
181
182            // a:softEdge
183            if let Some(v) = &self.soft_edge {
184                v.write_to(writer);
185            }
186
187            write_end_tag(writer, "a:effectLst");
188        }
189    }
190}