Skip to main content

umya_spreadsheet/structs/
gradient_fill.rs

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