GESTimelineObject: add track_object_added and track_object_removed virtual methods

Those methods are meant to be used in sublassed when needed. They are not doing
anything at this time, but will be used to clean some code in GESTimelineObject
sublcasses.
This commit is contained in:
Thibault Saunier 2011-04-26 19:39:56 -04:00 committed by Edward Hervey
parent 6e0d6ba9c5
commit d5734ab94f
2 changed files with 26 additions and 3 deletions

View file

@ -190,6 +190,8 @@ ges_timeline_object_class_init (GESTimelineObjectClass * klass)
object_class->get_property = ges_timeline_object_get_property;
object_class->set_property = ges_timeline_object_set_property;
klass->create_track_objects = ges_timeline_object_create_track_objects_func;
klass->track_object_added = NULL;
klass->track_object_released = NULL;
/**
* GESTimelineObject:start
@ -404,6 +406,7 @@ ges_timeline_object_add_track_object (GESTimelineObject * object, GESTrackObject
GList *tmp;
GESTimelineObjectPrivate *priv = object->priv;
gboolean is_effect = GES_IS_TRACK_EFFECT (trobj);
GESTimelineObjectClass *klass = GES_TIMELINE_OBJECT_GET_CLASS (object);
GST_LOG ("Got a TrackObject : %p , setting the timeline object as its"
"creator. Is a TrackEffect %i", trobj, is_effect);
@ -462,6 +465,14 @@ ges_timeline_object_add_track_object (GESTimelineObject * object, GESTrackObject
ges_track_object_set_duration (trobj, object->duration);
ges_track_object_set_inpoint (trobj, object->inpoint);
if (klass->track_object_added) {
GST_DEBUG ("Calling track_object_added subclass method");
klass->track_object_added (object, trobj);
} else {
GST_DEBUG ("%s doesn't have any track_object_added vfunc implementation",
G_OBJECT_CLASS_NAME (klass));
}
/* Listen to all property changes */
mapping->start_notifyid =
g_signal_connect (G_OBJECT (trobj), "notify::start",
@ -499,6 +510,7 @@ ges_timeline_object_release_track_object (GESTimelineObject * object,
{
GList *tmp;
ObjectMapping *mapping = NULL;
GESTimelineObjectClass *klass = GES_TIMELINE_OBJECT_GET_CLASS (object);
GST_DEBUG ("object:%p, trackobject:%p", object, trackobject);
@ -507,9 +519,6 @@ ges_timeline_object_release_track_object (GESTimelineObject * object,
return FALSE;
}
/* FIXME : Do we need to tell the subclasses ?
* If so, add a new virtual-method */
for (tmp = object->priv->mappings; tmp; tmp = tmp->next) {
mapping = (ObjectMapping *) tmp->data;
if (mapping->object == trackobject)
@ -542,6 +551,11 @@ ges_timeline_object_release_track_object (GESTimelineObject * object,
GST_DEBUG ("Removing reference to track object %p", trackobject);
if (klass->track_object_released) {
GST_DEBUG ("Calling track_object_released subclass method");
klass->track_object_released (object, trackobject);
}
g_object_unref (trackobject);
/* FIXME : resync properties ? */

View file

@ -181,6 +181,10 @@ struct _GESTimelineObject {
* #GESTrack.
* @fill_track_object: method to fill an associated #GESTrackObject.
* @need_fill_track: Set to TRUE if @fill_track_object needs to be called.
* @track_object_added: Should be overridden by subclasses if they need to perform an
* operation when a #GESTrackObject is added.
* @track_object_released: Should be overridden by subclassed if they need to perform
* action when a #GESTrackObject is released.
*
* Subclasses can override the @create_track_object and @fill_track_object methods.
*/
@ -192,6 +196,11 @@ struct _GESTimelineObjectClass {
GESCreateTrackObjectFunc create_track_object;
GESCreateTrackObjectsFunc create_track_objects;
void (*track_object_added) (GESTimelineObject *object,
GESTrackObject *tck_object);
void (*track_object_released) (GESTimelineObject *object,
GESTrackObject *tck_object);
/* FIXME : might need a release_track_object */
GESFillTrackObjectFunc fill_track_object;
gboolean need_fill_track;