umya_spreadsheet/structs/
fill.rs1use super::GradientFill;
2use super::PatternFill;
3use super::PatternValues;
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 Fill {
14 pattern_fill: Option<Box<PatternFill>>,
15 gradient_fill: Option<Box<GradientFill>>,
16}
17
18impl Fill {
19 #[inline]
20 pub fn get_pattern_fill(&self) -> Option<&PatternFill> {
21 self.pattern_fill.as_deref()
22 }
23
24 #[inline]
25 pub fn get_pattern_fill_mut(&mut self) -> &mut PatternFill {
26 if self.pattern_fill.is_some() {
27 return self.pattern_fill.as_mut().unwrap();
28 }
29 self.set_pattern_fill(PatternFill::default());
30 self.pattern_fill.as_mut().unwrap()
31 }
32
33 #[inline]
34 pub fn set_pattern_fill(&mut self, value: PatternFill) -> &mut Self {
35 self.pattern_fill = Some(Box::new(value));
36 self.gradient_fill = None;
37 self
38 }
39
40 #[inline]
41 pub fn get_gradient_fill(&self) -> Option<&GradientFill> {
42 self.gradient_fill.as_deref()
43 }
44
45 #[inline]
46 pub fn get_gradient_fill_mut(&mut self) -> &mut GradientFill {
47 if self.gradient_fill.is_some() {
48 return self.gradient_fill.as_mut().unwrap();
49 }
50 self.set_gradient_fill(GradientFill::default());
51 self.gradient_fill.as_mut().unwrap()
52 }
53
54 #[inline]
55 pub fn set_gradient_fill(&mut self, value: GradientFill) -> &mut Self {
56 self.pattern_fill = None;
57 self.gradient_fill = Some(Box::new(value));
58 self
59 }
60
61 #[inline]
62 pub(crate) fn get_default_value() -> Self {
63 let mut def = Self::default();
64 let mut pfill = PatternFill::default();
65 pfill.set_pattern_type(PatternValues::None);
66 def.set_pattern_fill(pfill);
67 def
68 }
69
70 #[inline]
71 pub(crate) fn get_default_value_2() -> Self {
72 let mut def = Self::default();
73 let mut pfill = PatternFill::default();
74 pfill.set_pattern_type(PatternValues::Gray125);
75 def.set_pattern_fill(pfill);
76 def
77 }
78
79 pub(crate) fn get_hash_code(&self) -> String {
80 format!(
81 "{:x}",
82 md5::Md5::digest(format!(
83 "{}{}",
84 match &self.pattern_fill {
85 Some(v) => {
86 v.get_hash_code()
87 }
88 None => {
89 "NONE".to_string()
90 }
91 },
92 match &self.gradient_fill {
93 Some(v) => {
94 v.get_hash_code()
95 }
96 None => {
97 "NONE".to_string()
98 }
99 },
100 ))
101 )
102 }
103
104 #[inline]
106 pub(crate) fn is_visually_empty(&self) -> bool {
107 !(self
108 .pattern_fill
109 .as_ref()
110 .is_some_and(|x| !x.is_visually_empty())
111 || self.gradient_fill.as_ref().is_some())
112 }
113
114 pub(crate) fn set_attributes<R: std::io::BufRead>(
115 &mut self,
116 reader: &mut Reader<R>,
117 _e: &BytesStart,
118 ) {
119 xml_read_loop!(
120 reader,
121 Event::Empty(ref e) => {
122 if e.name().into_inner() == b"patternFill" {
123 let mut obj = PatternFill::default();
124 obj.set_attributes(reader, e, true);
125 self.set_pattern_fill(obj);
126 }
127 },
128 Event::Start(ref e) => {
129 match e.name().into_inner() {
130 b"patternFill" => {
131 let mut obj = PatternFill::default();
132 obj.set_attributes(reader, e, false);
133 self.set_pattern_fill(obj);
134 }
135 b"gradientFill" => {
136 let mut obj = GradientFill::default();
137 obj.set_attributes(reader, e);
138 self.set_gradient_fill(obj);
139 }
140 _ => (),
141 }
142 },
143 Event::End(ref e) => {
144 if e.name().into_inner() == b"fill" {
145 return
146 }
147 },
148 Event::Eof => panic!("Error: Could not find {} end element", "fill")
149 );
150 }
151
152 pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
153 write_start_tag(writer, "fill", vec![], false);
155
156 if let Some(v) = &self.pattern_fill {
158 v.write_to(writer);
159 }
160
161 if let Some(v) = &self.gradient_fill {
163 v.write_to(writer);
164 }
165
166 write_end_tag(writer, "fill");
167 }
168}