umya_spreadsheet/structs/drawing/
theme.rs1use super::super::StringValue;
2use super::EffectList;
3use super::EffectStyle;
4use super::GradientFill;
5use super::GradientStop;
6use super::LinearGradientFill;
7use super::Miter;
8use super::OuterShadow;
9use super::Outline;
10use super::PenAlignmentValues;
11use super::PercentageType;
12use super::PositiveFixedPercentageType;
13use super::PresetDash;
14use super::PresetLineDashValues;
15use super::RgbColorModelHex;
16use super::SchemeColor;
17use super::SchemeColorValues;
18use super::SolidFill;
19use super::SystemColor;
20use super::SystemColorValues;
21use super::ThemeElements;
22use crate::helper::const_str::*;
23use crate::reader::driver::*;
24use crate::writer::driver::*;
25use quick_xml::events::{BytesStart, Event};
26use quick_xml::Reader;
27use quick_xml::Writer;
28use std::io::Cursor;
29
30#[derive(Clone, Default, Debug)]
31pub struct Theme {
32 name: StringValue,
33 theme_elements: ThemeElements,
34}
35
36impl Theme {
37 #[inline]
38 pub fn get_name(&self) -> &str {
39 self.name.get_value_str()
40 }
41
42 #[inline]
43 pub fn set_name<S: Into<String>>(&mut self, value: S) -> &mut Self {
44 self.name.set_value(value);
45 self
46 }
47
48 #[inline]
49 pub fn get_theme_elements(&self) -> &ThemeElements {
50 &self.theme_elements
51 }
52
53 #[inline]
54 pub fn get_theme_elements_mut(&mut self) -> &mut ThemeElements {
55 &mut self.theme_elements
56 }
57
58 #[inline]
59 pub fn set_theme_elements(&mut self, value: ThemeElements) -> &mut Self {
60 self.theme_elements = value;
61 self
62 }
63
64 pub(crate) fn get_default_value() -> Theme {
65 let mut def = Theme::default();
66 def.set_name("Office Theme");
67
68 def.get_theme_elements_mut()
70 .get_color_scheme_mut()
71 .set_name("Office");
72
73 let mut dk1 = SystemColor::default();
74 dk1.set_val(SystemColorValues::WindowText);
75 dk1.set_last_color("000000");
76 def.get_theme_elements_mut()
77 .get_color_scheme_mut()
78 .get_dk1_mut()
79 .set_system_color(dk1); let mut lt1 = SystemColor::default();
82 lt1.set_val(SystemColorValues::Window);
83 lt1.set_last_color("FFFFFF");
84 def.get_theme_elements_mut()
85 .get_color_scheme_mut()
86 .get_lt1_mut()
87 .set_system_color(lt1); let mut dk2 = RgbColorModelHex::default();
90 dk2.set_val("44546A");
91 def.get_theme_elements_mut()
92 .get_color_scheme_mut()
93 .get_dk2_mut()
94 .set_rgb_color_model_hex(dk2); let mut lt2 = RgbColorModelHex::default();
97 lt2.set_val("E7E6E6");
98 def.get_theme_elements_mut()
99 .get_color_scheme_mut()
100 .get_lt2_mut()
101 .set_rgb_color_model_hex(lt2); let mut accent1 = RgbColorModelHex::default();
104 accent1.set_val("4472C4");
105 def.get_theme_elements_mut()
106 .get_color_scheme_mut()
107 .get_accent1_mut()
108 .set_rgb_color_model_hex(accent1); let mut accent2 = RgbColorModelHex::default();
111 accent2.set_val("ED7D31");
112 def.get_theme_elements_mut()
113 .get_color_scheme_mut()
114 .get_accent2_mut()
115 .set_rgb_color_model_hex(accent2); let mut accent3 = RgbColorModelHex::default();
118 accent3.set_val("A5A5A5");
119 def.get_theme_elements_mut()
120 .get_color_scheme_mut()
121 .get_accent3_mut()
122 .set_rgb_color_model_hex(accent3); let mut accent4 = RgbColorModelHex::default();
125 accent4.set_val("FFC000");
126 def.get_theme_elements_mut()
127 .get_color_scheme_mut()
128 .get_accent4_mut()
129 .set_rgb_color_model_hex(accent4); let mut accent5 = RgbColorModelHex::default();
132 accent5.set_val("5B9BD5");
133 def.get_theme_elements_mut()
134 .get_color_scheme_mut()
135 .get_accent5_mut()
136 .set_rgb_color_model_hex(accent5); let mut accent6 = RgbColorModelHex::default();
139 accent6.set_val("70AD47");
140 def.get_theme_elements_mut()
141 .get_color_scheme_mut()
142 .get_accent6_mut()
143 .set_rgb_color_model_hex(accent6); let mut hlink = RgbColorModelHex::default();
146 hlink.set_val("0563C1");
147 def.get_theme_elements_mut()
148 .get_color_scheme_mut()
149 .get_hlink_mut()
150 .set_rgb_color_model_hex(hlink); let mut fol_hlink = RgbColorModelHex::default();
153 fol_hlink.set_val("954F72");
154 def.get_theme_elements_mut()
155 .get_color_scheme_mut()
156 .get_fol_hlink_mut()
157 .set_rgb_color_model_hex(fol_hlink); def.get_theme_elements_mut()
161 .get_font_scheme_mut()
162 .set_name("Office");
163
164 def.get_theme_elements_mut()
165 .get_font_scheme_mut()
166 .get_major_font_mut()
167 .set_defalut_value_major();
168
169 def.get_theme_elements_mut()
170 .get_font_scheme_mut()
171 .get_minor_font_mut()
172 .set_defalut_value_minor();
173
174 def.get_theme_elements_mut()
176 .get_format_scheme_mut()
177 .set_name("Office");
178
179 let mut solid_fill = SolidFill::default();
180 let mut scheme_color = SchemeColor::default();
181 scheme_color.set_val(SchemeColorValues::PhColor);
182 solid_fill.set_scheme_color(scheme_color);
183 def.get_theme_elements_mut()
184 .get_format_scheme_mut()
185 .get_fill_style_list_mut()
186 .add_solid_fill(solid_fill);
187
188 let mut gradient_fill = GradientFill::default();
189 gradient_fill.set_rotate_with_shape(true);
190 let mut gradient_stop = GradientStop::default();
192 gradient_stop.set_position(0);
193 let mut scheme_color = SchemeColor::default();
194 scheme_color.set_val(SchemeColorValues::PhColor);
195 let mut lum_mod = PercentageType::default();
196 lum_mod.set_val(110000);
197 scheme_color.set_luminance_modulation(lum_mod);
198 let mut sat_mod = PercentageType::default();
199 sat_mod.set_val(105000);
200 scheme_color.set_saturation_modulation(sat_mod);
201 let mut tint = PositiveFixedPercentageType::default();
202 tint.set_val(67000);
203 scheme_color.set_tint(tint);
204 gradient_stop.set_scheme_color(scheme_color);
205 gradient_fill
206 .get_gradient_stop_list_mut()
207 .add_gradient_stop(gradient_stop);
208 let mut gradient_stop = GradientStop::default();
210 gradient_stop.set_position(50000);
211 let mut scheme_color = SchemeColor::default();
212 scheme_color.set_val(SchemeColorValues::PhColor);
213 let mut lum_mod = PercentageType::default();
214 lum_mod.set_val(105000);
215 scheme_color.set_luminance_modulation(lum_mod);
216 let mut sat_mod = PercentageType::default();
217 sat_mod.set_val(103000);
218 scheme_color.set_saturation_modulation(sat_mod);
219 let mut tint = PositiveFixedPercentageType::default();
220 tint.set_val(73000);
221 scheme_color.set_tint(tint);
222 gradient_stop.set_scheme_color(scheme_color);
223 gradient_fill
224 .get_gradient_stop_list_mut()
225 .add_gradient_stop(gradient_stop);
226 let mut gradient_stop = GradientStop::default();
228 gradient_stop.set_position(100000);
229 let mut scheme_color = SchemeColor::default();
230 scheme_color.set_val(SchemeColorValues::PhColor);
231 let mut lum_mod = PercentageType::default();
232 lum_mod.set_val(105000);
233 scheme_color.set_luminance_modulation(lum_mod);
234 let mut sat_mod = PercentageType::default();
235 sat_mod.set_val(109000);
236 scheme_color.set_saturation_modulation(sat_mod);
237 let mut tint = PositiveFixedPercentageType::default();
238 tint.set_val(81000);
239 scheme_color.set_tint(tint);
240 gradient_stop.set_scheme_color(scheme_color);
241 gradient_fill
242 .get_gradient_stop_list_mut()
243 .add_gradient_stop(gradient_stop);
244 let mut linear_gradient_fill = LinearGradientFill::default();
246 linear_gradient_fill.set_angle(5400000);
247 linear_gradient_fill.set_scaled(false);
248 gradient_fill.set_linear_gradient_fill(linear_gradient_fill);
249 def.get_theme_elements_mut()
251 .get_format_scheme_mut()
252 .get_fill_style_list_mut()
253 .add_gradient_fill_collection(gradient_fill);
254
255 let mut gradient_fill = GradientFill::default();
256 gradient_fill.set_rotate_with_shape(true);
257 let mut gradient_stop = GradientStop::default();
259 gradient_stop.set_position(0);
260 let mut scheme_color = SchemeColor::default();
261 scheme_color.set_val(SchemeColorValues::PhColor);
262 let mut tint = PositiveFixedPercentageType::default();
263 tint.set_val(94000);
264 scheme_color.set_tint(tint);
265 let mut sat_mod = PercentageType::default();
266 sat_mod.set_val(103000);
267 scheme_color.set_saturation_modulation(sat_mod);
268 let mut lum_mod = PercentageType::default();
269 lum_mod.set_val(102000);
270 scheme_color.set_luminance_modulation(lum_mod);
271 gradient_stop.set_scheme_color(scheme_color);
272 gradient_fill
273 .get_gradient_stop_list_mut()
274 .add_gradient_stop(gradient_stop);
275 let mut gradient_stop = GradientStop::default();
277 gradient_stop.set_position(50000);
278 let mut scheme_color = SchemeColor::default();
279 scheme_color.set_val(SchemeColorValues::PhColor);
280 let mut sat_mod = PercentageType::default();
281 sat_mod.set_val(110000);
282 scheme_color.set_saturation_modulation(sat_mod);
283 let mut shade = PositiveFixedPercentageType::default();
284 shade.set_val(100000);
285 scheme_color.set_shade(shade);
286 let mut lum_mod = PercentageType::default();
287 lum_mod.set_val(100000);
288 scheme_color.set_luminance_modulation(lum_mod);
289 gradient_stop.set_scheme_color(scheme_color);
290 gradient_fill
291 .get_gradient_stop_list_mut()
292 .add_gradient_stop(gradient_stop);
293 let mut gradient_stop = GradientStop::default();
295 gradient_stop.set_position(100000);
296 let mut scheme_color = SchemeColor::default();
297 scheme_color.set_val(SchemeColorValues::PhColor);
298 let mut shade = PositiveFixedPercentageType::default();
299 shade.set_val(78000);
300 scheme_color.set_shade(shade);
301 let mut sat_mod = PercentageType::default();
302 sat_mod.set_val(120000);
303 scheme_color.set_saturation_modulation(sat_mod);
304 let mut lum_mod = PercentageType::default();
305 lum_mod.set_val(99000);
306 scheme_color.set_luminance_modulation(lum_mod);
307 gradient_stop.set_scheme_color(scheme_color);
308 gradient_fill
309 .get_gradient_stop_list_mut()
310 .add_gradient_stop(gradient_stop);
311 let mut linear_gradient_fill = LinearGradientFill::default();
313 linear_gradient_fill.set_angle(5400000);
314 linear_gradient_fill.set_scaled(false);
315 gradient_fill.set_linear_gradient_fill(linear_gradient_fill);
316 def.get_theme_elements_mut()
318 .get_format_scheme_mut()
319 .get_fill_style_list_mut()
320 .add_gradient_fill_collection(gradient_fill);
321
322 let mut outline = Outline::default();
323 outline.set_width(6350);
324 outline.set_cap_type("flat");
325 outline.set_compound_line_type("sng");
326 outline.set_alignment(PenAlignmentValues::Center);
327 let mut solid_fill = SolidFill::default();
329 let mut scheme_color = SchemeColor::default();
330 scheme_color.set_val(SchemeColorValues::PhColor);
331 solid_fill.set_scheme_color(scheme_color);
332 outline.set_solid_fill(solid_fill);
333 let mut preset_dash = PresetDash::default();
335 preset_dash.set_val(PresetLineDashValues::Solid);
336 outline.set_preset_dash(preset_dash);
337 let mut miter = Miter::default();
339 miter.set_limit(800000);
340 outline.set_miter(miter);
341 def.get_theme_elements_mut()
343 .get_format_scheme_mut()
344 .get_line_style_list_mut()
345 .add_outline_collection(outline);
346
347 let mut outline = Outline::default();
348 outline.set_width(12700);
349 outline.set_cap_type("flat");
350 outline.set_compound_line_type("sng");
351 outline.set_alignment(PenAlignmentValues::Center);
352 let mut solid_fill = SolidFill::default();
354 let mut scheme_color = SchemeColor::default();
355 scheme_color.set_val(SchemeColorValues::PhColor);
356 solid_fill.set_scheme_color(scheme_color);
357 outline.set_solid_fill(solid_fill);
358 let mut preset_dash = PresetDash::default();
360 preset_dash.set_val(PresetLineDashValues::Solid);
361 outline.set_preset_dash(preset_dash);
362 let mut miter = Miter::default();
364 miter.set_limit(800000);
365 outline.set_miter(miter);
366 def.get_theme_elements_mut()
368 .get_format_scheme_mut()
369 .get_line_style_list_mut()
370 .add_outline_collection(outline);
371
372 let mut outline = Outline::default();
373 outline.set_width(19050);
374 outline.set_cap_type("flat");
375 outline.set_compound_line_type("sng");
376 outline.set_alignment(PenAlignmentValues::Center);
377 let mut solid_fill = SolidFill::default();
379 let mut scheme_color = SchemeColor::default();
380 scheme_color.set_val(SchemeColorValues::PhColor);
381 solid_fill.set_scheme_color(scheme_color);
382 outline.set_solid_fill(solid_fill);
383 let mut preset_dash = PresetDash::default();
385 preset_dash.set_val(PresetLineDashValues::Solid);
386 outline.set_preset_dash(preset_dash);
387 let mut miter = Miter::default();
389 miter.set_limit(800000);
390 outline.set_miter(miter);
391 def.get_theme_elements_mut()
393 .get_format_scheme_mut()
394 .get_line_style_list_mut()
395 .add_outline_collection(outline);
396
397 let mut effect_style = EffectStyle::default();
398 let effect_list = EffectList::default();
399 effect_style.set_effect_list(effect_list);
400 def.get_theme_elements_mut()
401 .get_format_scheme_mut()
402 .get_effect_style_list_mut()
403 .add_effect_style_collection(effect_style);
404
405 let mut effect_style = EffectStyle::default();
406 let effect_list = EffectList::default();
407 effect_style.set_effect_list(effect_list);
408 def.get_theme_elements_mut()
409 .get_format_scheme_mut()
410 .get_effect_style_list_mut()
411 .add_effect_style_collection(effect_style);
412
413 let mut effect_style = EffectStyle::default();
414 let mut effect_list = EffectList::default();
415 let mut outer_shadow = OuterShadow::default();
416 outer_shadow.set_blur_radius("57150");
417 outer_shadow.set_distance("19050");
418 outer_shadow.set_direction("5400000");
419 outer_shadow.set_alignment("ctr");
420 outer_shadow.set_rotate_with_shape("0");
421 let mut srgb_clr = RgbColorModelHex::default();
422 srgb_clr.set_val("000000");
423 let mut alpha = PositiveFixedPercentageType::default();
424 alpha.set_val(63000);
425 srgb_clr.set_alpha(alpha);
426 outer_shadow.set_rgb_color_model_hex(srgb_clr);
427 effect_list.set_outer_shadow(outer_shadow);
428 effect_style.set_effect_list(effect_list);
429 def.get_theme_elements_mut()
430 .get_format_scheme_mut()
431 .get_effect_style_list_mut()
432 .add_effect_style_collection(effect_style);
433
434 let mut solid_fill = SolidFill::default();
435 let mut scheme_color = SchemeColor::default();
436 scheme_color.set_val(SchemeColorValues::PhColor);
437 solid_fill.set_scheme_color(scheme_color);
438 def.get_theme_elements_mut()
439 .get_format_scheme_mut()
440 .get_background_fill_style_list_mut()
441 .add_solid_fill(solid_fill);
442 let mut solid_fill = SolidFill::default();
444 let mut scheme_color = SchemeColor::default();
445 scheme_color.set_val(SchemeColorValues::PhColor);
446 let mut sat_mod = PercentageType::default();
447 sat_mod.set_val(170000);
448 scheme_color.set_saturation_modulation(sat_mod);
449 let mut tint = PositiveFixedPercentageType::default();
450 tint.set_val(95000);
451 scheme_color.set_tint(tint);
452 solid_fill.set_scheme_color(scheme_color);
453 def.get_theme_elements_mut()
454 .get_format_scheme_mut()
455 .get_background_fill_style_list_mut()
456 .add_solid_fill(solid_fill);
457
458 let mut gradient_fill = GradientFill::default();
459 gradient_fill.set_rotate_with_shape(true);
460 let mut gradient_stop = GradientStop::default();
462 gradient_stop.set_position(0);
463 let mut scheme_color = SchemeColor::default();
464 scheme_color.set_val(SchemeColorValues::PhColor);
465 let mut tint = PositiveFixedPercentageType::default();
466 tint.set_val(93000);
467 scheme_color.set_tint(tint);
468 let mut shade = PositiveFixedPercentageType::default();
469 shade.set_val(98000);
470 scheme_color.set_shade(shade);
471 let mut sat_mod = PercentageType::default();
472 sat_mod.set_val(150000);
473 scheme_color.set_saturation_modulation(sat_mod);
474 let mut lum_mod = PercentageType::default();
475 lum_mod.set_val(102000);
476 scheme_color.set_luminance_modulation(lum_mod);
477 gradient_stop.set_scheme_color(scheme_color);
478 gradient_fill
479 .get_gradient_stop_list_mut()
480 .add_gradient_stop(gradient_stop);
481 let mut gradient_stop = GradientStop::default();
483 gradient_stop.set_position(50000);
484 let mut scheme_color = SchemeColor::default();
485 scheme_color.set_val(SchemeColorValues::PhColor);
486 let mut tint = PositiveFixedPercentageType::default();
487 tint.set_val(98000);
488 scheme_color.set_tint(tint);
489 let mut sat_mod = PercentageType::default();
490 sat_mod.set_val(130000);
491 scheme_color.set_saturation_modulation(sat_mod);
492 let mut shade = PositiveFixedPercentageType::default();
493 shade.set_val(90000);
494 scheme_color.set_shade(shade);
495 let mut lum_mod = PercentageType::default();
496 lum_mod.set_val(103000);
497 scheme_color.set_luminance_modulation(lum_mod);
498 gradient_stop.set_scheme_color(scheme_color);
499 gradient_fill
500 .get_gradient_stop_list_mut()
501 .add_gradient_stop(gradient_stop);
502 let mut gradient_stop = GradientStop::default();
504 gradient_stop.set_position(100000);
505 let mut scheme_color = SchemeColor::default();
506 scheme_color.set_val(SchemeColorValues::PhColor);
507 let mut shade = PositiveFixedPercentageType::default();
508 shade.set_val(63000);
509 scheme_color.set_shade(shade);
510 let mut sat_mod = PercentageType::default();
511 sat_mod.set_val(120000);
512 scheme_color.set_saturation_modulation(sat_mod);
513 gradient_stop.set_scheme_color(scheme_color);
514 gradient_fill
515 .get_gradient_stop_list_mut()
516 .add_gradient_stop(gradient_stop);
517 let mut linear_gradient_fill = LinearGradientFill::default();
519 linear_gradient_fill.set_angle(5400000);
520 linear_gradient_fill.set_scaled(false);
521 gradient_fill.set_linear_gradient_fill(linear_gradient_fill);
522 def.get_theme_elements_mut()
524 .get_format_scheme_mut()
525 .get_background_fill_style_list_mut()
526 .add_gradient_fill_collection(gradient_fill);
527
528 def
529 }
530
531 pub(crate) fn set_attributes<R: std::io::BufRead>(
532 &mut self,
533 reader: &mut Reader<R>,
534 e: &BytesStart,
535 ) {
536 if let Some(v) = get_attribute(e, b"name") {
537 self.name.set_value(v);
538 }
539
540 xml_read_loop!(
541 reader,
542 Event::Start(ref e) => {
543 if e.name().into_inner() == b"a:themeElements" {
544 self.theme_elements.set_attributes(reader, e);
545 }
546 },
547 Event::End(ref e) => {
548 if e.name().into_inner() == b"a:theme" {
549 return
550 }
551 },
552 Event::Eof => panic!("Error: Could not find {} end element", "a:theme")
553 );
554 }
555
556 pub(crate) fn write_to(&self, writer: &mut Writer<Cursor<Vec<u8>>>) {
557 let mut attributes: Vec<(&str, &str)> = Vec::new();
559 attributes.push(("xmlns:a", DRAWINGML_MAIN_NS));
560 if self.name.has_value() {
561 attributes.push(("name", self.name.get_value_str()));
562 }
563 write_start_tag(writer, "a:theme", attributes, false);
564
565 self.theme_elements.write_to(writer);
567
568 write_start_tag(writer, "a:objectDefaults", vec![], true);
570
571 write_start_tag(writer, "a:extraClrSchemeLst", vec![], true);
573
574 write_end_tag(writer, "a:theme");
575 }
576}