timeline-object: Properly reflect contained TrackObject duration and inpoint properti...
authorThibault Saunier <thibault.saunier@collabora.com>
Fri, 30 Mar 2012 07:40:50 +0000 (03:40 -0400)
committerThibault Saunier <thibault.saunier@collabora.com>
Sun, 8 Apr 2012 02:24:55 +0000 (22:24 -0400)
ges/ges-timeline-object.c

index d446b87..a27c60c 100644 (file)
@@ -1593,18 +1593,54 @@ static void
 track_object_inpoint_changed_cb (GESTrackObject * child,
     GParamSpec * arg G_GNUC_UNUSED, GESTimelineObject * object)
 {
+  ObjectMapping *map;
+
   if (object->priv->ignore_notifies)
     return;
 
+  map = find_object_mapping (object, child);
+  if (G_UNLIKELY (map == NULL))
+    /* something massively screwed up if we get this */
+    return;
+
+  if (!ges_track_object_is_locked (child)) {
+    /* Update the internal start_offset */
+    map->inpoint_offset = object->inpoint - child->inpoint;
+  } else {
+    /* Or update the parent start */
+    object->priv->initiated_move = child;
+    ges_timeline_object_set_inpoint (object,
+        child->inpoint + map->inpoint_offset);
+    object->priv->initiated_move = NULL;
+  }
+
 }
 
 static void
 track_object_duration_changed_cb (GESTrackObject * child,
     GParamSpec * arg G_GNUC_UNUSED, GESTimelineObject * object)
 {
+  ObjectMapping *map;
+
   if (object->priv->ignore_notifies)
     return;
 
+  map = find_object_mapping (object, child);
+  if (G_UNLIKELY (map == NULL))
+    /* something massively screwed up if we get this */
+    return;
+
+  if (!ges_track_object_is_locked (child)) {
+    /* Update the internal start_offset */
+    map->duration_offset = object->duration - child->duration;
+  } else {
+    /* Or update the parent start */
+    object->priv->initiated_move = child;
+    ges_timeline_object_set_duration (object,
+        child->duration + map->duration_offset);
+    object->priv->initiated_move = NULL;
+  }
+
 }
 
 static void