umya_spreadsheet/structs/drawing/
theme.rs

1use 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        // color_scheme
69        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); // dk1
80
81        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); // lt1
88
89        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); // dk2
95
96        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); // lt2
102
103        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); // accent1
109
110        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); // accent2
116
117        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); // accent3
123
124        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); // accent4
130
131        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); // accent5
137
138        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); // accent6
144
145        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); // hlink
151
152        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); // folHlink
158
159        // font_scheme
160        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        // format_scheme
175        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        //
191        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        //
209        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        //
227        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        //
245        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        //
250        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        //
258        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        //
276        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        //
294        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        //
312        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        //
317        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        //
328        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        //
334        let mut preset_dash = PresetDash::default();
335        preset_dash.set_val(PresetLineDashValues::Solid);
336        outline.set_preset_dash(preset_dash);
337        //
338        let mut miter = Miter::default();
339        miter.set_limit(800000);
340        outline.set_miter(miter);
341        //
342        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        //
353        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        //
359        let mut preset_dash = PresetDash::default();
360        preset_dash.set_val(PresetLineDashValues::Solid);
361        outline.set_preset_dash(preset_dash);
362        //
363        let mut miter = Miter::default();
364        miter.set_limit(800000);
365        outline.set_miter(miter);
366        //
367        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        //
378        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        //
384        let mut preset_dash = PresetDash::default();
385        preset_dash.set_val(PresetLineDashValues::Solid);
386        outline.set_preset_dash(preset_dash);
387        //
388        let mut miter = Miter::default();
389        miter.set_limit(800000);
390        outline.set_miter(miter);
391        //
392        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        //
443        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        //
461        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        //
482        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        //
503        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        //
518        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        //
523        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        // a:theme
558        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        // a:themeElements
566        self.theme_elements.write_to(writer);
567
568        // a:objectDefaults
569        write_start_tag(writer, "a:objectDefaults", vec![], true);
570
571        // a:extraClrSchemeLst
572        write_start_tag(writer, "a:extraClrSchemeLst", vec![], true);
573
574        write_end_tag(writer, "a:theme");
575    }
576}