4 * An OpenGL based 'interactive canvas' library.
6 * Copyright (C) 2012 Intel Corporation
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
21 * Author: Emmanuele Bassi <ebassi@linux.intel.com>
25 * SECTION:clutter-transition-group
26 * @Title: ClutterTransitionGroup
27 * @Short_Description: Group transitions together
29 * The #ClutterTransitionGroup allows running multiple #ClutterTransition
30 * instances concurrently.
32 * The transitions inside a group will run within the boundaries of the
33 * group; for instance, if a transition has a duration of 10 seconds, and
34 * the group that contains it has a duration of 5 seconds, only the first
35 * 5 seconds of the transition will be played.
37 * #ClutterTransitionGroup is available since Clutter 1.12
44 #include "clutter-transition-group.h"
46 #include "clutter-debug.h"
47 #include "clutter-private.h"
49 struct _ClutterTransitionGroupPrivate
51 GHashTable *transitions;
54 G_DEFINE_TYPE (ClutterTransitionGroup, clutter_transition_group, CLUTTER_TYPE_TRANSITION)
57 clutter_transition_group_new_frame (ClutterTimeline *timeline,
60 ClutterTransitionGroupPrivate *priv;
65 priv = CLUTTER_TRANSITION_GROUP (timeline)->priv;
67 /* get the time elapsed since the last ::new-frame... */
68 msecs = clutter_timeline_get_delta (timeline);
70 g_hash_table_iter_init (&iter, priv->transitions);
71 while (g_hash_table_iter_next (&iter, &element, NULL))
73 ClutterTimeline *t = element;
75 /* ... and advance every timeline */
76 clutter_timeline_set_direction (t, clutter_timeline_get_direction (timeline));
77 clutter_timeline_set_duration (t, clutter_timeline_get_duration (timeline));
79 _clutter_timeline_advance (t, msecs);
84 clutter_transition_group_attached (ClutterTransition *transition,
85 ClutterAnimatable *animatable)
87 ClutterTransitionGroupPrivate *priv;
91 priv = CLUTTER_TRANSITION_GROUP (transition)->priv;
93 g_hash_table_iter_init (&iter, priv->transitions);
94 while (g_hash_table_iter_next (&iter, &element, NULL))
96 ClutterTransition *t = element;
98 clutter_transition_set_animatable (t, animatable);
103 clutter_transition_group_detached (ClutterTransition *transition,
104 ClutterAnimatable *animatable)
106 ClutterTransitionGroupPrivate *priv;
110 priv = CLUTTER_TRANSITION_GROUP (transition)->priv;
112 g_hash_table_iter_init (&iter, priv->transitions);
113 while (g_hash_table_iter_next (&iter, &element, NULL))
115 ClutterTransition *t = element;
117 clutter_transition_set_animatable (t, NULL);
122 clutter_transition_group_started (ClutterTimeline *timeline)
124 ClutterTransitionGroupPrivate *priv;
128 priv = CLUTTER_TRANSITION_GROUP (timeline)->priv;
130 g_hash_table_iter_init (&iter, priv->transitions);
131 while (g_hash_table_iter_next (&iter, &element, NULL))
133 ClutterTransition *t = element;
135 g_signal_emit_by_name (t, "started");
140 clutter_transition_group_finalize (GObject *gobject)
142 ClutterTransitionGroupPrivate *priv;
144 priv = CLUTTER_TRANSITION_GROUP (gobject)->priv;
146 g_hash_table_unref (priv->transitions);
148 G_OBJECT_CLASS (clutter_transition_group_parent_class)->finalize (gobject);
152 clutter_transition_group_class_init (ClutterTransitionGroupClass *klass)
154 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
155 ClutterTimelineClass *timeline_class = CLUTTER_TIMELINE_CLASS (klass);
156 ClutterTransitionClass *transition_class = CLUTTER_TRANSITION_CLASS (klass);
158 g_type_class_add_private (klass, sizeof (ClutterTransitionGroupPrivate));
160 gobject_class->finalize = clutter_transition_group_finalize;
162 timeline_class->started = clutter_transition_group_started;
163 timeline_class->new_frame = clutter_transition_group_new_frame;
165 transition_class->attached = clutter_transition_group_attached;
166 transition_class->detached = clutter_transition_group_detached;
170 clutter_transition_group_init (ClutterTransitionGroup *self)
172 self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
173 CLUTTER_TYPE_TRANSITION_GROUP,
174 ClutterTransitionGroupPrivate);
176 self->priv->transitions =
177 g_hash_table_new_full (NULL, NULL, (GDestroyNotify) g_object_unref, NULL);
181 * clutter_transition_group_new:
183 * Creates a new #ClutterTransitionGroup instance.
185 * Return value: the newly created #ClutterTransitionGroup. Use
186 * g_object_unref() when done to deallocate the resources it
192 clutter_transition_group_new (void)
194 return g_object_new (CLUTTER_TYPE_TRANSITION_GROUP, NULL);
198 * clutter_transition_group_add_transition:
199 * @group: a #ClutterTransitionGroup
200 * @transition: a #ClutterTransition
202 * Adds @transition to @group.
204 * This function acquires a reference on @transition that will be released
205 * when calling clutter_transition_group_remove_transition().
210 clutter_transition_group_add_transition (ClutterTransitionGroup *group,
211 ClutterTransition *transition)
213 g_return_if_fail (CLUTTER_IS_TRANSITION_GROUP (group));
214 g_return_if_fail (CLUTTER_IS_TRANSITION (transition));
216 g_hash_table_add (group->priv->transitions, g_object_ref (transition));
220 * clutter_transition_group_remove_transition:
221 * @group: a #ClutterTransitionGroup
222 * @transition: a #ClutterTransition
224 * Removes @transition from @group.
226 * This function releases the reference acquired on @transition when
227 * calling clutter_transition_group_add_transition().
232 clutter_transition_group_remove_transition (ClutterTransitionGroup *group,
233 ClutterTransition *transition)
235 g_return_if_fail (CLUTTER_IS_TRANSITION_GROUP (group));
237 g_hash_table_remove (group->priv->transitions, transition);
241 * clutter_transition_group_remove_all:
242 * @group: a #ClutterTransitionGroup
244 * Removes all transitions from @group.
246 * This function releases the reference acquired when calling
247 * clutter_transition_group_add_transition().
252 clutter_transition_group_remove_all (ClutterTransitionGroup *group)
254 g_return_if_fail (CLUTTER_IS_TRANSITION_GROUP (group));
256 g_hash_table_remove_all (group->priv->transitions);