container: Replace ignore_notify by a GESChildrenControlMode flag
authorThibault Saunier <thibault.saunier@collabora.com>
Sat, 23 Mar 2013 06:26:33 +0000 (03:26 -0300)
committerThibault Saunier <thibault.saunier@collabora.com>
Sat, 23 Mar 2013 06:26:33 +0000 (03:26 -0300)
ges/ges-clip.c
ges/ges-container.c
ges/ges-container.h
ges/ges-internal.h

index 5e43068..7b3a021 100644 (file)
@@ -144,11 +144,12 @@ _add_child (GESContainer * container, GESTimelineElement * element)
 
   /* We set the timing value of the child to ours, we avoid infinite loop
    * making sure the container ignore notifies from the child */
-  _ges_container_set_ignore_notifies (container, TRUE);
+  _ges_container_set_children_control_mode (container,
+      GES_CHILDREN_IGNORE_NOTIFIES);
   _set_start0 (element, GES_TIMELINE_ELEMENT_START (container));
   _set_inpoint0 (element, GES_TIMELINE_ELEMENT_INPOINT (container));
   _set_duration0 (element, GES_TIMELINE_ELEMENT_DURATION (container));
-  _ges_container_set_ignore_notifies (container, FALSE);
+  _ges_container_set_children_control_mode (container, GES_CHILDREN_UPDATE);
 
   return TRUE;
 }
index ac4a35f..c088602 100644 (file)
@@ -76,7 +76,7 @@ struct _GESContainerPrivate
   /* Set to TRUE when the container is doing updates of track object
    * properties so we don't end up in infinite property update loops
    */
-  gboolean ignore_notifies;
+  GESChildrenControlMode children_control_mode;
   GHashTable *mappings;
   guint nb_effects;
   GESTimelineElement *initiated_move;
@@ -157,7 +157,7 @@ _set_start (GESTimelineElement * element, GstClockTime start)
   GST_DEBUG_OBJECT (element, "Setting children start, (initiated_move: %"
       GST_PTR_FORMAT ")", container->priv->initiated_move);
 
-  container->priv->ignore_notifies = TRUE;
+  container->priv->children_control_mode = GES_CHILDREN_IGNORE_NOTIFIES;
   for (tmp = container->children; tmp; tmp = g_list_next (tmp)) {
     GESTimelineElement *child = (GESTimelineElement *) tmp->data;
 
@@ -183,7 +183,7 @@ _set_start (GESTimelineElement * element, GstClockTime start)
       map->start_offset = start - _START (child);
     }
   }
-  container->priv->ignore_notifies = FALSE;
+  priv->children_control_mode = GES_CHILDREN_UPDATE;
 
   return TRUE;
 }
@@ -194,7 +194,7 @@ _set_inpoint (GESTimelineElement * element, GstClockTime inpoint)
   GList *tmp;
   GESContainer *container = GES_CONTAINER (element);
 
-  container->priv->ignore_notifies = TRUE;
+  container->priv->children_control_mode = GES_CHILDREN_IGNORE_NOTIFIES;
   for (tmp = container->children; tmp; tmp = g_list_next (tmp)) {
     GESTimelineElement *child = (GESTimelineElement *) tmp->data;
     ChildMapping *map = g_hash_table_lookup (container->priv->mappings, child);
@@ -206,7 +206,7 @@ _set_inpoint (GESTimelineElement * element, GstClockTime inpoint)
 
     _set_inpoint0 (child, inpoint);
   }
-  container->priv->ignore_notifies = FALSE;
+  container->priv->children_control_mode = GES_CHILDREN_UPDATE;
 
   return TRUE;
 }
@@ -220,7 +220,7 @@ _set_duration (GESTimelineElement * element, GstClockTime duration)
   GESContainer *container = GES_CONTAINER (element);
   GESContainerPrivate *priv = container->priv;
 
-  priv->ignore_notifies = TRUE;
+  priv->children_control_mode = GES_CHILDREN_IGNORE_NOTIFIES;
   for (tmp = container->children; tmp; tmp = g_list_next (tmp)) {
     GESTimelineElement *child = (GESTimelineElement *) tmp->data;
     ChildMapping *map = g_hash_table_lookup (priv->mappings, child);
@@ -236,7 +236,7 @@ _set_duration (GESTimelineElement * element, GstClockTime duration)
             NULL, GES_EDGE_END, _START (child) + duration, TRUE) == FALSE)
       _set_duration0 (GES_TIMELINE_ELEMENT (child), duration);
   }
-  priv->ignore_notifies = FALSE;
+  priv->children_control_mode = GES_CHILDREN_UPDATE;
 
   return TRUE;
 }
@@ -267,7 +267,7 @@ _set_priority (GESTimelineElement * element, guint32 priority)
   GES_CONTAINER_GET_CLASS (element)->get_priorty_range (container, &min_prio,
       &max_prio);
 
-  priv->ignore_notifies = TRUE; /*  */
+  priv->children_control_mode = GES_CHILDREN_IGNORE_NOTIFIES;
   for (tmp = container->children; tmp; tmp = g_list_next (tmp)) {
     GESTimelineElement *child = (GESTimelineElement *) tmp->data;
     ChildMapping *map = g_hash_table_lookup (priv->mappings, child);
@@ -282,7 +282,7 @@ _set_priority (GESTimelineElement * element, guint32 priority)
     }
     _set_priority0 (child, real_tck_prio);
   }
-  priv->ignore_notifies = FALSE;
+  priv->children_control_mode = GES_CHILDREN_UPDATE;
 
   update_height (container);
 
@@ -423,7 +423,7 @@ _child_start_changed_cb (GESTimelineElement * child,
   GESContainerPrivate *priv = container->priv;
   GESTimelineElement *element = GES_TIMELINE_ELEMENT (container);
 
-  if (priv->ignore_notifies)
+  if (priv->children_control_mode == GES_CHILDREN_IGNORE_NOTIFIES)
     return;
 
   map = g_hash_table_lookup (priv->mappings, child);
@@ -447,7 +447,7 @@ _child_inpoint_changed_cb (GESTimelineElement * child,
   GESContainerPrivate *priv = container->priv;
   GESTimelineElement *element = GES_TIMELINE_ELEMENT (container);
 
-  if (priv->ignore_notifies)
+  if (priv->children_control_mode == GES_CHILDREN_IGNORE_NOTIFIES)
     return;
 
   map = g_hash_table_lookup (priv->mappings, child);
@@ -468,7 +468,7 @@ _child_duration_changed_cb (GESTimelineElement * child,
   GESContainerPrivate *priv = container->priv;
   GESTimelineElement *element = GES_TIMELINE_ELEMENT (container);
 
-  if (priv->ignore_notifies)
+  if (priv->children_control_mode == GES_CHILDREN_IGNORE_NOTIFIES)
     return;
 
   map = g_hash_table_lookup (priv->mappings, child);
@@ -491,7 +491,7 @@ _child_priority_changed_cb (GESTimelineElement * child,
   GST_DEBUG_OBJECT (container, "TimelineElement %p priority changed to %i",
       child, _PRIORITY (child));
 
-  if (priv->ignore_notifies)
+  if (priv->children_control_mode == GES_CHILDREN_IGNORE_NOTIFIES)
     return;
 
   update_height (container);
@@ -527,10 +527,10 @@ _ges_container_sort_children_by_end (GESContainer * container)
 }
 
 void
-_ges_container_set_ignore_notifies (GESContainer * container,
-    gboolean ignore_notifies)
+_ges_container_set_children_control_mode (GESContainer * container,
+    GESChildrenControlMode children_control_mode)
 {
-  container->priv->ignore_notifies = ignore_notifies;
+  container->priv->children_control_mode = children_control_mode;
 }
 
 /**********************************************
@@ -565,15 +565,15 @@ ges_container_add (GESContainer * container, GESTimelineElement * child)
   GST_DEBUG_OBJECT (container, "adding timeline element %" GST_PTR_FORMAT,
       child);
 
-  priv->ignore_notifies = TRUE;
+  priv->children_control_mode = GES_CHILDREN_IGNORE_NOTIFIES;
   if (class->add_child) {
     if (class->add_child (container, child) == FALSE) {
-      priv->ignore_notifies = FALSE;
+      priv->children_control_mode = GES_CHILDREN_UPDATE;
       GST_WARNING_OBJECT (container, "Erreur adding child %p", child);
       return FALSE;
     }
   }
-  priv->ignore_notifies = FALSE;
+  priv->children_control_mode = GES_CHILDREN_UPDATE;
 
   mapping = g_slice_new0 (ChildMapping);
   mapping->child = gst_object_ref (child);
index bfd5760..1f6a571 100644 (file)
@@ -38,6 +38,14 @@ G_BEGIN_DECLS
 
 typedef struct _GESContainerPrivate GESContainerPrivate;
 
+/* To be used by sublcasses only */
+typedef enum
+{
+  GES_CHILDREN_UPDATE,
+  GES_CHILDREN_IGNORE_NOTIFIES,
+  GES_CHILDREN_UPDATE_OFFSETS,
+} GESChildrenControlMode;
+
 /**
  * GES_CONTAINER_HEIGHT:
  * @obj: a #GESContainer
@@ -123,5 +131,9 @@ gboolean ges_container_remove     (GESContainer *container, GESTimelineElement *
 GList * ges_container_ungroup     (GESContainer * container, gboolean recursive);
 GESContainer *ges_container_group (GList *containers);
 
+/* To be used by subclasses only */
+void _ges_container_set_children_control_mode (GESContainer * container,
+                                               GESChildrenControlMode children_control_mode);
+
 G_END_DECLS
 #endif /* _GES_CONTAINER */
index 2dd2cdb..246471b 100644 (file)
@@ -233,8 +233,6 @@ G_GNUC_INTERNAL gint element_end_compare                  (GESTimelineElement *
  ****************************************************/
 G_GNUC_INTERNAL void _ges_container_sort_children         (GESContainer *container);
 G_GNUC_INTERNAL void _ges_container_sort_children_by_end  (GESContainer *container);
-G_GNUC_INTERNAL void _ges_container_set_ignore_notifies   (GESContainer *container,
-                                                           gboolean ignore_notifies);
 
 /****************************************************
  *                  GESClip                         *