[pitivi] undo: Reimplement undo redo for effect properties.



commit 6e6b4aa8b1890652b2b6cbb2feba75dcc509d28b
Author: Mathieu Duponchelle <mathieu duponchelle opencreed com>
Date:   Wed Apr 2 23:03:51 2014 +0200

    undo: Reimplement undo redo for effect properties.

 pitivi/effects.py       |    1 -
 pitivi/undo/effect.py   |   48 ++++++++++++++--------------------------------
 pitivi/undo/timeline.py |    2 +-
 pitivi/utils/widgets.py |    9 +++----
 4 files changed, 20 insertions(+), 40 deletions(-)
---
diff --git a/pitivi/effects.py b/pitivi/effects.py
index ebc49b4..8614800 100644
--- a/pitivi/effects.py
+++ b/pitivi/effects.py
@@ -43,7 +43,6 @@ from gi.repository import Gst
 from gi.repository import Gtk
 from gi.repository import Gdk
 from gi.repository import Pango
-from gi.repository import GObject
 from gi.repository import GdkPixbuf
 
 from gettext import gettext as _
diff --git a/pitivi/undo/effect.py b/pitivi/undo/effect.py
index 3e8322e..9b2a836 100644
--- a/pitivi/undo/effect.py
+++ b/pitivi/undo/effect.py
@@ -21,7 +21,7 @@
 # the Free Software Foundation; either version 3, or (at your option)
 # any later version.
 
-from gi.repository import GObject, GES
+from gi.repository import GObject
 
 from pitivi.undo.undo import UndoableAction
 from pitivi.effects import PROPS_TO_IGNORE
@@ -54,42 +54,24 @@ class EffectGstElementPropertyChangeTracker:
         self.action_log = action_log
         self.pipeline = None
 
-    def addEffectElement(self, gst_element):
+    def addEffectElement(self, effect):
+        if effect in self._tracked_effects:
+            return
+
         properties = {}
 
-        if gst_element in self._tracked_effects:
-            return
+        effect.connect('deep-notify', self._propertyChangedCb)
+
+        for prop in effect.list_children_properties():
+            properties[prop.name] = effect.get_child_property(prop.name)[1]
+
+        self._tracked_effects[effect] = properties
 
-        for prop in GObject.list_properties(gst_element):
-            gst_element.connect('notify::' + prop.name,
-                                self._propertyChangedCb,
-                                gst_element)
-            if prop.flags & GObject.PARAM_READABLE:
-                properties[prop.name] = gst_element.get_property(prop.name)
-        self._tracked_effects[gst_element] = properties
-
-    def getPropChangedFromTrackObj(self, effect):
-        prop_changed = []
-
-        for undo_stack in self.action_log.undo_stacks:
-            for done_prop_change in undo_stack.done_actions:
-                if isinstance(done_prop_change, EffectPropertyChanged):
-                    if done_prop_change.gst_element is effect.getElement():
-                        prop_changed.append(done_prop_change)
-
-        for redo_stack in self.action_log.redo_stacks:
-            for done_prop_change in redo_stack.done_actions:
-                if isinstance(done_prop_change, EffectPropertyChanged):
-                    if done_prop_change.gst_element is effect.getElement():
-                        prop_changed.append(done_prop_change)
-
-        return prop_changed
-
-    def _propertyChangedCb(self, gst_element, pspec, unused):
-        old_value = self._tracked_effects[gst_element][pspec.name]
-        new_value = gst_element.get_property(pspec.name)
+    def _propertyChangedCb(self, effect, gst_element, pspec):
+        old_value = self._tracked_effects[effect][pspec.name]
+        new_value = effect.get_child_property(pspec.name)[1]
         action = EffectPropertyChanged(gst_element, pspec.name, old_value, new_value)
-        self._tracked_effects[gst_element][pspec.name] = new_value
+        self._tracked_effects[effect][pspec.name] = new_value
         self.action_log.push(action)
 
 
diff --git a/pitivi/undo/timeline.py b/pitivi/undo/timeline.py
index 3149f6e..5651417 100644
--- a/pitivi/undo/timeline.py
+++ b/pitivi/undo/timeline.py
@@ -287,7 +287,7 @@ class TimelineLogObserver(object):
         #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())
+            self.effect_properties_tracker.addEffectElement(track_element)
 
     def _disconnectFromTrackElement(self, track_element):
         pass
diff --git a/pitivi/utils/widgets.py b/pitivi/utils/widgets.py
index 4fdea9b..e499fe5 100644
--- a/pitivi/utils/widgets.py
+++ b/pitivi/utils/widgets.py
@@ -695,7 +695,6 @@ class GstElementSettingsWidget(Gtk.VBox, Loggable):
             # The "reset to default" button associated with this property
             if default_btn:
                 widget.propName = prop.name.split("-")[0]
-                name = prop.name
 
                 if self.isControllable:
                     # If this element is controlled, the value means nothing anymore.
@@ -707,15 +706,15 @@ class GstElementSettingsWidget(Gtk.VBox, Loggable):
                 table.attach(button, 2, 3, y, y + 1, xoptions=Gtk.AttachOptions.FILL, 
yoptions=Gtk.AttachOptions.FILL)
                 self.buttons[button] = widget
 
-            self.element.connect('notify::' + prop.name, self._propertyChangedCb, widget)
-
             y += 1
 
+        self.element.connect('deep-notify', self._propertyChangedCb)
         self.pack_start(table, expand=True, fill=True, padding=0)
         self.show_all()
 
-    def _propertyChangedCb(self, unused_element, pspec, widget):
-        widget.setWidgetValue(self.element.get_property(pspec.name))
+    def _propertyChangedCb(self, effect, gst_element, pspec):
+        widget = self.properties[pspec]
+        widget.setWidgetValue(self.element.get_child_property(pspec.name)[1])
 
     def _getKeyframeToggleButton(self, prop):
         button = Gtk.ToggleButton()


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