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