umya_spreadsheet/structs/
gradient_fill.rs1use 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 write_start_tag(
87 writer,
88 "gradientFill",
89 vec![("degree", &self.degree.get_value_string())],
90 false,
91 );
92
93 for stop in &self.gradient_stop {
95 stop.write_to(writer);
96 }
97
98 write_end_tag(writer, "gradientFill");
99 }
100}