Ejemplo n.º 1
0
 def __init__(self, log):
     self.log = log
     self.clip_property_trackers = {}
     self.interpolator_keyframe_trackers = {}
     self.effect_properties_tracker = EffectGstElementPropertyChangeTracker(log)
     self._pipeline = None
Ejemplo n.º 2
0
class TimelineLogObserver(object):
    timelinePropertyChangedAction = ClipPropertyChanged
    ClipAddedAction = ClipAdded
    ClipRemovedAction = ClipRemoved
    effectAddAction = EffectAdded
    effectRemovedAction = EffectRemoved
    interpolatorKeyframeAddedAction = InterpolatorKeyframeAdded
    interpolatorKeyframeRemovedAction = InterpolatorKeyframeRemoved
    interpolatorKeyframeChangedAction = InterpolatorKeyframeChanged
    activePropertyChangedAction = ActivePropertyChanged

    def __init__(self, log):
        self.log = log
        self.clip_property_trackers = {}
        self.interpolator_keyframe_trackers = {}
        self.effect_properties_tracker = EffectGstElementPropertyChangeTracker(log)
        self._pipeline = None

    def setPipeline(self, pipeline):
        self._pipeline = pipeline
        self.effect_properties_tracker.pipeline = pipeline

    def getPipeline(self):
        return self._pipeline

    pipeline = property(getPipeline, setPipeline)

    def startObserving(self, timeline):
        self._connectToTimeline(timeline)
        for layer in timeline.get_layers():
            for clip in layer.get_clips():
                self._connectToClip(clip)
                for track_element in clip.track_elements:
                    self._connectToTrackElement(track_element)

    def stopObserving(self, timeline):
        self._disconnectFromTimeline(timeline)
        for clip in timeline.clips:
            self._disconnectFromClip(clip)
            for track_element in clip.track_elements:
                self._disconnectFromTrackElement(track_element)

    def _connectToTimeline(self, timeline):
        for layer in timeline.get_layers():
            layer.connect("clip-added", self._clipAddedCb)
            layer.connect("clip-removed", self._clipRemovedCb)

    def _disconnectFromTimeline(self, timeline):
        timeline.disconnect_by_func(self._clipAddedCb)
        timeline.disconnect_by_func(self._clipRemovedCb)

    def _connectToClip(self, clip):
        tracker = ClipPropertyChangeTracker()
        tracker.connectToObject(clip)
        for property_name in tracker.property_names:
            tracker.connect("notify::" + property_name, self._clipPropertyChangedCb, property_name)
        self.clip_property_trackers[clip] = tracker

        clip.connect("track-element-added", self._clipTrackElementAddedCb)
        clip.connect("track-element-removed", self._clipTrackElementRemovedCb)
        for element in clip.get_track_elements():
            self._connectToTrackElement(element)

    def _disconnectFromClip(self, clip):
        tracker = self.clip_property_trackers.pop(clip)
        tracker.disconnectFromObject(clip)
        tracker.disconnect_by_func(self._clipPropertyChangedCb)

    def _connectToTrackElement(self, track_element):
        # FIXME: keyframes are disabled:
        # for prop, interpolator in track_element.getInterpolators().itervalues():
        # self._connectToInterpolator(interpolator)
        if isinstance(track_element, GES.BaseEffect):
            self.effect_properties_tracker.addEffectElement(track_element.getElement())

    def _disconnectFromTrackElement(self, track_element):
        for prop, interpolator in track_element.getInterpolators().itervalues():
            self._disconnectFromInterpolator(interpolator)

    def _connectToInterpolator(self, interpolator):
        interpolator.connect("keyframe-added", self._interpolatorKeyframeAddedCb)
        interpolator.connect("keyframe-removed", self._interpolatorKeyframeRemovedCb)
        tracker = KeyframeChangeTracker()
        tracker.connectToObject(interpolator)
        tracker.connect("keyframe-moved", self._interpolatorKeyframeMovedCb)
        self.interpolator_keyframe_trackers[interpolator] = tracker

    def _disconnectFromInterpolator(self, interpolator):
        tracker = self.interpolator_keyframe_trackers.pop(interpolator)
        tracker.disconnectFromObject(interpolator)
        tracker.disconnect_by_func(self._interpolatorKeyframeMovedCb)

    def _clipAddedCb(self, timeline, clip):
        self._connectToClip(clip)
        action = self.ClipAddedAction(timeline, clip)
        self.log.push(action)

    def _clipRemovedCb(self, timeline, clip):
        self._disconnectFromClip(clip)
        action = self.ClipRemovedAction(timeline, clip)
        self.log.push(action)

    def _clipPropertyChangedCb(self, tracker, clip, old_value, new_value, property_name):
        action = self.timelinePropertyChangedAction(clip, property_name, old_value, new_value)
        self.log.push(action)

    def _clipTrackElementAddedCb(self, clip, track_element):
        if isinstance(track_element, GES.BaseEffect):
            action = self.effectAddAction(clip, track_element, self.effect_properties_tracker)
            # We use the action instead of the track element
            # because the track_element changes when redoing
            track_element.connect("active-changed", self._trackElementActiveChangedCb, action)
            self.log.push(action)
            element = track_element.getElement()
            if element:
                self.effect_properties_tracker.addEffectElement(element)
        else:
            self._connectToTrackElement(track_element)

    def _clipTrackElementRemovedCb(self, clip, track_element):
        if isinstance(track_element, GES.BaseEffect):
            action = self.effectRemovedAction(clip, track_element, self.effect_properties_tracker)
            self.log.push(action)
        else:
            self._disconnectFromTrackElement(track_element)

    def _interpolatorKeyframeAddedCb(self, track_element, keyframe):
        action = self.interpolatorKeyframeAddedAction(track_element, keyframe)
        self.log.push(action)

    def _interpolatorKeyframeRemovedCb(self, track_element, keyframe, old_value=None):
        action = self.interpolatorKeyframeRemovedAction(track_element, keyframe)
        self.log.push(action)

    def _trackElementActiveChangedCb(self, track_element, active, add_effect_action):
        """
        This happens when an effect is (de)activated on a clip in the timeline.
        """
        action = self.activePropertyChangedAction(add_effect_action, active)
        self.log.push(action)

    def _interpolatorKeyframeMovedCb(self, tracker, track_element, keyframe, old_snapshot, new_snapshot):
        action = self.interpolatorKeyframeChangedAction(track_element, keyframe, old_snapshot, new_snapshot)
        self.log.push(action)
Ejemplo n.º 3
0
class TimelineLogObserver(object):
    timelinePropertyChangedAction = ClipPropertyChanged
    ClipAddedAction = ClipAdded
    ClipRemovedAction = ClipRemoved
    effectAddAction = EffectAdded
    effectRemovedAction = EffectRemoved
    interpolatorKeyframeAddedAction = InterpolatorKeyframeAdded
    interpolatorKeyframeRemovedAction = InterpolatorKeyframeRemoved
    interpolatorKeyframeChangedAction = InterpolatorKeyframeChanged
    activePropertyChangedAction = ActivePropertyChanged

    def __init__(self, log):
        self.log = log
        self.clip_property_trackers = {}
        self.interpolator_keyframe_trackers = {}
        self.effect_properties_tracker = EffectGstElementPropertyChangeTracker(log)
        self._pipeline = None

    def setPipeline(self, pipeline):
        self._pipeline = pipeline
        self.effect_properties_tracker.pipeline = pipeline

    def getPipeline(self):
        return self._pipeline

    pipeline = property(getPipeline, setPipeline)

    def startObserving(self, timeline):
        self._connectToTimeline(timeline)
        for layer in timeline.get_layers():
            for clip in layer.get_clips():
                self._connectToClip(clip)
                for track_element in clip.track_elements:
                    self._connectToTrackElement(track_element)

    def stopObserving(self, timeline):
        self._disconnectFromTimeline(timeline)
        for clip in timeline.clips:
            self._disconnectFromClip(clip)
            for track_element in clip.track_elements:
                self._disconnectFromTrackElement(track_element)

    def _connectToTimeline(self, timeline):
        for layer in timeline.get_layers():
            layer.connect("clip-added", self._clipAddedCb)
            layer.connect("clip-removed", self._clipRemovedCb)

    def _disconnectFromTimeline(self, timeline):
        timeline.disconnect_by_func(self._clipAddedCb)
        timeline.disconnect_by_func(self._clipRemovedCb)

    def _connectToClip(self, clip):
        tracker = ClipPropertyChangeTracker()
        tracker.connectToObject(clip)
        for property_name in tracker.property_names:
            tracker.connect("notify::" + property_name,
                    self._clipPropertyChangedCb, property_name)
        self.clip_property_trackers[clip] = tracker

        clip.connect("child-added", self._clipTrackElementAddedCb)
        clip.connect("child-removed", self._clipTrackElementRemovedCb)
        for element in clip.get_children():
            self._connectToTrackElement(element)

    def _disconnectFromClip(self, clip):
        tracker = self.clip_property_trackers.pop(clip)
        tracker.disconnectFromObject(clip)
        tracker.disconnect_by_func(self._clipPropertyChangedCb)

    def _connectToTrackElement(self, track_element):
        # FIXME: keyframes are disabled:
        #for prop, interpolator in track_element.getInterpolators().itervalues():
            #self._connectToInterpolator(interpolator)
        if isinstance(track_element, GES.BaseEffect):
            self.effect_properties_tracker.addEffectElement(track_element.getElement())

    def _disconnectFromTrackElement(self, track_element):
        for prop, interpolator in track_element.getInterpolators().itervalues():
            self._disconnectFromInterpolator(interpolator)

    def _connectToInterpolator(self, interpolator):
        interpolator.connect("keyframe-added", self._interpolatorKeyframeAddedCb)
        interpolator.connect("keyframe-removed", self._interpolatorKeyframeRemovedCb)
        tracker = KeyframeChangeTracker()
        tracker.connectToObject(interpolator)
        tracker.connect("keyframe-moved", self._interpolatorKeyframeMovedCb)
        self.interpolator_keyframe_trackers[interpolator] = tracker

    def _disconnectFromInterpolator(self, interpolator):
        tracker = self.interpolator_keyframe_trackers.pop(interpolator)
        tracker.disconnectFromObject(interpolator)
        tracker.disconnect_by_func(self._interpolatorKeyframeMovedCb)

    def _clipAddedCb(self, timeline, clip):
        self._connectToClip(clip)
        action = self.ClipAddedAction(timeline, clip)
        self.log.push(action)

    def _clipRemovedCb(self, timeline, clip):
        self._disconnectFromClip(clip)
        action = self.ClipRemovedAction(timeline, clip)
        self.log.push(action)

    def _clipPropertyChangedCb(self, tracker, clip,
            old_value, new_value, property_name):
        action = self.timelinePropertyChangedAction(clip,
                property_name, old_value, new_value)
        self.log.push(action)

    def _clipTrackElementAddedCb(self, clip, track_element):
        if isinstance(track_element, GES.BaseEffect):
            action = self.effectAddAction(clip, track_element,
                                          self.effect_properties_tracker)
            # We use the action instead of the track element
            # because the track_element changes when redoing
            track_element.connect("active-changed",
                                 self._trackElementActiveChangedCb, action)
            self.log.push(action)
            element = track_element.getElement()
            if element:
                self.effect_properties_tracker.addEffectElement(element)
        else:
            self._connectToTrackElement(track_element)

    def _clipTrackElementRemovedCb(self, clip, track_element):
        if isinstance(track_element, GES.BaseEffect):
            action = self.effectRemovedAction(clip,
                                              track_element,
                                              self.effect_properties_tracker)
            self.log.push(action)
        else:
            self._disconnectFromTrackElement(track_element)

    def _interpolatorKeyframeAddedCb(self, track_element, keyframe):
        action = self.interpolatorKeyframeAddedAction(track_element, keyframe)
        self.log.push(action)

    def _interpolatorKeyframeRemovedCb(self, track_element, keyframe, old_value=None):
        action = self.interpolatorKeyframeRemovedAction(track_element, keyframe)
        self.log.push(action)

    def _trackElementActiveChangedCb(self, track_element, active, add_effect_action):
        """
        This happens when an effect is (de)activated on a clip in the timeline.
        """
        action = self.activePropertyChangedAction(add_effect_action, active)
        self.log.push(action)

    def _interpolatorKeyframeMovedCb(self, tracker, track_element,
            keyframe, old_snapshot, new_snapshot):
        action = self.interpolatorKeyframeChangedAction(track_element,
                keyframe, old_snapshot, new_snapshot)
        self.log.push(action)
Ejemplo n.º 4
0
 def __init__(self, log):
     self.log = log
     self.clip_property_trackers = {}
     self.interpolator_keyframe_trackers = {}
     self.effect_properties_tracker = EffectGstElementPropertyChangeTracker(log)
     self._pipeline = None
Ejemplo n.º 5
0
class TimelineLogObserver(object):
    timelinePropertyChangedAction = TimelineObjectPropertyChanged
    timelineObjectAddedAction = TimelineObjectAdded
    timelineObjectRemovedAction = TimelineObjectRemoved
    trackEffectAddAction = TrackEffectAdded
    trackEffectRemovedAction = TrackEffectRemoved
    interpolatorKeyframeAddedAction = InterpolatorKeyframeAdded
    interpolatorKeyframeRemovedAction = InterpolatorKeyframeRemoved
    interpolatorKeyframeChangedAction = InterpolatorKeyframeChanged
    activePropertyChangedAction = ActivePropertyChanged

    def __init__(self, log):
        self.log = log
        self.timeline_object_property_trackers = {}
        self.interpolator_keyframe_trackers = {}
        self.effect_properties_tracker = EffectGstElementPropertyChangeTracker(log)
        self._pipeline = None

    def setPipeline(self, pipeline):
        self._pipeline = pipeline
        self.effect_properties_tracker.pipeline = pipeline

    def getPipeline(self):
        return self._pipeline

    pipeline = property(getPipeline, setPipeline)

    def startObserving(self, timeline):
        self._connectToTimeline(timeline)
        for layer in timeline.get_layers():
            for timeline_object in layer.get_objects():
                self._connectToTimelineObject(timeline_object)
                for track_object in timeline_object.track_objects:
                    self._connectToTrackObject(track_object)

    def stopObserving(self, timeline):
        self._disconnectFromTimeline(timeline)
        for timeline_object in timeline.timeline_objects:
            self._disconnectFromTimelineObject(timeline_object)
            for track_object in timeline_object.track_objects:
                self._disconnectFromTrackObject(track_object)

    def _connectToTimeline(self, timeline):
        for layer in timeline.get_layers():
            layer.connect("object-added", self._timelineObjectAddedCb)
            layer.connect("object-removed", self._timelineObjectRemovedCb)

    def _disconnectFromTimeline(self, timeline):
        timeline.disconnect_by_func(self._timelineObjectAddedCb)
        timeline.disconnect_by_func(self._timelineObjectRemovedCb)

    def _connectToTimelineObject(self, timeline_object):
        tracker = TimelineObjectPropertyChangeTracker()
        tracker.connectToObject(timeline_object)
        for property_name in tracker.property_names:
            tracker.connect("notify::" + property_name,
                    self._timelineObjectPropertyChangedCb, property_name)
        self.timeline_object_property_trackers[timeline_object] = tracker

        timeline_object.connect("track-object-added", self._timelineObjectTrackObjectAddedCb)
        #timeline_object.connect("track-object-removed", self._timelineObjectTrackObjectRemovedCb)
        for obj in timeline_object.get_track_objects():
            self._connectToTrackObject(obj)

    def _disconnectFromTimelineObject(self, timeline_object):
        tracker = self.timeline_object_property_trackers.pop(timeline_object)
        tracker.disconnectFromObject(timeline_object)
        tracker.disconnect_by_func(self._timelineObjectPropertyChangedCb)

    def _connectToTrackObject(self, track_object):
        #for prop, interpolator in track_object.getInterpolators().itervalues():
            #self._connectToInterpolator(interpolator)
        if isinstance(track_object, TrackEffect):
            self.effect_properties_tracker.addEffectElement(track_object.getElement())

    def _disconnectFromTrackObject(self, track_object):
        for prop, interpolator in track_object.getInterpolators().itervalues():
            self._disconnectFromInterpolator(interpolator)

    def _connectToInterpolator(self, interpolator):
        interpolator.connect("keyframe-added", self._interpolatorKeyframeAddedCb)
        interpolator.connect("keyframe-removed",
                self._interpolatorKeyframeRemovedCb)

        tracker = KeyframeChangeTracker()
        tracker.connectToObject(interpolator)
        tracker.connect("keyframe-moved", self._interpolatorKeyframeMovedCb)
        self.interpolator_keyframe_trackers[interpolator] = tracker

    def _disconnectFromInterpolator(self, interpolator):
        tracker = self.interpolator_keyframe_trackers.pop(interpolator)
        tracker.disconnectFromObject(interpolator)
        tracker.disconnect_by_func(self._interpolatorKeyframeMovedCb)

    def _timelineObjectAddedCb(self, timeline, timeline_object):
        self._connectToTimelineObject(timeline_object)
        action = self.timelineObjectAddedAction(timeline, timeline_object)
        self.log.push(action)

    def _timelineObjectRemovedCb(self, timeline, timeline_object):
        self._disconnectFromTimelineObject(timeline_object)
        action = self.timelineObjectRemovedAction(timeline, timeline_object)
        self.log.push(action)

    def _timelineObjectPropertyChangedCb(self, tracker, timeline_object,
            old_value, new_value, property_name):
        action = self.timelinePropertyChangedAction(timeline_object,
                property_name, old_value, new_value)
        self.log.push(action)

    def _timelineObjectTrackObjectAddedCb(self, timeline_object, track_object):
        if isinstance(track_object, TrackEffect):
            action = self.trackEffectAddAction(timeline_object, track_object,
                                               self.effect_properties_tracker)
            #We use the action instead of the track object
            #because the track_object changes when redoing
            track_object.connect("active-changed",
                                 self._trackObjectActiveChangedCb, action)
            self.log.push(action)
            element = track_object.getElement()
            if element:
                self.effect_properties_tracker.addEffectElement(element)
        else:
            self._connectToTrackObject(track_object)

    def _timelineObjectTrackObjectRemovedCb(self, timeline_object,
                                            track_object):
        if isinstance(track_object, TrackEffect):
            action = self.trackEffectRemovedAction(timeline_object,
                                                track_object,
                                                self.effect_properties_tracker)
            self.log.push(action)
        else:
            self._disconnectFromTrackObject(track_object)

    def _interpolatorKeyframeAddedCb(self, track_object, keyframe):
        action = self.interpolatorKeyframeAddedAction(track_object, keyframe)
        self.log.push(action)

    def _interpolatorKeyframeRemovedCb(self, track_object, keyframe,
            old_value=None):
        action = self.interpolatorKeyframeRemovedAction(track_object, keyframe)
        self.log.push(action)

    def _trackObjectActiveChangedCb(self, track_object, active, add_effect_action):
        action = self.activePropertyChangedAction(add_effect_action, active)
        self.log.push(action)

    def _interpolatorKeyframeMovedCb(self, tracker, track_object,
            keyframe, old_snapshot, new_snapshot):
        action = self.interpolatorKeyframeChangedAction(track_object,
                keyframe, old_snapshot, new_snapshot)
        self.log.push(action)