umya_spreadsheet/structs/
gradient_stop.rs1use 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 write_start_tag(
86 writer,
87 "stop",
88 vec![("position", &self.position.get_value_string())],
89 false,
90 );
91
92 self.color.write_to_color(writer);
94
95 write_end_tag(writer, "stop");
96 }
97}