timeline: emit snapping-started with new valid time
authorHenry Wilkes <hwilkes@igalia.com>
Mon, 27 Apr 2020 13:05:38 +0000 (14:05 +0100)
committerHenry Wilkes <hwilkes@igalia.com>
Thu, 7 May 2020 08:37:15 +0000 (09:37 +0100)
Only emit snapping-ended if we have a valid snap time. Moreover, we
should emit a new snapping-started even if we are snapping at the same
location. This is because a new snap will always correspond to a new edit,
possibly involving different snapping elements, which a user would want
to know about.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/169>

ges/ges-timeline.c
tests/check/python/test_timeline.py

index 4a9f418693a1a2d7ec10f032be270f2f1b8fac4b..26ed9904a2ee551310fbc4f4673705c4beddb28a 100644 (file)
@@ -1048,22 +1048,15 @@ ges_timeline_emit_snapping (GESTimeline * timeline, GESTrackElement * elem1,
 
   g_assert (elem1 != elem2);
 
-  if (last_snap_ts != snap_time) {
+  if (GST_CLOCK_TIME_IS_VALID (last_snap_ts))
     g_signal_emit (timeline, ges_timeline_signals[SNAPING_ENDED], 0,
         priv->last_snaped1, priv->last_snaped2, (last_snap_ts));
 
-    /* We want the snap start signal to be emited anyway */
-    timeline->priv->last_snap_ts = GST_CLOCK_TIME_NONE;
-  }
-
-  if (!GST_CLOCK_TIME_IS_VALID (timeline->priv->last_snap_ts)) {
-    priv->last_snaped1 = elem1;
-    priv->last_snaped2 = elem2;
-    timeline->priv->last_snap_ts = snap_time;
-    g_signal_emit (timeline, ges_timeline_signals[SNAPING_STARTED], 0,
-        elem1, elem2, snap_time);
-  }
-
+  priv->last_snaped1 = elem1;
+  priv->last_snaped2 = elem2;
+  timeline->priv->last_snap_ts = snap_time;
+  g_signal_emit (timeline, ges_timeline_signals[SNAPING_STARTED], 0,
+      elem1, elem2, snap_time);
 }
 
 /* Accept @self == NULL, making it use default framerate */
index 5534776b62ade30cf55e95246d6e8995e0401c5e..bbd9054cd842f81b8c06c11870a63c729b1e16b6 100644 (file)
@@ -366,6 +366,7 @@ class TestEditing(common.GESSimpleTimelineTest):
             ]
         ])
 
+        # snap to 20
         clip.props.start = 18
         self.assertTimelineTopology([
             [  # Unique layer
@@ -375,6 +376,7 @@ class TestEditing(common.GESSimpleTimelineTest):
         ])
         self.assertEqual(self.snapped_at, [20])
 
+        # no snapping
         clip.props.start = 30
         self.assertTimelineTopology([
             [  # Unique layer
@@ -384,6 +386,7 @@ class TestEditing(common.GESSimpleTimelineTest):
         ])
         self.assertEqual(self.snapped_at, [20, Gst.CLOCK_TIME_NONE])
 
+        # snap to 20
         clip.props.start = 18
         self.assertTimelineTopology([
             [  # Unique layer
@@ -391,8 +394,8 @@ class TestEditing(common.GESSimpleTimelineTest):
                 (GES.TestClip, 20, 10),
             ]
         ])
-        self.assertEqual(self.snapped_at, [20, Gst.CLOCK_TIME_NONE,
-            Gst.CLOCK_TIME_NONE, 20])
+        self.assertEqual(self.snapped_at, [20, Gst.CLOCK_TIME_NONE, 20])
+        # snap to 20 again
         clip.props.start = 19
         self.assertTimelineTopology([
             [  # Unique layer
@@ -400,8 +403,9 @@ class TestEditing(common.GESSimpleTimelineTest):
                 (GES.TestClip, 20, 10),
             ]
         ])
-        self.assertEqual(self.snapped_at, [20, Gst.CLOCK_TIME_NONE,
-            Gst.CLOCK_TIME_NONE, 20])
+        self.assertEqual(
+            self.snapped_at,
+            [20, Gst.CLOCK_TIME_NONE, 20, Gst.CLOCK_TIME_NONE, 20])
 
     def test_rippling_snaps(self):
         self.timeline.props.auto_transition = True