internal: Add a element_end_compare
authorThibault Saunier <thibault.saunier@collabora.com>
Sat, 23 Mar 2013 04:33:39 +0000 (01:33 -0300)
committerThibault Saunier <thibault.saunier@collabora.com>
Sat, 23 Mar 2013 04:34:50 +0000 (01:34 -0300)
ges/ges-container.c
ges/ges-internal.h
ges/ges-utils.c

index 149393e..caf4f50 100644 (file)
@@ -520,6 +520,13 @@ _ges_container_sort_children (GESContainer * container)
 }
 
 void
+_ges_container_sort_children_by_end (GESContainer * container)
+{
+  container->children = g_list_sort (container->children,
+      (GCompareFunc) element_end_compare);
+}
+
+void
 _ges_container_set_ignore_notifies (GESContainer * container,
     gboolean ignore_notifies)
 {
index d5bec27..2dd2cdb 100644 (file)
@@ -224,13 +224,17 @@ G_GNUC_INTERNAL void _init_formatter_assets                  (void);
 
 /* Utilities */
 G_GNUC_INTERNAL gint element_start_compare                (GESTimelineElement * a,
-                                                              GESTimelineElement * b);
+                                                           GESTimelineElement * b);
+G_GNUC_INTERNAL gint element_end_compare                  (GESTimelineElement * a,
+                                                           GESTimelineElement * b);
+
 /****************************************************
  *              GESContainer                        *
  ****************************************************/
-G_GNUC_INTERNAL void _ges_container_sort_children       (GESContainer *container);
-G_GNUC_INTERNAL void _ges_container_set_ignore_notifies (GESContainer *container,
-                                                         gboolean ignore_notifies);
+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                         *
index 26245dd..1ce0bbf 100644 (file)
@@ -73,10 +73,27 @@ element_start_compare (GESTimelineElement * a, GESTimelineElement * b)
     if (a->duration > b->duration)
       return 1;
     return 0;
-  }
-  if (a->start < b->start)
+  } else if (a->start < b->start)
     return -1;
-  if (a->start > b->start)
-    return 1;
-  return 0;
+
+  return 1;
+}
+
+gint
+element_end_compare (GESTimelineElement * a, GESTimelineElement * b)
+{
+  if (GES_TIMELINE_ELEMENT_END (a) == GES_TIMELINE_ELEMENT_END (b)) {
+    if (a->priority < b->priority)
+      return -1;
+    if (a->priority > b->priority)
+      return 1;
+    if (a->duration < b->duration)
+      return -1;
+    if (a->duration > b->duration)
+      return 1;
+    return 0;
+  } else if (GES_TIMELINE_ELEMENT_END (a) < (GES_TIMELINE_ELEMENT_END (b)))
+    return -1;
+
+  return 1;
 }