Skip to main content

rust_pptx/
animation_model.rs

1use crate::ColorValue;
2use serde::{Deserialize, Serialize};
3use std::collections::BTreeMap;
4
5/// A finite quantity or an indefinite duration/repetition. Percentages are fractions.
6#[derive(Debug, Clone, Serialize, Deserialize)]
7#[serde(untagged)]
8pub enum AnimationNumber {
9    Number(f64),
10    Indefinite(AnimationIndefinite),
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14#[serde(rename_all = "lowercase")]
15pub enum AnimationIndefinite {
16    Indefinite,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20#[serde(tag = "kind", content = "value", rename_all = "camelCase")]
21pub enum AnimationValue {
22    String(String),
23    Boolean(bool),
24    Integer(i32),
25    Number(f64),
26    Color(ColorValue),
27    Point(AnimationPoint),
28    RgbDelta([f64; 3]),
29    HslDelta([f64; 3]),
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
33#[serde(rename_all = "camelCase")]
34pub struct SlideTransition {
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub effect: Option<TransitionEffect>,
37    pub speed: String,
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub duration_ms: Option<u32>,
40    pub advance_on_click: bool,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub advance_after_ms: Option<u32>,
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub sound: Option<TransitionSound>,
45    pub source_xml: String,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49#[serde(rename_all = "camelCase")]
50pub struct TransitionEffect {
51    pub kind: String,
52    pub namespace: String,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub direction: Option<String>,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    pub orientation: Option<String>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub through_black: Option<bool>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub spokes: Option<u32>,
61    pub parameters: BTreeMap<String, String>,
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
65#[serde(rename_all = "camelCase")]
66pub struct TransitionSound {
67    pub action: String,
68    pub loop_sound: bool,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub source: Option<AnimationSound>,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
74#[serde(rename_all = "camelCase")]
75pub struct AnimationSound {
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub relationship_id: Option<String>,
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub target: Option<String>,
80    #[serde(skip_serializing_if = "Option::is_none")]
81    pub asset_id: Option<String>,
82    pub external: bool,
83    #[serde(skip_serializing_if = "Option::is_none")]
84    pub name: Option<String>,
85    #[serde(skip_serializing_if = "Option::is_none")]
86    pub builtin: Option<bool>,
87}
88
89#[derive(Debug, Clone, Serialize, Deserialize)]
90#[serde(rename_all = "camelCase")]
91pub struct SlideTiming {
92    #[serde(default, skip_serializing_if = "Vec::is_empty")]
93    pub nodes: Vec<AnimationNode>,
94    #[serde(default, skip_serializing_if = "Vec::is_empty")]
95    pub builds: Vec<AnimationBuild>,
96    #[serde(default, skip_serializing_if = "Vec::is_empty")]
97    pub unsupported: Vec<String>,
98    pub source_xml: String,
99}
100
101#[derive(Debug, Clone, Serialize, Deserialize)]
102#[serde(rename_all = "camelCase")]
103pub struct AnimationNode {
104    pub kind: String,
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub time: Option<Box<AnimationTime>>,
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub behavior: Option<AnimationBehavior>,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub sequence: Option<AnimationSequence>,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub media: Option<AnimationMedia>,
113    pub parameters: AnimationParameters,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
117#[serde(rename_all = "camelCase")]
118pub struct AnimationTime {
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub id: Option<u32>,
121    #[serde(skip_serializing_if = "Option::is_none")]
122    pub preset_id: Option<i32>,
123    #[serde(skip_serializing_if = "Option::is_none")]
124    pub preset_class: Option<String>,
125    #[serde(skip_serializing_if = "Option::is_none")]
126    pub preset_subtype: Option<i32>,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    pub duration_ms: Option<AnimationNumber>,
129    pub repeat_count: AnimationNumber,
130    #[serde(skip_serializing_if = "Option::is_none")]
131    pub repeat_duration_ms: Option<AnimationNumber>,
132    pub speed: f64,
133    pub acceleration: f64,
134    pub deceleration: f64,
135    pub auto_reverse: bool,
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub restart: Option<String>,
138    #[serde(skip_serializing_if = "Option::is_none")]
139    pub fill: Option<String>,
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub sync_behavior: Option<String>,
142    #[serde(skip_serializing_if = "Option::is_none")]
143    pub time_filter: Option<String>,
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub event_filter: Option<String>,
146    #[serde(skip_serializing_if = "Option::is_none")]
147    pub display: Option<bool>,
148    #[serde(skip_serializing_if = "Option::is_none")]
149    pub master_relation: Option<String>,
150    #[serde(skip_serializing_if = "Option::is_none")]
151    pub build_level: Option<i32>,
152    #[serde(skip_serializing_if = "Option::is_none")]
153    pub group_id: Option<u32>,
154    #[serde(skip_serializing_if = "Option::is_none")]
155    pub after_effect: Option<bool>,
156    #[serde(skip_serializing_if = "Option::is_none")]
157    pub node_type: Option<String>,
158    #[serde(skip_serializing_if = "Option::is_none")]
159    pub placeholder: Option<bool>,
160    #[serde(default, skip_serializing_if = "Vec::is_empty")]
161    pub start_conditions: Vec<AnimationCondition>,
162    #[serde(default, skip_serializing_if = "Vec::is_empty")]
163    pub end_conditions: Vec<AnimationCondition>,
164    #[serde(skip_serializing_if = "Option::is_none")]
165    pub end_sync: Option<AnimationCondition>,
166    #[serde(skip_serializing_if = "Option::is_none")]
167    pub iterate: Option<AnimationIteration>,
168    #[serde(default, skip_serializing_if = "Vec::is_empty")]
169    pub children: Vec<AnimationNode>,
170    #[serde(default, skip_serializing_if = "Vec::is_empty")]
171    pub sub_nodes: Vec<AnimationNode>,
172}
173
174#[derive(Debug, Clone, Serialize, Deserialize)]
175#[serde(rename_all = "camelCase")]
176pub struct AnimationCondition {
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub event: Option<String>,
179    #[serde(skip_serializing_if = "Option::is_none")]
180    pub delay_ms: Option<AnimationNumber>,
181    #[serde(skip_serializing_if = "Option::is_none")]
182    pub target: Option<AnimationTarget>,
183    #[serde(skip_serializing_if = "Option::is_none")]
184    pub time_node_id: Option<u32>,
185    #[serde(skip_serializing_if = "Option::is_none")]
186    pub runtime_node: Option<String>,
187}
188
189#[derive(Debug, Clone, Serialize, Deserialize)]
190#[serde(rename_all = "camelCase")]
191pub struct AnimationIteration {
192    pub kind: String,
193    pub backwards: bool,
194    #[serde(skip_serializing_if = "Option::is_none")]
195    pub interval_ms: Option<AnimationNumber>,
196    #[serde(skip_serializing_if = "Option::is_none")]
197    pub interval_fraction: Option<f64>,
198}
199
200#[derive(Debug, Clone, Serialize, Deserialize)]
201#[serde(rename_all = "camelCase")]
202pub struct AnimationTarget {
203    pub kind: String,
204    #[serde(skip_serializing_if = "Option::is_none")]
205    /// Identifier scoped to the owning part, matching object source identity.
206    pub shape_id: Option<String>,
207    #[serde(skip_serializing_if = "Option::is_none")]
208    pub sub_shape_id: Option<String>,
209    #[serde(skip_serializing_if = "Option::is_none")]
210    pub background: Option<bool>,
211    #[serde(skip_serializing_if = "Option::is_none")]
212    pub text: Option<AnimationTextRange>,
213    #[serde(skip_serializing_if = "Option::is_none")]
214    pub chart: Option<AnimationChartTarget>,
215    #[serde(skip_serializing_if = "Option::is_none")]
216    pub diagram: Option<AnimationDiagramTarget>,
217    #[serde(skip_serializing_if = "Option::is_none")]
218    pub sound: Option<AnimationSound>,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize)]
222#[serde(rename_all = "camelCase")]
223pub struct AnimationTextRange {
224    pub kind: String,
225    #[serde(skip_serializing_if = "Option::is_none")]
226    pub start: Option<u32>,
227    #[serde(skip_serializing_if = "Option::is_none")]
228    pub end: Option<u32>,
229}
230
231#[derive(Debug, Clone, Serialize, Deserialize)]
232#[serde(rename_all = "camelCase")]
233pub struct AnimationChartTarget {
234    pub kind: String,
235    #[serde(skip_serializing_if = "Option::is_none")]
236    pub level: Option<u32>,
237    #[serde(skip_serializing_if = "Option::is_none")]
238    pub series_index: Option<i32>,
239    #[serde(skip_serializing_if = "Option::is_none")]
240    pub category_index: Option<i32>,
241}
242
243#[derive(Debug, Clone, Serialize, Deserialize)]
244#[serde(rename_all = "camelCase")]
245pub struct AnimationDiagramTarget {
246    #[serde(skip_serializing_if = "Option::is_none")]
247    pub id: Option<String>,
248    #[serde(skip_serializing_if = "Option::is_none")]
249    pub build_step: Option<String>,
250}
251
252#[derive(Debug, Clone, Serialize, Deserialize)]
253#[serde(rename_all = "camelCase")]
254pub struct AnimationBehavior {
255    #[serde(skip_serializing_if = "Option::is_none")]
256    pub target: Option<AnimationTarget>,
257    #[serde(default, skip_serializing_if = "Vec::is_empty")]
258    pub attribute_names: Vec<String>,
259    #[serde(skip_serializing_if = "Option::is_none")]
260    pub additive: Option<String>,
261    #[serde(skip_serializing_if = "Option::is_none")]
262    pub accumulate: Option<String>,
263    #[serde(skip_serializing_if = "Option::is_none")]
264    pub transform_type: Option<String>,
265    #[serde(skip_serializing_if = "Option::is_none")]
266    pub from: Option<String>,
267    #[serde(skip_serializing_if = "Option::is_none")]
268    pub to: Option<String>,
269    #[serde(skip_serializing_if = "Option::is_none")]
270    pub by: Option<String>,
271    #[serde(skip_serializing_if = "Option::is_none")]
272    pub runtime_context: Option<String>,
273    #[serde(skip_serializing_if = "Option::is_none")]
274    pub override_mode: Option<String>,
275}
276
277#[derive(Debug, Clone, Serialize, Deserialize)]
278#[serde(rename_all = "camelCase")]
279pub struct AnimationSequence {
280    #[serde(skip_serializing_if = "Option::is_none")]
281    pub concurrent: Option<bool>,
282    #[serde(skip_serializing_if = "Option::is_none")]
283    pub previous_action: Option<String>,
284    #[serde(skip_serializing_if = "Option::is_none")]
285    pub next_action: Option<String>,
286    #[serde(default, skip_serializing_if = "Vec::is_empty")]
287    pub previous_conditions: Vec<AnimationCondition>,
288    #[serde(default, skip_serializing_if = "Vec::is_empty")]
289    pub next_conditions: Vec<AnimationCondition>,
290}
291
292#[derive(Debug, Clone, Serialize, Deserialize)]
293#[serde(rename_all = "camelCase")]
294pub struct AnimationMedia {
295    #[serde(skip_serializing_if = "Option::is_none")]
296    pub target: Option<AnimationTarget>,
297    pub volume: f64,
298    pub mute: bool,
299    pub slide_count: u32,
300    pub show_when_stopped: bool,
301    #[serde(skip_serializing_if = "Option::is_none")]
302    pub narration: Option<bool>,
303    #[serde(skip_serializing_if = "Option::is_none")]
304    pub full_screen: Option<bool>,
305}
306
307#[derive(Debug, Clone, Default, Serialize, Deserialize)]
308#[serde(rename_all = "camelCase")]
309pub struct AnimationParameters {
310    #[serde(skip_serializing_if = "Option::is_none")]
311    pub from: Option<AnimationValue>,
312    #[serde(skip_serializing_if = "Option::is_none")]
313    pub to: Option<AnimationValue>,
314    #[serde(skip_serializing_if = "Option::is_none")]
315    pub by: Option<AnimationValue>,
316    #[serde(skip_serializing_if = "Option::is_none")]
317    pub calculation_mode: Option<String>,
318    #[serde(skip_serializing_if = "Option::is_none")]
319    pub value_type: Option<String>,
320    #[serde(default, skip_serializing_if = "Vec::is_empty")]
321    pub keyframes: Vec<AnimationKeyframe>,
322    #[serde(skip_serializing_if = "Option::is_none")]
323    pub color_space: Option<String>,
324    #[serde(skip_serializing_if = "Option::is_none")]
325    pub direction: Option<String>,
326    #[serde(skip_serializing_if = "Option::is_none")]
327    pub transition: Option<String>,
328    #[serde(skip_serializing_if = "Option::is_none")]
329    pub filter: Option<String>,
330    #[serde(skip_serializing_if = "Option::is_none")]
331    pub properties: Option<String>,
332    #[serde(skip_serializing_if = "Option::is_none")]
333    pub progress: Option<AnimationValue>,
334    #[serde(skip_serializing_if = "Option::is_none")]
335    pub origin: Option<String>,
336    #[serde(skip_serializing_if = "Option::is_none")]
337    pub path: Option<String>,
338    #[serde(skip_serializing_if = "Option::is_none")]
339    pub path_edit_mode: Option<String>,
340    #[serde(skip_serializing_if = "Option::is_none")]
341    pub rotation_center: Option<AnimationPoint>,
342    #[serde(skip_serializing_if = "Option::is_none")]
343    pub rotation_degrees: Option<f64>,
344    #[serde(skip_serializing_if = "Option::is_none")]
345    pub point_types: Option<String>,
346    #[serde(skip_serializing_if = "Option::is_none")]
347    pub zoom_contents: Option<bool>,
348    #[serde(skip_serializing_if = "Option::is_none")]
349    pub command_type: Option<String>,
350    #[serde(skip_serializing_if = "Option::is_none")]
351    pub command: Option<String>,
352}
353
354#[derive(Debug, Clone, Serialize, Deserialize)]
355#[serde(rename_all = "camelCase")]
356pub struct AnimationPoint {
357    pub x: f64,
358    pub y: f64,
359}
360
361#[derive(Debug, Clone, Serialize, Deserialize)]
362#[serde(rename_all = "camelCase")]
363pub struct AnimationKeyframe {
364    pub time: AnimationNumber,
365    pub formula: String,
366    #[serde(skip_serializing_if = "Option::is_none")]
367    pub value: Option<AnimationValue>,
368}
369
370#[derive(Debug, Clone, Serialize, Deserialize)]
371#[serde(rename_all = "camelCase")]
372pub struct AnimationBuild {
373    pub kind: String,
374    #[serde(skip_serializing_if = "Option::is_none")]
375    /// Identifier scoped to the owning part, matching object source identity.
376    pub shape_id: Option<String>,
377    #[serde(skip_serializing_if = "Option::is_none")]
378    pub group_id: Option<u32>,
379    pub ui_expand: bool,
380    #[serde(skip_serializing_if = "Option::is_none")]
381    pub build: Option<String>,
382    #[serde(skip_serializing_if = "Option::is_none")]
383    pub level: Option<u32>,
384    #[serde(skip_serializing_if = "Option::is_none")]
385    pub animate_background: Option<bool>,
386    #[serde(skip_serializing_if = "Option::is_none")]
387    pub auto_update_background: Option<bool>,
388    #[serde(skip_serializing_if = "Option::is_none")]
389    pub reverse: Option<bool>,
390    #[serde(skip_serializing_if = "Option::is_none")]
391    pub advance_after_ms: Option<AnimationNumber>,
392    #[serde(skip_serializing_if = "Option::is_none")]
393    pub as_one: Option<bool>,
394    #[serde(skip_serializing_if = "Option::is_none")]
395    pub graphic_build: Option<AnimationGraphicBuild>,
396    #[serde(default, skip_serializing_if = "Vec::is_empty")]
397    pub templates: Vec<AnimationTemplate>,
398}
399
400#[derive(Debug, Clone, Serialize, Deserialize)]
401#[serde(rename_all = "camelCase")]
402pub struct AnimationGraphicBuild {
403    pub kind: String,
404    #[serde(skip_serializing_if = "Option::is_none")]
405    pub build: Option<String>,
406    #[serde(skip_serializing_if = "Option::is_none")]
407    pub reverse: Option<bool>,
408    #[serde(skip_serializing_if = "Option::is_none")]
409    pub animate_background: Option<bool>,
410}
411
412#[derive(Debug, Clone, Serialize, Deserialize)]
413#[serde(rename_all = "camelCase")]
414pub struct AnimationTemplate {
415    pub level: u32,
416    #[serde(default, skip_serializing_if = "Vec::is_empty")]
417    pub nodes: Vec<AnimationNode>,
418}