diff --git a/ges/ges-auto-transition.c b/ges/ges-auto-transition.c index e610b010e1..c539dbf6e2 100644 --- a/ges/ges-auto-transition.c +++ b/ges/ges-auto-transition.c @@ -40,6 +40,23 @@ neighbour_changed_cb (GESClip * clip, GParamSpec * arg G_GNUC_UNUSED, GESAutoTransition * self) { gint64 new_duration; + GESTimelineElement *parent = + ges_timeline_element_get_toplevel_parent (GES_TIMELINE_ELEMENT (clip)); + + if (!g_strcmp0 (g_param_spec_get_name (arg), "priority") && parent) { + GESTimelineElement *prev_topparent = + ges_timeline_element_get_toplevel_parent (GES_TIMELINE_ELEMENT + (self->next_source)); + GESTimelineElement *next_topparent = + ges_timeline_element_get_toplevel_parent (GES_TIMELINE_ELEMENT + (self->previous_source)); + + if (parent == prev_topparent && parent == next_topparent) { + GST_DEBUG_OBJECT (self, + "Moving all inside the same group, nothing to do"); + return; + } + } if (_ges_track_element_get_layer_priority (self->next_source) != _ges_track_element_get_layer_priority (self->previous_source)) { @@ -150,7 +167,7 @@ ges_auto_transition_new (GESTrackElement * transition, g_signal_connect (previous_source, "notify::start", G_CALLBACK (neighbour_changed_cb), self); - g_signal_connect (previous_source, "notify::priority", + g_signal_connect_after (previous_source, "notify::priority", G_CALLBACK (neighbour_changed_cb), self); g_signal_connect (next_source, "notify::start", G_CALLBACK (neighbour_changed_cb), self); diff --git a/tests/check/python/test_group.py b/tests/check/python/test_group.py index 383aca10e3..5e60ee19e9 100644 --- a/tests/check/python/test_group.py +++ b/tests/check/python/test_group.py @@ -30,7 +30,7 @@ Gst.init(None) GES.init() -class TestCopyPaste(unittest.TestCase): +class TestGroup(unittest.TestCase): def setUp(self): self.timeline = GES.Timeline.new_audio_video() @@ -121,3 +121,31 @@ class TestCopyPaste(unittest.TestCase): clips = self.layer.get_clips() self.assertEqual(len(clips), 3) self.assertEqual(clips[1].props.start, 10) + + def test_move_clips_between_layers_with_auto_transition(self): + self.timeline.props.auto_transition = True + layer2 = self.timeline.append_layer() + clip1 = GES.TestClip.new() + clip1.props.start = 0 + clip1.props.duration = 30 + + clip2 = GES.TestClip.new() + clip2.props.start = 20 + clip2.props.duration = 20 + + self.layer.add_clip(clip1) + self.layer.add_clip(clip2) + + clips = self.layer.get_clips() + self.assertEqual(len(clips), 4) + self.assertEqual(layer2.get_clips(), []) + + group = GES.Container.group(clips) + self.assertIsNotNone(group) + + self.assertTrue(clip1.edit( + self.timeline.get_layers(), 1, GES.EditMode.EDIT_NORMAL, GES.Edge.EDGE_NONE, 0)) + self.assertEqual(self.layer.get_clips(), []) + + clips = layer2.get_clips() + self.assertEqual(len(clips), 4)