umya_spreadsheet/structs/drawing/
solid_fill.rs

1// a:solidFill
2use super::rgb_color_model_hex::RgbColorModelHex;
3use super::scheme_color::SchemeColor;
4use super::SystemColor;
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 SolidFill {
14    scheme_color: Option<Box<SchemeColor>>,
15    rgb_color_model_hex: Option<Box<RgbColorModelHex>>,
16    system_color: Option<Box<SystemColor>>,
17}
18
19impl SolidFill {
20    #[inline]
21    pub fn get_scheme_color(&self) -> Option<&SchemeColor> {
22        self.scheme_color.as_deref()
23    }
24
25    #[inline]
26    pub fn get_scheme_color_mut(&mut self) -> Option<&mut SchemeColor> {
27        self.scheme_color.as_deref_mut()
28    }
29
30    #[inline]
31    pub fn set_scheme_color(&mut self, value: SchemeColor) {
32        self.scheme_color = Some(Box::new(value));
33    }
34
35    #[inline]
36    pub fn get_rgb_color_model_hex(&self) -> Option<&RgbColorModelHex> {
37        self.rgb_color_model_hex.as_deref()
38    }
39
40    #[inline]
41    pub fn get_rgb_color_model_hex_mut(&mut self) -> Option<&mut RgbColorModelHex> {
42        self.rgb_color_model_hex.as_deref_mut()
43    }
44
45    #[inline]
46    pub fn set_rgb_color_model_hex(&mut self, value: RgbColorModelHex) {
47        self.rgb_color_model_hex = Some(Box::new(value));
48    }
49
50    #[inline]
51    pub fn get_system_color(&self) -> Option<&SystemColor> {
52        self.system_color.as_deref()
53    }
54
55    #[inline]
56    pub fn get_system_color_mut(&mut self) -> Option<&mut SystemColor> {
57        self.system_color.as_deref_mut()
58    }
59
60    #[inline]
61    pub fn set_system_color(&mut self, value: SystemColor) {
62        self.system_color = 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    ) {
70        xml_read_loop!(
71            reader,
72            Event::Start(ref e) => {
73                match e.name().into_inner() {
74                b"a:schemeClr" => {
75                    let mut scheme_color = SchemeColor::default();
76                    scheme_color.set_attributes(reader, e, false);
77                    self.set_scheme_color(scheme_color);
78                }
79                b"a:srgbClr" => {
80                    let mut rgb_color_model_hex = RgbColorModelHex::default();
81                    rgb_color_model_hex.set_attributes(reader, e, false);
82                    self.set_rgb_color_model_hex(rgb_color_model_hex);
83                }
84                b"a:sysClr" => {
85                    let mut obj = SystemColor::default();
86                    obj.set_attributes(reader, e, false);
87                    self.set_system_color(obj);
88                }
89                _ => (),
90                }
91            },
92            Event::Empty(ref e) => {
93                match e.name().into_inner() {
94                b"a:schemeClr" => {
95                    let mut scheme_color = SchemeColor::default();
96                    scheme_color.set_attributes(reader, e, true);
97                    self.set_scheme_color(scheme_color);
98                }
99                b"a:srgbClr" => {
100                    let mut rgb_color_model_hex = RgbColorModelHex::default();
101                    rgb_color_model_hex.set_attributes(reader, e, true);
102                    self.set_rgb_color_model_hex(rgb_color_model_hex);
103                }
104                b"a:sysClr" => {
105                    let mut obj = SystemColor::default();
106                    obj.set_attributes(reader, e, true);
107                    self.set_system_color(obj);
108                }
109                _ => (),
110                }
111            },
112            Event::End(ref e) => {
113                if e.name().into_inner() == b"a:solidFill" {
114                    return;
115                }
116            },
117            Event::Eof => panic!("Error: Could not find {} end element", "a:solidFill")
118        );
119    }
120
121    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
122        // a:solidFill
123        write_start_tag(writer, "a:solidFill", vec![], false);
124        if let Some(color) = &self.scheme_color {
125            color.write_to(writer);
126        }
127
128        // a:srgbClr
129        if let Some(hex) = &self.rgb_color_model_hex {
130            hex.write_to(writer);
131        }
132
133        // a:sysClr
134        if let Some(v) = &self.system_color {
135            v.write_to(writer);
136        }
137
138        write_end_tag(writer, "a:solidFill");
139    }
140}