[pitivi] Use the disable-updates signal to reduce the number of undo/redo actions.



commit bb2d74666f31583b5426c971cf17be2470ea6228
Author: Alessandro Decina <alessandro d gmail com>
Date:   Thu Jun 11 16:05:17 2009 +0200

    Use the disable-updates signal to reduce the number of undo/redo actions.

 pitivi/timeline/timeline.py      |    7 ++++++-
 pitivi/timeline/timeline_undo.py |   30 +++++++++++++++++++++++++++++-
 pitivi/utils.py                  |   14 +++++++++++---
 3 files changed, 46 insertions(+), 5 deletions(-)
---
diff --git a/pitivi/timeline/timeline.py b/pitivi/timeline/timeline.py
index 8d8aee2..3ffb1b3 100644
--- a/pitivi/timeline/timeline.py
+++ b/pitivi/timeline/timeline.py
@@ -81,7 +81,7 @@ class TimelineObject(Signallable, Loggable):
         'out-point-changed': ['in-point'],
         'media-duration-changed': ['media-duration'],
         'priority-changed': ['priority'],
-        'selected-changed' : ['state'],
+        'selected-changed' : ['state']
     }
 
     DEFAULT_START = 0
@@ -768,6 +768,7 @@ class Timeline(Signallable, Loggable):
         'track-added': ['track'],
         'track-removed': ['track'],
         'selection-changed': [],
+        'disable-updates': ['bool']
     }
 
     def __init__(self):
@@ -1094,9 +1095,13 @@ class Timeline(Signallable, Loggable):
         for track in self.tracks:
             track.disableUpdates()
 
+        self.emit("disable-updates", True)
+
     def enableUpdates(self):
         """
         Unblock internal updates. Use this after calling L{disableUpdates}.
         """
         for track in self.tracks:
             track.enableUpdates()
+
+        self.emit("disable-updates", False)
diff --git a/pitivi/timeline/timeline_undo.py b/pitivi/timeline/timeline_undo.py
index 1b7142e..cefb64d 100644
--- a/pitivi/timeline/timeline_undo.py
+++ b/pitivi/timeline/timeline_undo.py
@@ -23,9 +23,37 @@ from pitivi.utils import PropertyChangeTracker
 from pitivi.undo import UndoableAction
 
 class TimelineObjectPropertyChangeTracker(PropertyChangeTracker):
-    property_names = ["start", "duration", "in-point", "out-point",
+    # no out-point
+    property_names = ["start", "duration", "in-point",
             "media-duration", "priority", "selected"]
 
+    _disabled = False
+
+    def connectToObject(self, obj):
+        PropertyChangeTracker.connectToObject(self, obj)
+        self.timeline = obj.timeline
+        self.timeline.connect("disable-updates", self._timelineDisableUpdatesCb)
+
+    def disconnectFromObject(self, obj):
+        self.timeline.disconnect_by_func(self._timelineDisableUpdatesCb)
+        PropertyChangeTracker.disconnectFromObject(self, obj)
+
+    def _timelineDisableUpdatesCb(self, timeline, disabled):
+        if self._disabled and not disabled:
+            self._disabled = disabled
+            properties = self._takeCurrentSnapshot(self.obj)
+            for property_name, property_value in properties.iteritems():
+                old_value = self.properties[property_name]
+                if old_value != property_value:
+                    self._propertyChangedCb(self.obj, property_value, property_name)
+        else:
+            self._disabled = disabled
+
+    def _propertyChangedCb(self, timeline_object, value, property_name):
+        if not self._disabled:
+            PropertyChangeTracker._propertyChangedCb(self,
+                    timeline_object, value, property_name)
+
 class TimelineObjectPropertyChanged(UndoableAction):
     def __init__(self, timeline_object, property_name, old_value, new_value):
         self.timeline_object = timeline_object
diff --git a/pitivi/utils.py b/pitivi/utils.py
index 43d4e54..ba03c99 100644
--- a/pitivi/utils.py
+++ b/pitivi/utils.py
@@ -239,19 +239,27 @@ def uri_is_reachable(uri):
 class PropertyChangeTracker(Signallable):
     def __init__(self):
         self.properties = {}
+        self.obj = None
 
     def connectToObject(self, obj):
+        self.obj = obj
+        self.properties = self._takeCurrentSnapshot(obj)
         for property_name in self.property_names:
-            self.properties[property_name] = \
-                    getattr(obj, property_name.replace("-", "_"))
-
             signal_name = property_name + '-changed'
             self.__signals__[signal_name] = []
             obj.connect(signal_name,
                     self._propertyChangedCb, property_name)
 
+    def _takeCurrentSnapshot(self, obj):
+        properties = {}
+        for property_name in self.property_names:
+            properties[property_name] = \
+                    getattr(obj, property_name.replace("-", "_"))
+
+        return properties
 
     def disconnectFromObject(self, obj):
+        self.obj = None
         obj.disconnect_by_func(self._propertyChangedCb)
 
     def _propertyChangedCb(self, object, value, property_name):



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