From 959a3c70b00d384d5851256103e504e59a0a593e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 18 Aug 2017 23:39:38 -0300 Subject: [PATCH] timeline: Add from first element with wanted start to the move context We need to iterate over the previous element from trackelement_iter to find the first element that is at the moving point. Several elements can have the same start as the one initiating the move, and we need to take all of them into account. Fixes https://phabricator.freedesktop.org/T7819 --- ges/ges-timeline.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/ges/ges-timeline.c b/ges/ges-timeline.c index 0dc69a5..10fd6f9 100644 --- a/ges/ges-timeline.c +++ b/ges/ges-timeline.c @@ -1378,7 +1378,7 @@ ges_move_context_set_objects (GESTimeline * timeline, GESTrackElement * obj, TrackObjIters *iters; GESTrackElement *tmptrackelement; guint64 start, tmpend, moving_point = _START (obj); - GSequenceIter *iter, *trackelement_iter; + GSequenceIter *iter, *trackelement_iter, *tmpiter; MoveContext *mv_ctx = &timeline->priv->movecontext; iters = g_hash_table_lookup (timeline->priv->obj_iters, obj); @@ -1423,9 +1423,26 @@ ges_move_context_set_objects (GESTimeline * timeline, GESTrackElement * obj, case GES_EDGE_NONE: /* In this case only works for ripple */ mv_ctx->max_trim_pos = G_MAXUINT64; + iter = trackelement_iter; + tmpiter = g_sequence_iter_prev (iter); + + /* Make sure to get the first TimelineElement starting at + * @moving_point */ + while (tmpiter && !g_sequence_iter_is_end (tmpiter)) { + tmptrackelement = GES_TRACK_ELEMENT (g_sequence_get (iter)); + + if (GES_TIMELINE_ELEMENT_START (tmptrackelement) != moving_point) + break; + + iter = tmpiter; + tmpiter = g_sequence_iter_prev (tmpiter); + + if (g_sequence_iter_is_begin (tmpiter)) + break; + } + /* Look for folowing objects */ - for (iter = g_sequence_iter_next (trackelement_iter); - iter && !g_sequence_iter_is_end (iter); + for (; iter && !g_sequence_iter_is_end (iter); iter = g_sequence_iter_next (iter)) { tmptrackelement = GES_TRACK_ELEMENT (g_sequence_get (iter)); -- 2.7.4