umya_spreadsheet/structs/
gradient_stop.rs

1// stop
2use super::Color;
3use super::DoubleValue;
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::io::Cursor;
11
12#[derive(Default, Debug, Clone, PartialEq, PartialOrd)]
13pub struct GradientStop {
14    position: DoubleValue,
15    color: Color,
16}
17
18impl GradientStop {
19    #[inline]
20    pub fn get_position(&self) -> &f64 {
21        self.position.get_value()
22    }
23
24    #[inline]
25    pub fn set_position(&mut self, value: f64) -> &mut Self {
26        self.position.set_value(value);
27        self
28    }
29
30    #[inline]
31    pub fn get_color(&self) -> &Color {
32        &self.color
33    }
34
35    #[inline]
36    pub fn get_color_mut(&mut self) -> &mut Color {
37        &mut self.color
38    }
39
40    #[inline]
41    pub fn set_color(&mut self, value: Color) -> &mut Self {
42        self.color = value;
43        self
44    }
45
46    #[inline]
47    pub(crate) fn get_hash_code(&self) -> String {
48        format!(
49            "{:x}",
50            md5::Md5::digest(format!(
51                "{}{}",
52                &self.position.get_value_string(),
53                &self.color.get_hash_code(),
54            ))
55        )
56    }
57
58    pub(crate) fn set_attributes<R: std::io::BufRead>(
59        &mut self,
60        reader: &mut Reader<R>,
61        e: &BytesStart,
62    ) {
63        set_string_from_xml!(self, e, position, "position");
64
65        xml_read_loop!(
66            reader,
67            Event::Empty(ref e) => {
68                if e.name().into_inner() == b"color" {
69                    let mut obj = Color::default();
70                    obj.set_attributes(reader, e, true);
71                    self.set_color(obj);
72                }
73            },
74            Event::End(ref e) => {
75                if e.name().into_inner() == b"stop" {
76                    return
77                }
78            },
79            Event::Eof => panic!("Error: Could not find {} end element", "stop")
80        );
81    }
82
83    pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
84        // stop
85        write_start_tag(
86            writer,
87            "stop",
88            vec![("position", &self.position.get_value_string())],
89            false,
90        );
91
92        // color
93        self.color.write_to_color(writer);
94
95        write_end_tag(writer, "stop");
96    }
97}