ges: add a function to move TimelineObject from a layer to another

API: ges_timeline_object_move_to_layer
API: ges_timeline_object_is_moving_from_layer
API: ges_timeline_object_set_moving_from_layer
This commit is contained in:
Thibault Saunier 2011-06-06 15:55:47 -04:00
parent 2bbcbab174
commit 6e1a482a80
4 changed files with 103 additions and 0 deletions

View file

@ -298,6 +298,7 @@ ges_timeline_object_find_track_object
ges_timeline_object_add_track_object ges_timeline_object_add_track_object
ges_timeline_object_get_top_effects ges_timeline_object_get_top_effects
ges_timeline_object_get_top_effect_position ges_timeline_object_get_top_effect_position
ges_timeline_object_move_to_layer
ges_timeline_object_set_top_effect_priority ges_timeline_object_set_top_effect_priority
<SUBSECTION Standard> <SUBSECTION Standard>
GES_TIMELINE_OBJECT_DURATION GES_TIMELINE_OBJECT_DURATION
@ -308,9 +309,11 @@ GES_TIMELINE_OBJECT_HEIGHT
ges_timeline_object_create_track_objects ges_timeline_object_create_track_objects
ges_timeline_object_create_track_object ges_timeline_object_create_track_object
ges_timeline_object_fill_track_object ges_timeline_object_fill_track_object
ges_timeline_object_is_moving_from_layer
ges_timeline_object_release_track_object ges_timeline_object_release_track_object
ges_timeline_object_get_track_objects ges_timeline_object_get_track_objects
ges_timeline_object_set_layer ges_timeline_object_set_layer
ges_timeline_object_set_moving_from_layer
ges_timeline_object_set_priority ges_timeline_object_set_priority
GESTimelineObjectPrivate GESTimelineObjectPrivate
GES_IS_TIMELINE_OBJECT GES_IS_TIMELINE_OBJECT

View file

@ -119,6 +119,7 @@ struct _GESTimelineObjectPrivate
* properties so we don't end up in infinite property update loops * properties so we don't end up in infinite property update loops
*/ */
gboolean ignore_notifies; gboolean ignore_notifies;
gboolean is_moving;
GList *mappings; GList *mappings;
@ -319,6 +320,7 @@ ges_timeline_object_init (GESTimelineObject * self)
self->priv->trackobjects = NULL; self->priv->trackobjects = NULL;
self->priv->layer = NULL; self->priv->layer = NULL;
self->priv->nb_effects = 0; self->priv->nb_effects = 0;
self->priv->is_moving = FALSE;
} }
/** /**
@ -822,6 +824,81 @@ ges_timeline_object_set_priority_internal (GESTimelineObject * object,
return TRUE; return TRUE;
} }
/**
* ges_timeline_object_set_moving_from_layer:
* @object: a #GESTimelineObject
* @is_moving: %TRUE if you want to start moving @object to another layer
* %FALSE when you finished moving it.
*
* Sets the object in a moving to layer state. You might rather use the
* ges_timeline_object_move_to_layer function to move #GESTimelineObject-s
* from a layer to another.
**/
void
ges_timeline_object_set_moving_from_layer (GESTimelineObject * object,
gboolean is_moving)
{
object->priv->is_moving = is_moving;
}
/**
* ges_timeline_object_is_moving_from_layer:
* @object: a #GESTimelineObject
*
* Tells you if the object is currently moving from a layer to another.
* You might rather use the ges_timeline_object_move_to_layer function to
* move #GESTimelineObject-s from a layer to another.
*
*
* Returns: %TRUE if @object is currently moving from its current layer
* %FALSE otherwize
**/
gboolean
ges_timeline_object_is_moving_from_layer (GESTimelineObject * object)
{
return object->priv->is_moving;
}
/**
* ges_timeline_object_move_to_layer:
* @object: a #GESTimelineObject
* @layer: the new #GESTimelineLayer
*
* Moves @object to @layer. If @object is not in any layer, it adds it to
* @layer, else, it removes it from its current layer, and adds it to @layer.
*
* Returns: %TRUE if @object could be moved %FALSE otherwize
*/
gboolean
ges_timeline_object_move_to_layer (GESTimelineObject * object, GESTimelineLayer
* layer)
{
gboolean ret;
GESTimelineLayer *current_layer = object->priv->layer;
if (current_layer == NULL) {
GST_DEBUG ("Not moving %p, only adding it to %p", object, layer);
return ges_timeline_layer_add_object (layer, object);
}
object->priv->is_moving = TRUE;
g_object_ref (object);
ret = ges_timeline_layer_remove_object (current_layer, object);
if (!ret) {
g_object_unref (object);
return FALSE;
}
ret = ges_timeline_layer_add_object (layer, object);
object->priv->is_moving = FALSE;
g_object_unref (object);
return ret;
}
/** /**
* ges_timeline_object_set_priority: * ges_timeline_object_set_priority:
* @object: a #GESTimelineObject * @object: a #GESTimelineObject

View file

@ -258,6 +258,17 @@ ges_timeline_object_add_track_object (GESTimelineObject *object,
GESTimelineLayer * GESTimelineLayer *
ges_timeline_object_get_layer (GESTimelineObject *object); ges_timeline_object_get_layer (GESTimelineObject *object);
gboolean
ges_timeline_object_move_to_layer (GESTimelineObject *object,
GESTimelineLayer *layer);
gboolean
ges_timeline_object_is_moving_from_layer (GESTimelineObject *object);
void
ges_timeline_object_set_moving_from_layer (GESTimelineObject * object,
gboolean is_moving);
/* Effects */ /* Effects */
GList * GList *
ges_timeline_object_get_top_effects (GESTimelineObject *object); ges_timeline_object_get_top_effects (GESTimelineObject *object);

View file

@ -599,6 +599,12 @@ static void
layer_object_added_cb (GESTimelineLayer * layer, GESTimelineObject * object, layer_object_added_cb (GESTimelineLayer * layer, GESTimelineObject * object,
GESTimeline * timeline) GESTimeline * timeline)
{ {
if (ges_timeline_object_is_moving_from_layer (object)) {
GST_DEBUG ("TimelineObject %p is moving from a layer to another, not doing"
" anything on it", object);
return;
}
GST_DEBUG ("New TimelineObject %p added to layer %p", object, layer); GST_DEBUG ("New TimelineObject %p added to layer %p", object, layer);
if (GES_IS_TIMELINE_FILE_SOURCE (object)) { if (GES_IS_TIMELINE_FILE_SOURCE (object)) {
@ -647,6 +653,12 @@ layer_object_removed_cb (GESTimelineLayer * layer, GESTimelineObject * object,
{ {
GList *tmp, *trackobjects; GList *tmp, *trackobjects;
if (ges_timeline_object_is_moving_from_layer (object)) {
GST_DEBUG ("TimelineObject %p is moving from a layer to another, not doing"
" anything on it", object);
return;
}
GST_DEBUG ("TimelineObject %p removed from layer %p", object, layer); GST_DEBUG ("TimelineObject %p removed from layer %p", object, layer);
/* Go over the object's track objects and figure out which one belongs to /* Go over the object's track objects and figure out which one belongs to