GESTimelineLayer: Add a 'priority' property
authorEdward Hervey <bilboed@bilboed.com>
Fri, 12 Mar 2010 18:06:42 +0000 (19:06 +0100)
committerEdward Hervey <bilboed@bilboed.com>
Sat, 13 Mar 2010 14:56:57 +0000 (15:56 +0100)
docs/libs/ges-sections.txt
ges/ges-timeline-layer.c
ges/ges-timeline-layer.h

index 74622294a8fc630241b06491442a0ad0647f733d..dfb83b25662acb56f670effe89a5228dcc251615 100644 (file)
@@ -123,6 +123,7 @@ GESTimelineLayerClass
 ges_timeline_layer_add_object
 ges_timeline_layer_new
 ges_timeline_layer_remove_object
+ges_timeline_layer_set_priority
 <SUBSECTION Standard>
 ges_timeline_layer_set_timeline
 ges_timeline_layer_get_type
index 6691d5937141c49a3f1e50b03c6e00604d5394b0..4aa57d21629643998c67d4e1a8af48b9bac91f00 100644 (file)
 
 G_DEFINE_TYPE (GESTimelineLayer, ges_timeline_layer, G_TYPE_OBJECT);
 
+enum
+{
+  PROP_0,
+  PROP_PRIORITY,
+};
+
 enum
 {
   OBJECT_ADDED,
@@ -45,7 +51,12 @@ static void
 ges_timeline_layer_get_property (GObject * object, guint property_id,
     GValue * value, GParamSpec * pspec)
 {
+  GESTimelineLayer *layer = GES_TIMELINE_LAYER (object);
+
   switch (property_id) {
+    case PROP_PRIORITY:
+      g_value_set_uint (value, layer->priority);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
   }
@@ -55,7 +66,12 @@ static void
 ges_timeline_layer_set_property (GObject * object, guint property_id,
     const GValue * value, GParamSpec * pspec)
 {
+  GESTimelineLayer *layer = GES_TIMELINE_LAYER (object);
+
   switch (property_id) {
+    case PROP_PRIORITY:
+      ges_timeline_layer_set_priority (layer, g_value_get_uint (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
   }
@@ -90,6 +106,16 @@ ges_timeline_layer_class_init (GESTimelineLayerClass * klass)
   object_class->dispose = ges_timeline_layer_dispose;
   object_class->finalize = ges_timeline_layer_finalize;
 
+  /**
+   * GESTimelineLayer:priority
+   *
+   * The priority of the layer in the #GESTimeline. 0 is the highest
+   * priority.
+   */
+  g_object_class_install_property (object_class, PROP_PRIORITY,
+      g_param_spec_uint ("priority", "Priority",
+          "The priority of the layer", 0, G_MAXUINT, 0, G_PARAM_READWRITE));
+
   /**
    * GESTimelineLayer::object-added
    * @layer: the #GESTimelineLayer
@@ -121,6 +147,10 @@ ges_timeline_layer_class_init (GESTimelineLayerClass * klass)
 static void
 ges_timeline_layer_init (GESTimelineLayer * self)
 {
+  /* TODO : Keep those 3 values in sync */
+  self->priority = 0;
+  self->min_gnl_priority = 0;
+  self->max_gnl_priority = 9;
 }
 
 /**
@@ -193,6 +223,9 @@ ges_timeline_layer_add_object (GESTimelineLayer * layer,
   /* Inform the object it's now in this layer */
   ges_timeline_object_set_layer (object, layer);
 
+  /* Set the priority. */
+  ges_timeline_object_set_priority (object, layer->min_gnl_priority);
+
   /* emit 'object-added' */
   g_signal_emit (layer, ges_timeline_layer_signals[OBJECT_ADDED], 0, object);
 
@@ -236,3 +269,44 @@ ges_timeline_layer_remove_object (GESTimelineLayer * layer,
 
   return TRUE;
 }
+
+/**
+ * ges_timeline_layer_resync_priorities:
+ * @layer: a #GESTimelineLayer
+ *
+ * Resyncs the priorities of the objects controlled by @layer.
+ * This method */
+gboolean
+ges_timeline_layer_resync_priorities (GESTimelineLayer * layer)
+{
+  GSList *tmp;
+
+  /* TODO : Inhibit composition updates while doing this.
+   * Ideally we want to do it from an even higher level, but here will
+   * do in the meantime. */
+
+  /* TODO : This is the dumb version where we put everything linearly,
+   * will need to be adjusted for more complex usages (like with
+   * transitions).  */
+  for (tmp = layer->objects_start; tmp; tmp = tmp->next) {
+    ges_timeline_object_set_priority ((GESTimelineObject *) tmp->data,
+        layer->min_gnl_priority);
+  }
+
+  return TRUE;
+}
+
+void
+ges_timeline_layer_set_priority (GESTimelineLayer * layer, guint priority)
+{
+  GST_DEBUG ("layer:%p, priority:%d", layer, priority);
+
+  if (priority != layer->priority) {
+    layer->priority = priority;
+    layer->min_gnl_priority = (priority * 10);
+    layer->max_gnl_priority = ((priority + 1) * 10) - 1;
+
+    /* FIXME : Update controlled object's gnl priority accordingly */
+    ges_timeline_layer_resync_priorities (layer);
+  }
+}
index 6441d0b1d5592bb88127af58ec12f0e9f0924d1b..d8191a08f055e5576ef136e9e3ea61cdf5bcc64b 100644 (file)
@@ -46,9 +46,17 @@ G_BEGIN_DECLS
 struct _GESTimelineLayer {
   GObject parent;
 
-  GESTimeline *timeline;       /* The timeline where this layer is being used */
+  GESTimeline *timeline;       /* The timeline where this layer is being used
+                                */
 
-  GSList * objects_start;      /* The TimelineObjects sorted by start and priority */
+  GSList * objects_start;      /* The TimelineObjects sorted by start and
+                                * priority */
+
+  guint32 priority;            /* The priority of the layer within the 
+                                * containing timeline */
+
+  /*< private >*/
+  guint32 min_gnl_priority, max_gnl_priority;
 };
 
 struct _GESTimelineLayerClass {
@@ -67,6 +75,8 @@ void ges_timeline_layer_set_timeline (GESTimelineLayer * layer, GESTimeline * ti
 gboolean ges_timeline_layer_add_object (GESTimelineLayer * layer, GESTimelineObject * object);
 gboolean ges_timeline_layer_remove_object (GESTimelineLayer * layer, GESTimelineObject * object);
 
+void ges_timeline_layer_set_priority (GESTimelineLayer * layer, guint priority);
+
 G_END_DECLS
 
 #endif /* _GES_TIMELINE_LAYER */