SCENARIOS

* Adding a TimelineObject to a TimelineLayer
--------------------------------------------

 * Create a Timeline

 * Create a Track

 * Add the track to the Timeline (==> ges_timeline_add_track (track);)
   The Timeline adds the Track to itself (i.e. gst_bin_add())
   'track-added' is emitted

 * Create a TimelineLayer

 * Add the TimelineLayer to the Timeline   (ges_timeline_add_layer (layer);)
   The Timeline takes a reference on the layer and stores it
   The Timeline tells the TimelineLayer that it now belongs to the given Timeline (weak reference)
      ==> ges_timeline_layer_set_timeline ();
   'layer-added' is emitted

 * Create a TimelineObject

 * Add the TimelineObject to the TimelineLayer  (ges_timeline_layer_add_object (object);)
   The TimelineLayer takes a reference on the TimelineObject and stores it
   The timelineLayer tells the TimelineObject that it now belongs to the given layer (weak reference)
     ==> ges_timeline_object_set_layer ();
   'object-added' is emitted by TimelineLayer
      The Timeline requests a new TrackObject from the new TimelineObject for each Track
         ==> ges_timeline_object_create_track_object (track)
            The TimelineObject calls the 'create_track_object' virtual method with the given track
               Example implementation
                  Create a GESTrackSource
		    (GESTimelineObject is a constructor property of track objects)
		    A GESTrackObject CAN NOT EXIST WITHOUT A GESTimelineObject !
      The Timeline adds the newly created TrackObject to the Track
        ==> ges_track_add_object (track, trackobject);
          Set the track on the TrackObject
            ==> ges_track_object_set_track (track)
	      The GESTrackObject can create the NleObject



Methods
-------

[ GESTimeline ]

* gboolean
  ges_timeline_add_track (GESTimeline * timeline, GESTrack * track);

    * The Timeline adds the track to itself (gst_bin_add ()) # reference implicitely taken
    * The Timeline adds the track to its list of tracked tracks
    * The Timeline sets the Timeline on the track
       => ges_track_set_timeline (GESTrack * track, GESTimeline * timeline);
          Just sets the timeline field of the track.
    * emits 'track-added'


* gboolean
  ges_timeline_add_layer (GESTimeline * timeline, GESTimelineLayer * layer);

    * The Timeline takes a reference on the layer and stores it
    * The Timeline tells the Layer that it now belongs to the given Timeline
       => ges_timeline_layer_set_timeline (GESTimelineLayer * layer, GESTimeline * timeline);
          Just sets the timeline field of the layer.
    * Connect to the layer's 'object-added' signal
    * emits 'layer-added'


* GESTimeline's
  callback for GESTimelineLayer::object-added (GESTimelineLayer * layer, GESTimelineObject * object);

    * For each GESTrack in the Timeline:
        * The timeline requests a new TrackObject for the new TimelineObject for each Track
            trackobj = ges_timeline_object_create_track_object (timelineobj, track);
	* The timeline adds the newly created TrackObject to the track
            ges_track_add_object (track, trackobj);

[ GESTimelineLayer ]

* gboolean
  ges_timeline_layer_add_object (GESTimelineLayer * layer, GESTimelineObject * object);

    * The TimelineLayer takes a reference on the TimelineObject and stores it
    * The TimelineLayer tells the TimelineObject it now belongs to the given Layer
       => ges_timeline_object_set_layer (GESTimelineObject * object, GESTimelineLayer * layer);
          Just sets the layer field of the timeline object.
    * emits 'object-added'


[ GESTimelineObject ]

* GESTrackObject *
  ges_timeline_object_create_track_object (GESTimelineObject * object, GESTrack * track);

    * The TimelineObject calls the 'create_track_object' virtual method
    * The TimelineObject sets the TimelineObject on the new TrackObject
	 => ges_track_object_set_timeline_object (track_object, timeline_object);
	    Just sets the timeline-object field of the TrackObject
    * Return the newly created GESTrackObject


* Virtual-method for GESTimelineObject::create_track_object (GESTimelineObject * object, GESTrack * track);

    * Create a track object of the proper type
      Ex (for a source) :
         return ges_track_source_new();

* gboolean
  ges_timeline_object_fill_track_object (GESTimelineObject *tlo, GESTrackObject *tro, GstElement *nleobj);

    * up to the implementation :)


[ GESTrack ]

* gboolean
  ges_track_add_object (GESTrack * track, GESTrackObject * object);

    * Set the track on the track_object
      ges_track_object_set_track (object, track);
    * Add the NleObject of the TrackObject to the composition
      gst_bin_add (track->composition, object->nleobject);


[ GESTrackObject ]

* gboolean
  ges_track_object_set_track (GESTrackObject * object, GESTrack * track);

    * Set the track field of the TrackObject
    * if no NleObject is available yet:
        * Call the 'create_gnl_object' virtual method


* Virtual-method for GESTrackObject::create_gnl_object

    * Create a NleObject of the proper type
      Ex : nleobject = gst_element_factory_make("nlesource", NULL);
    * Ask the TimelineObject to fill in the NleObject
      => ges_timeline_object_fill_track_object (GESTimelineObject * tlo, GESTrackObject * tro, GstElement * nleobj);

