timeline: emit snapping-started with new valid time

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>
This commit is contained in:
Henry Wilkes 2020-04-27 14:05:38 +01:00
parent 39097f5574
commit cda1cfa0df
2 changed files with 14 additions and 17 deletions

View file

@ -1048,22 +1048,15 @@ ges_timeline_emit_snapping (GESTimeline * timeline, GESTrackElement * elem1,
g_assert (elem1 != elem2); 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, g_signal_emit (timeline, ges_timeline_signals[SNAPING_ENDED], 0,
priv->last_snaped1, priv->last_snaped2, (last_snap_ts)); priv->last_snaped1, priv->last_snaped2, (last_snap_ts));
/* We want the snap start signal to be emited anyway */ priv->last_snaped1 = elem1;
timeline->priv->last_snap_ts = GST_CLOCK_TIME_NONE; priv->last_snaped2 = elem2;
} timeline->priv->last_snap_ts = snap_time;
g_signal_emit (timeline, ges_timeline_signals[SNAPING_STARTED], 0,
if (!GST_CLOCK_TIME_IS_VALID (timeline->priv->last_snap_ts)) { 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 */ /* Accept @self == NULL, making it use default framerate */

View file

@ -366,6 +366,7 @@ class TestEditing(common.GESSimpleTimelineTest):
] ]
]) ])
# snap to 20
clip.props.start = 18 clip.props.start = 18
self.assertTimelineTopology([ self.assertTimelineTopology([
[ # Unique layer [ # Unique layer
@ -375,6 +376,7 @@ class TestEditing(common.GESSimpleTimelineTest):
]) ])
self.assertEqual(self.snapped_at, [20]) self.assertEqual(self.snapped_at, [20])
# no snapping
clip.props.start = 30 clip.props.start = 30
self.assertTimelineTopology([ self.assertTimelineTopology([
[ # Unique layer [ # Unique layer
@ -384,6 +386,7 @@ class TestEditing(common.GESSimpleTimelineTest):
]) ])
self.assertEqual(self.snapped_at, [20, Gst.CLOCK_TIME_NONE]) self.assertEqual(self.snapped_at, [20, Gst.CLOCK_TIME_NONE])
# snap to 20
clip.props.start = 18 clip.props.start = 18
self.assertTimelineTopology([ self.assertTimelineTopology([
[ # Unique layer [ # Unique layer
@ -391,8 +394,8 @@ class TestEditing(common.GESSimpleTimelineTest):
(GES.TestClip, 20, 10), (GES.TestClip, 20, 10),
] ]
]) ])
self.assertEqual(self.snapped_at, [20, Gst.CLOCK_TIME_NONE, self.assertEqual(self.snapped_at, [20, Gst.CLOCK_TIME_NONE, 20])
Gst.CLOCK_TIME_NONE, 20]) # snap to 20 again
clip.props.start = 19 clip.props.start = 19
self.assertTimelineTopology([ self.assertTimelineTopology([
[ # Unique layer [ # Unique layer
@ -400,8 +403,9 @@ class TestEditing(common.GESSimpleTimelineTest):
(GES.TestClip, 20, 10), (GES.TestClip, 20, 10),
] ]
]) ])
self.assertEqual(self.snapped_at, [20, Gst.CLOCK_TIME_NONE, self.assertEqual(
Gst.CLOCK_TIME_NONE, 20]) self.snapped_at,
[20, Gst.CLOCK_TIME_NONE, 20, Gst.CLOCK_TIME_NONE, 20])
def test_rippling_snaps(self): def test_rippling_snaps(self):
self.timeline.props.auto_transition = True self.timeline.props.auto_transition = True