[pitivi] undo: Remove the effect.py file and move its content to timeline.py
- From: Thibault Saunier <tsaunier src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi] undo: Remove the effect.py file and move its content to timeline.py
- Date: Sat, 15 Nov 2014 10:33:19 +0000 (UTC)
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]