umya_spreadsheet/structs/
gradient_fill.rs

1// gradientFill
2use super::DoubleValue;
3use super::GradientStop;
4use crate::reader::driver::*;
5use crate::writer::driver::*;
6use md5::Digest;
7use quick_xml::events::{BytesStart, Event};
8use quick_xml::Reader;
9use quick_xml::Writer;
10use std::fmt::Write;
11use std::io::Cursor;
12use thin_vec::ThinVec;
13
14#[derive(Default, Debug, Clone, PartialEq, PartialOrd)]
15pub struct GradientFill {
16    degree: DoubleValue,
17    gradient_stop: ThinVec<GradientStop>,
18}
19
20impl GradientFill {
21    #[inline]
22    pub fn get_degree(&self) -> &f64 {
23        self.degree.get_value()
24    }
25
26    #[inline]
27    pub fn set_degree(&mut self, value: f64) -> &mut Self {
28        self.degree.set_value(value);
29        self
30    }
31
32    #[inline]
33    pub fn get_gradient_stop(&self) -> &[GradientStop] {
34        &self.gradient_stop
35    }
36
37    #[inline]
38    pub fn get_gradient_stop_mut(&mut self) -> &mut ThinVec<GradientStop> {
39        &mut self.gradient_stop
40    }
41
42    #[inline]
43    pub fn set_gradient_stop(&mut self, value: GradientStop) -> &mut Self {
44        self.gradient_stop.push(value);
45        self
46    }
47
48    pub(crate) fn get_hash_code(&self) -> String {
49        let mut value = String::new();
50        for stop in &self.gradient_stop {
51            write!(value, "{}", stop.get_hash_code()).unwrap();
52        }
53        format!(
54            "{:x}",
55            md5::Md5::digest(format!("{}{}", &self.degree.get_value_string(), value,))
56        )
57    }
58
59    pub(crate) fn set_attributes<R: std::io::BufRead>(
60        &mut self,
61        reader: &mut Reader<R>,
62        e: &BytesStart,
63    ) {
64        set_string_from_xml!(self, e, degree, "degree");
65
66        xml_read_loop!(
67            reader,
68            Event::Start(ref e) => {
69                if e.name().into_inner() == b"stop" {
70                    let mut obj = GradientStop::default();
71                    obj.set_attributes(reader, e);
72                    self.set_gradient_stop(obj);
73                }
74            },
75            Event::End(ref e) => {
76                if e.name().into_inner() == b"gradientFill" {
77                    return
78                }
79            },
80            Event::Eof => panic!("Error: Could not find {} end element", "gradientFill")
81        );
82    }
83
84    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
85        // gradientFill
86        write_start_tag(
87            writer,
88            "gradientFill",
89            vec![("degree", &self.degree.get_value_string())],
90            false,
91        );
92
93        // stop
94        for stop in &self.gradient_stop {
95            stop.write_to(writer);
96        }
97
98        write_end_tag(writer, "gradientFill");
99    }
100}