umya_spreadsheet/structs/drawing/
effect_list.rs

1// a:effectLst
2use super::Glow;
3use super::OuterShadow;
4use super::SoftEdge;
5use crate::reader::driver::*;
6use crate::writer::driver::*;
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 EffectList {
14    glow: Option<Box<Glow>>,
15    outer_shadow: Option<Box<OuterShadow>>,
16    soft_edge: Option<Box<SoftEdge>>,
17}
18
19impl EffectList {
20    #[inline]
21    pub fn get_glow(&self) -> Option<&Glow> {
22        self.glow.as_deref()
23    }
24
25    #[inline]
26    pub fn get_glow_mut(&mut self) -> Option<&mut Glow> {
27        self.glow.as_deref_mut()
28    }
29
30    #[inline]
31    pub fn set_glow(&mut self, value: Glow) {
32        self.glow = Some(Box::new(value));
33    }
34
35    #[inline]
36    pub fn get_outer_shadow(&self) -> Option<&OuterShadow> {
37        self.outer_shadow.as_deref()
38    }
39
40    #[inline]
41    pub fn get_outer_shadow_mut(&mut self) -> Option<&mut OuterShadow> {
42        self.outer_shadow.as_deref_mut()
43    }
44
45    #[inline]
46    pub fn set_outer_shadow(&mut self, value: OuterShadow) {
47        self.outer_shadow = Some(Box::new(value));
48    }
49
50    #[inline]
51    pub fn get_soft_edge(&self) -> Option<&SoftEdge> {
52        self.soft_edge.as_deref()
53    }
54
55    #[inline]
56    pub fn get_soft_edge_mut(&mut self) -> Option<&mut SoftEdge> {
57        self.soft_edge.as_deref_mut()
58    }
59
60    #[inline]
61    pub fn set_soft_edge(&mut self, value: SoftEdge) {
62        self.soft_edge = Some(Box::new(value));
63    }
64
65    pub(crate) fn set_attributes<R: std::io::BufRead>(
66        &mut self,
67        reader: &mut Reader<R>,
68        _e: &BytesStart,
69        empty_flag: bool,
70    ) {
71        if empty_flag {
72            return;
73        }
74
75        xml_read_loop!(
76            reader,
77            Event::Empty(ref e) => {
78                if e.name().into_inner() == b"a:softEdge" {
79                    let mut obj = SoftEdge::default();
80                    obj.set_attributes(reader, e);
81                    self.set_soft_edge(obj);
82                }
83            },
84            Event::Start(ref e) => {
85                match e.name().into_inner() {
86                    b"a:glow" => {
87                        let mut obj = Glow::default();
88                        obj.set_attributes(reader, e);
89                        self.set_glow(obj);
90                    }
91                    b"a:outerShdw" => {
92                        let mut obj = OuterShadow::default();
93                        obj.set_attributes(reader, e);
94                        self.set_outer_shadow(obj);
95                    }
96                    _ => (),
97                }
98            },
99            Event::End(ref e) => {
100                if e.name().into_inner() == b"a:effectLst" {
101                    return;
102                }
103            },
104            Event::Eof => panic!("Error: Could not find {} end element", "a:effectLst")
105        );
106    }
107
108    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
109        let empty_flag =
110            self.glow.is_none() && self.outer_shadow.is_none() && self.soft_edge.is_none();
111
112        // a:effectLst
113        write_start_tag(writer, "a:effectLst", vec![], empty_flag);
114
115        if !empty_flag {
116            // a:glow
117            if let Some(v) = &self.glow {
118                v.write_to(writer);
119            }
120
121            // a:outerShdow
122            if let Some(v) = &self.outer_shadow {
123                v.write_to(writer);
124            }
125
126            // a:softEdge
127            if let Some(v) = &self.soft_edge {
128                v.write_to(writer);
129            }
130
131            write_end_tag(writer, "a:effectLst");
132        }
133    }
134}