animate/legacy/keyframe_transition.rs
1use glib::{
2 object::{Cast, IsA},
3 translate::*,
4};
5use std::{fmt, mem};
6// Scriptable
7use crate::{AnimationMode, PropertyTransition, Timeline, Transition};
8
9// TODO: , @implements Scriptable
10glib_wrapper! {
11 pub struct KeyframeTransition(Object<ffi::ClutterKeyframeTransition, ffi::ClutterKeyframeTransitionClass, KeyframeTransitionClass>) @extends PropertyTransition, Transition, Timeline;
12
13 match fn {
14 get_type => || ffi::clutter_keyframe_transition_get_type(),
15 }
16}
17
18impl KeyframeTransition {
19 /// Creates a new `KeyframeTransition` for `property_name`.
20 /// ## `property_name`
21 /// the property to animate
22 ///
23 /// # Returns
24 ///
25 /// the newly allocated
26 /// `KeyframeTransition` instance. Use `gobject::ObjectExt::unref` when
27 /// done to free its resources.
28 pub fn new(property_name: &str) -> KeyframeTransition {
29 unsafe {
30 Transition::from_glib_full(ffi::clutter_keyframe_transition_new(
31 property_name.to_glib_none().0,
32 ))
33 .unsafe_cast()
34 }
35 }
36}
37
38/// Trait containing all `KeyframeTransition` methods.
39///
40/// # Implementors
41///
42/// [`KeyframeTransition`](struct.KeyframeTransition.html)
43pub trait KeyframeTransitionExt: 'static {
44 /// Removes all key frames from `self`.
45 fn clear(&self);
46
47 /// Retrieves the details of the key frame at `index_` inside `self`.
48 ///
49 /// The `self` must already have key frames set, and `index_` must be
50 /// smaller than the number of key frames.
51 /// ## `index_`
52 /// the index of the key frame
53 /// ## `key`
54 /// return location for the key, or `None`
55 /// ## `mode`
56 /// return location for the easing mode, or `None`
57 /// ## `value`
58 /// a `gobject::Value` initialized with the type of
59 /// the values
60 fn get_key_frame(&self, index_: u32) -> (f64, AnimationMode, glib::Value);
61
62 /// Retrieves the number of key frames inside `self`.
63 ///
64 /// # Returns
65 ///
66 /// the number of key frames
67 fn get_n_key_frames(&self) -> u32;
68
69 //fn set(&self, gtype: glib::types::Type, n_key_frames: u32, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs);
70
71 /// Sets the details of the key frame at `index_` inside `self`.
72 ///
73 /// The `self` must already have a key frame at `index_`, and `index_`
74 /// must be smaller than the number of key frames inside `self`.
75 /// ## `index_`
76 /// the index of the key frame
77 /// ## `key`
78 /// the key of the key frame
79 /// ## `mode`
80 /// the easing mode of the key frame
81 /// ## `value`
82 /// a `gobject::Value` containing the value of the key frame
83 fn set_key_frame(&self, index_: u32, key: f64, mode: AnimationMode, value: &glib::Value);
84
85 /// Sets the keys for each key frame inside `self`.
86 ///
87 /// If `self` does not hold any key frame, `n_key_frames` key frames
88 /// will be created; if `self` already has key frames, `key_frames` must
89 /// have at least as many elements as the number of key frames.
90 /// ## `n_key_frames`
91 /// the number of values
92 /// ## `key_frames`
93 /// an array of keys between 0.0
94 /// and 1.0, one for each key frame
95 fn set_key_frames(&self, key_frames: &[f64]);
96
97 //fn set_modes(&self, modes: /*Unimplemented*/&CArray TypeId { ns_id: 1, id: 28 });
98
99 /// Sets the values for each key frame inside `self`.
100 ///
101 /// If `self` does not hold any key frame, `n_values` key frames will
102 /// be created; if `self` already has key frames, `values` must have
103 /// at least as many elements as the number of key frames.
104 /// ## `n_values`
105 /// the number of values
106 /// ## `values`
107 /// an array of values, one for each
108 /// key frame
109 fn set_values(&self, values: &[&glib::Value]);
110}
111
112impl<O: IsA<KeyframeTransition>> KeyframeTransitionExt for O {
113 fn clear(&self) {
114 unsafe {
115 ffi::clutter_keyframe_transition_clear(self.as_ref().to_glib_none().0);
116 }
117 }
118
119 fn get_key_frame(&self, index_: u32) -> (f64, AnimationMode, glib::Value) {
120 unsafe {
121 let mut key = mem::MaybeUninit::uninit();
122 let mut mode = mem::MaybeUninit::uninit();
123 let mut value = glib::Value::uninitialized();
124 ffi::clutter_keyframe_transition_get_key_frame(
125 self.as_ref().to_glib_none().0,
126 index_,
127 key.as_mut_ptr(),
128 mode.as_mut_ptr(),
129 value.to_glib_none_mut().0,
130 );
131 let key = key.assume_init();
132 let mode = mode.assume_init();
133 (key, from_glib(mode), value)
134 }
135 }
136
137 fn get_n_key_frames(&self) -> u32 {
138 unsafe { ffi::clutter_keyframe_transition_get_n_key_frames(self.as_ref().to_glib_none().0) }
139 }
140
141 //fn set(&self, gtype: glib::types::Type, n_key_frames: u32, : /*Unknown conversion*//*Unimplemented*/Fundamental: VarArgs) {
142 // unsafe { TODO: call clutter_sys:clutter_keyframe_transition_set() }
143 //}
144
145 fn set_key_frame(&self, index_: u32, key: f64, mode: AnimationMode, value: &glib::Value) {
146 unsafe {
147 ffi::clutter_keyframe_transition_set_key_frame(
148 self.as_ref().to_glib_none().0,
149 index_,
150 key,
151 mode.to_glib(),
152 value.to_glib_none().0,
153 );
154 }
155 }
156
157 fn set_key_frames(&self, key_frames: &[f64]) {
158 let n_key_frames = key_frames.len() as u32;
159 unsafe {
160 ffi::clutter_keyframe_transition_set_key_frames(
161 self.as_ref().to_glib_none().0,
162 n_key_frames,
163 key_frames.to_glib_none().0,
164 );
165 }
166 }
167
168 //fn set_modes(&self, modes: /*Unimplemented*/&CArray TypeId { ns_id: 1, id: 28 }) {
169 // unsafe { TODO: call clutter_sys:clutter_keyframe_transition_set_modes() }
170 //}
171
172 fn set_values(&self, values: &[&glib::Value]) {
173 let n_values = values.len() as u32;
174 unsafe {
175 ffi::clutter_keyframe_transition_set_values(
176 self.as_ref().to_glib_none().0,
177 n_values,
178 values.to_glib_none().0,
179 );
180 }
181 }
182}
183
184impl fmt::Display for KeyframeTransition {
185 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
186 write!(f, "KeyframeTransition")
187 }
188}