From d18c9fe8fb98215ab1318f6491a6290bb88b0a5e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 4 Feb 2011 11:44:19 +0100 Subject: [PATCH] GESTimelineObject: add a ges_timeline_object_set_top_effect_priority method Lets the user have a minimum of control over effects priorities --- docs/libs/ges-sections.txt | 1 + ges/ges-timeline-object.c | 49 ++++++++++++++++++++++ ges/ges-timeline-object.h | 4 ++ tests/check/ges/effects.c | 85 +++++++++++++++++++++++++++++++++++++- 4 files changed, 137 insertions(+), 2 deletions(-) diff --git a/docs/libs/ges-sections.txt b/docs/libs/ges-sections.txt index ac76d26ae8..c0c433ba85 100644 --- a/docs/libs/ges-sections.txt +++ b/docs/libs/ges-sections.txt @@ -287,6 +287,7 @@ ges_timeline_object_find_track_object ges_timeline_object_add_track_object ges_timeline_object_get_effects ges_timeline_object_get_top_effect_position +ges_timeline_object_set_top_effect_priority GES_TIMELINE_OBJECT_DURATION GES_TIMELINE_OBJECT_INPOINT diff --git a/ges/ges-timeline-object.c b/ges/ges-timeline-object.c index 15ab7e7439..9fe0541fab 100644 --- a/ges/ges-timeline-object.c +++ b/ges/ges-timeline-object.c @@ -844,6 +844,55 @@ ges_timeline_object_get_top_effect_position (GESTimelineObject * object, GES_TRACK_OBJECT (effect))->priority_offset; } +/** +* ges_timeline_object_set_top_effect_priority: +* +* @object: The origin #GESTimelineObject +* @effect: The #GESTrackEffect to move +* @newpriority: the new position at which to move the @effect inside this +* #GESTimelineObject +* +* This is a convenience method that lets you set the priority of a top effect. +* +* Returns: %TRUE if @effect was successfuly moved, %FALSE otherwize. +*/ +gboolean +ges_timeline_object_set_top_effect_priority (GESTimelineObject * object, + GESTrackOperation * effect, guint newpriority) +{ + GList *tmp; + guint inc; + GESTrackObject *tck_obj = GES_TRACK_OBJECT (effect); + GESTimelineObjectPrivate *priv = object->priv; + + /* We don't change the priority */ + if (tck_obj->priority == newpriority || + (newpriority > (object->priv->nb_effects - 1)) || + (G_UNLIKELY (ges_track_object_get_timeline_object (tck_obj) != object))) { + return FALSE; + } else if (tck_obj->priority < newpriority) + inc = -1; + else + inc = +1; + + ges_track_object_set_priority (tck_obj, newpriority); + for (tmp = priv->trackobjects; tmp; tmp = tmp->next) { + GESTrackObject *tmpo = GES_TRACK_OBJECT (tmp->data); + guint tck_priority = ges_track_object_get_priority (tmpo); + + if ((inc == +1 && tck_priority >= newpriority) || + (inc == -1 && tck_priority <= newpriority)) { + ges_track_object_set_priority (tmpo, tck_priority + inc); + } + } + + /* We keep the list of trackobjects sorted */ + priv->trackobjects = g_list_sort_with_data (priv->trackobjects, + (GCompareDataFunc) sort_track_effects, object); + + return TRUE; +} + static void update_height (GESTimelineObject * object) { diff --git a/ges/ges-timeline-object.h b/ges/ges-timeline-object.h index 6650231cbe..45c67081ef 100644 --- a/ges/ges-timeline-object.h +++ b/ges/ges-timeline-object.h @@ -248,6 +248,10 @@ gint ges_timeline_object_get_top_effect_position (GESTimelineObject *object, GESTrackOperation *effect); +gboolean +ges_timeline_object_set_top_effect_priority (GESTimelineObject *object, + GESTrackOperation *effect, guint newpriority); + G_END_DECLS #endif /* _GES_TIMELINE_OBJECT */ diff --git a/tests/check/ges/effects.c b/tests/check/ges/effects.c index f5af3c48a1..7395d9623c 100644 --- a/tests/check/ges/effects.c +++ b/tests/check/ges/effects.c @@ -218,8 +218,88 @@ GST_START_TEST (test_tl_effect) GES_TRACK_OPERATION (tmp->data)); fail_unless (priority > effect_prio); fail_unless (GES_IS_TRACK_EFFECT (tmp->data)); - fail_unless (ges_track_object_get_track (GES_TRACK_OBJECT (tmp-> - data))->type == track_type[i]); + fail_unless (ges_track_object_get_track (GES_TRACK_OBJECT (tmp->data))-> + type == track_type[i]); + effect_prio = priority; + + g_object_unref (tmp->data); + } + g_list_free (effects); + + ges_timeline_layer_remove_object (layer, (GESTimelineObject *) tl_effect); + + g_object_unref (timeline); +} + +GST_END_TEST; + +GST_START_TEST (test_priorities_tl_object) +{ + GESTimeline *timeline; + GESTimelineLayer *layer; + GESTrack *track_audio, *track_video; + GESTimelineEffect *tl_effect; + GESTrackEffect *tck_effect, *tck_effect1; + GList *effects, *tmp; + gint i, tl_object_height; + gint effect_prio = -1; + + ges_init (); + + timeline = ges_timeline_new (); + layer = (GESTimelineLayer *) ges_simple_timeline_layer_new (); + track_audio = ges_track_audio_raw_new (); + track_video = ges_track_video_raw_new (); + + ges_timeline_add_track (timeline, track_audio); + ges_timeline_add_track (timeline, track_video); + ges_timeline_add_layer (timeline, layer); + + GST_DEBUG ("Create effect"); + tl_effect = ges_timeline_effect_new_from_bin_desc ("identity", "identity"); + + g_object_set (tl_effect, "duration", 25 * GST_SECOND, NULL); + + ges_simple_timeline_layer_add_object ((GESSimpleTimelineLayer *) (layer), + (GESTimelineObject *) tl_effect, 0); + + tck_effect = ges_track_effect_new_from_bin_desc ("identity"); + fail_unless (ges_timeline_object_add_track_object (GES_TIMELINE_OBJECT + (tl_effect), GES_TRACK_OBJECT (tck_effect))); + fail_unless (ges_track_add_object (track_video, + GES_TRACK_OBJECT (tck_effect))); + + g_object_get (tl_effect, "height", &tl_object_height, NULL); + fail_unless (tl_object_height == 3); + + tck_effect1 = ges_track_effect_new_from_bin_desc ("identity"); + fail_unless (ges_timeline_object_add_track_object (GES_TIMELINE_OBJECT + (tl_effect), GES_TRACK_OBJECT (tck_effect1))); + fail_unless (ges_track_add_object (track_audio, + GES_TRACK_OBJECT (tck_effect1))); + + fail_unless (ges_timeline_object_set_top_effect_priority (GES_TIMELINE_OBJECT + (tl_effect), GES_TRACK_OPERATION (tck_effect1), 0)); + + fail_unless (ges_track_object_get_priority (GES_TRACK_OBJECT (tck_effect)) == + 3); + + fail_unless (ges_timeline_object_set_top_effect_priority (GES_TIMELINE_OBJECT + (tl_effect), GES_TRACK_OPERATION (tck_effect1), 3)); + fail_unless (ges_track_object_get_priority (GES_TRACK_OBJECT (tck_effect)) == + 2); + + g_object_get (tl_effect, "height", &tl_object_height, NULL); + fail_unless (tl_object_height == 4); + + effects = ges_timeline_object_get_effects (GES_TIMELINE_OBJECT (tl_effect)); + for (tmp = effects, i = 0; tmp; tmp = tmp->next, i++) { + gint priority = + ges_timeline_object_get_top_effect_position (GES_TIMELINE_OBJECT + (tl_effect), + GES_TRACK_OPERATION (tmp->data)); + fail_unless (priority > effect_prio); + fail_unless (GES_IS_TRACK_EFFECT (tmp->data)); effect_prio = priority; g_object_unref (tmp->data); @@ -245,6 +325,7 @@ ges_suite (void) tcase_add_test (tc_chain, test_add_effect_to_tl_object); tcase_add_test (tc_chain, test_get_effects_from_tl); tcase_add_test (tc_chain, test_tl_effect); + tcase_add_test (tc_chain, test_priorities_tl_object); return s; }