Skip to main content

umya_spreadsheet/structs/
gradient_fill.rs

1// gradientFill
2use std::{
3    fmt::Write,
4    io::Cursor,
5};
6
7use md5::Digest;
8use quick_xml::{
9    Reader,
10    Writer,
11    events::{
12        BytesStart,
13        Event,
14    },
15};
16
17use super::{
18    DoubleValue,
19    GradientStop,
20};
21use crate::{
22    reader::driver::{
23        get_attribute,
24        set_string_from_xml,
25        xml_read_loop,
26    },
27    writer::driver::{
28        write_end_tag,
29        write_start_tag,
30    },
31};
32
33#[derive(Default, Debug, Clone, PartialEq, PartialOrd)]
34pub struct GradientFill {
35    degree:        DoubleValue,
36    gradient_stop: Vec<GradientStop>,
37}
38
39impl GradientFill {
40    #[inline]
41    #[must_use]
42    pub fn degree(&self) -> f64 {
43        self.degree.value()
44    }
45
46    #[inline]
47    #[must_use]
48    #[deprecated(since = "3.0.0", note = "Use degree()")]
49    pub fn get_degree(&self) -> f64 {
50        self.degree()
51    }
52
53    #[inline]
54    pub fn set_degree(&mut self, value: f64) -> &mut Self {
55        self.degree.set_value(value);
56        self
57    }
58
59    #[inline]
60    #[must_use]
61    pub fn gradient_stop(&self) -> &[GradientStop] {
62        &self.gradient_stop
63    }
64
65    #[inline]
66    #[must_use]
67    #[deprecated(since = "3.0.0", note = "Use gradient_stop()")]
68    pub fn get_gradient_stop(&self) -> &[GradientStop] {
69        self.gradient_stop()
70    }
71
72    #[inline]
73    pub fn gradient_stop_mut(&mut self) -> &mut Vec<GradientStop> {
74        &mut self.gradient_stop
75    }
76
77    #[inline]
78    #[deprecated(since = "3.0.0", note = "Use gradient_stop_mut()")]
79    pub fn get_gradient_stop_mut(&mut self) -> &mut Vec<GradientStop> {
80        self.gradient_stop_mut()
81    }
82
83    #[inline]
84    pub fn set_gradient_stop(&mut self, value: GradientStop) -> &mut Self {
85        self.gradient_stop.push(value);
86        self
87    }
88
89    pub(crate) fn hash_code(&self) -> String {
90        let mut value = String::new();
91        for stop in &self.gradient_stop {
92            write!(value, "{}", stop.hash_code()).unwrap();
93        }
94        format!(
95            "{:x}",
96            md5::Md5::digest(format!("{}{}", self.degree.value_string(), value))
97        )
98    }
99
100    #[deprecated(since = "3.0.0", note = "Use hash_code()")]
101    pub(crate) fn get_hash_code(&self) -> String {
102        self.hash_code()
103    }
104
105    pub(crate) fn set_attributes<R: std::io::BufRead>(
106        &mut self,
107        reader: &mut Reader<R>,
108        e: &BytesStart,
109    ) {
110        set_string_from_xml!(self, e, degree, "degree");
111
112        xml_read_loop!(
113            reader,
114            Event::Start(ref e) => {
115                if e.name().into_inner() == b"stop" {
116                    let mut obj = GradientStop::default();
117                    obj.set_attributes(reader, e);
118                    self.set_gradient_stop(obj);
119                }
120            },
121            Event::End(ref e) => {
122                if e.name().into_inner() == b"gradientFill" {
123                    return
124                }
125            },
126            Event::Eof => panic!("Error: Could not find {} end element", "gradientFill")
127        );
128    }
129
130    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
131        // gradientFill
132        write_start_tag(
133            writer,
134            "gradientFill",
135            vec![("degree", &self.degree.value_string()).into()],
136            false,
137        );
138
139        // stop
140        for stop in &self.gradient_stop {
141            stop.write_to(writer);
142        }
143
144        write_end_tag(writer, "gradientFill");
145    }
146}