[pitivi] undo: Remove the effect.py file and move its content to timeline.py



commit a2fefb00ef7c3c28f387f7fbca39816ada73d97a
Author: Thibault Saunier <tsaunier gnome org>
Date:   Sat Sep 27 10:17:43 2014 +0200

    undo: Remove the effect.py file and move its content to timeline.py
    
    It is not effect specific anymore, be coherent.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=739251

 pitivi/undo/Makefile.am |    3 +-
 pitivi/undo/effect.py   |  184 -----------------------------------------------
 pitivi/undo/timeline.py |  165 +++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 164 insertions(+), 188 deletions(-)
---
diff --git a/pitivi/undo/Makefile.am b/pitivi/undo/Makefile.am
index cda9c06..c7e67bc 100644
--- a/pitivi/undo/Makefile.am
+++ b/pitivi/undo/Makefile.am
@@ -3,8 +3,7 @@ undodir = $(libdir)/pitivi/python/pitivi/undo
 undo_PYTHON =    \
        __init__.py  \
        undo.py      \
-       timeline.py  \
-       effect.py
+       timeline.py
 
 clean-local:
        rm -rf *.pyc *.pyo
diff --git a/pitivi/undo/timeline.py b/pitivi/undo/timeline.py
index c12d988..e4845bf 100644
--- a/pitivi/undo/timeline.py
+++ b/pitivi/undo/timeline.py
@@ -24,8 +24,169 @@ from gi.repository import GES
 from gi.repository import GObject
 
 from pitivi.undo.undo import PropertyChangeTracker, UndoableAction
-from pitivi.undo.effect import TrackElementAdded, TrackElementRemoved
-from pitivi.undo.effect import TrackElementChildPropertyTracker
+from pitivi.effects import PROPS_TO_IGNORE
+
+
+class TrackElementPropertyChanged(UndoableAction):
+
+    def __init__(self, track_element, property_name, old_value, new_value):
+        UndoableAction.__init__(self)
+        self.track_element = track_element
+        self.property_name = property_name
+        self.old_value = old_value
+        self.new_value = new_value
+
+    def do(self):
+        self.track_element.set_child_property(
+            self.property_name, self.new_value)
+        self._done()
+
+    def undo(self):
+        self.track_element.set_child_property(
+            self.property_name, self.old_value)
+        self._undone()
+
+    def serializeLastAction(self):
+        st = Gst.Structure.new_empty("set-child-property")
+        st['element-name'] = self.track_element.get_name()
+        st['property'] = self.property_name
+        st['value'] = self.new_value
+
+        return st
+
+
+# FIXME We should refactor pitivi.undo.PropertyChangeTracker so we can use it as
+# a baseclass here!
+class TrackElementChildPropertyTracker:
+
+    """
+    Track track_element configuration changes in its list of control track_elements
+    """
+
+    def __init__(self, action_log):
+        self._tracked_track_elements = {}
+        self.action_log = action_log
+        self.pipeline = None
+
+    def addTrackElement(self, track_element):
+        if track_element in self._tracked_track_elements:
+            return
+
+        properties = {}
+
+        track_element.connect('deep-notify', self._propertyChangedCb)
+
+        for prop in track_element.list_children_properties():
+            properties[prop.name] = track_element.get_child_property(
+                prop.name)[1]
+
+        self._tracked_track_elements[track_element] = properties
+
+    def getPropChangedFromTrackElement(self, track_element):
+        return self._tracked_track_elements[track_element]
+
+    def _propertyChangedCb(self, track_element, unused_gstelement, pspec):
+        old_value = self._tracked_track_elements[track_element][pspec.name]
+        new_value = track_element.get_child_property(pspec.name)[1]
+        action = TrackElementPropertyChanged(
+            track_element, pspec.name, old_value, new_value)
+        self._tracked_track_elements[track_element][pspec.name] = new_value
+        self.action_log.push(action)
+
+
+class TrackElementAdded(UndoableAction):
+    # Note: We have a bug if we just remove the Effect from the timeline
+    # and keep it saved here and then readd it to corresponding timeline (it
+    # freezes everything). So what we are doing is  to free the Effect,
+    # keep its settings here when undoing, and instanciate a new one when
+    # doing again. We have to keep all EffectPropertyChanged object that refers
+    # to the Effect when undoing so we reset theirs track_element when
+    # doing it again. The way of doing it is the same with EffectRemoved
+
+    def __init__(self, clip, track_element, properties_watcher):
+        UndoableAction.__init__(self)
+        self.clip = clip
+        self.track_element = track_element
+        self.asset = track_element.get_asset()
+        self.track_element_props = []
+        self.gnl_obj_props = []
+        self._properties_watcher = properties_watcher
+        self._props_changed = []
+
+    def do(self):
+        self.track_element = self.clip.add_asset(self.asset)
+        for prop_name, prop_value in self.track_element_props:
+            self.track_element.set_child_property(prop_name, prop_value)
+        self.clip.get_layer().get_timeline().commit()
+        self._props_changed = []
+        self._done()
+
+    def undo(self):
+        props = self.track_element.list_children_properties()
+        self.track_element_props = [(prop.name, self.track_element.get_child_property(prop.name)[1])
+                                    for prop in props
+                                    if prop.flags & GObject.PARAM_WRITABLE
+                                    and prop.name not in PROPS_TO_IGNORE]
+        self.clip.remove(self.track_element)
+        self._props_changed =\
+            self._properties_watcher.getPropChangedFromTrackElement(
+                self.track_element)
+        del self.track_element
+        self.track_element = None
+        self._undone()
+
+    def serializeLastAction(self):
+        st = Gst.Structure.new_empty("container-add-child")
+        st["container-name"] = self.clip.get_name()
+        st["asset-id"] = self.track_element.get_id()
+        st["child-type"] = GObject.type_name(
+            self.track_element.get_asset().get_extractable_type())
+
+        return st
+
+
+class TrackElementRemoved(UndoableAction):
+
+    def __init__(self, clip, track_element, properties_watcher):
+        UndoableAction.__init__(self)
+        self.track_element = track_element
+        self.clip = clip
+        self.asset = track_element.get_asset()
+        self.track_element_props = []
+        self.gnl_obj_props = []
+        self._properties_watcher = properties_watcher
+        self._props_changed = []
+
+    def do(self):
+        props = self.track_element.list_children_properties()
+        self.track_element_props = [(prop.name, self.track_element.get_child_property(prop.name)[1])
+                                    for prop in props
+                                    if prop.flags & GObject.PARAM_WRITABLE
+                                    and prop.name not in PROPS_TO_IGNORE]
+
+        self.clip.remove(self.track_element)
+
+        self._props_changed =\
+            self._properties_watcher.getPropChangedFromTrackElement(
+                self.track_element)
+        del self.track_element
+        self.track_element = None
+        self._done()
+
+    def undo(self):
+        self.track_element = self.clip.add_asset(self.asset)
+        for prop_name, prop_value in self.track_element_props:
+            self.track_element.set_child_property(prop_name, prop_value)
+        self.clip.get_layer().get_timeline().commit()
+        self._props_changed = []
+        self._undone()
+
+    def serializeLastAction(self):
+        st = Gst.Structure.new_empty("container-remove-child")
+        st["container-name"] = self.clip.get_name()
+        st["child-name"] = self.track_element.get_name()
+
+        return st
 
 
 class ClipPropertyChangeTracker(PropertyChangeTracker):


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]