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}