umya_spreadsheet/structs/
gradient_fill.rs1use 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 write_start_tag(
133 writer,
134 "gradientFill",
135 vec![("degree", &self.degree.value_string()).into()],
136 false,
137 );
138
139 for stop in &self.gradient_stop {
141 stop.write_to(writer);
142 }
143
144 write_end_tag(writer, "gradientFill");
145 }
146}