[pitivi] undo: Support layer renaming



commit e9a41835800e710d99a110be707512426c383334
Author: Alexandru Băluț <alexandru balut gmail com>
Date:   Sun May 22 23:22:13 2016 +0200

    undo: Support layer renaming
    
    Differential Revision: https://phabricator.freedesktop.org/D1013

 pitivi/timeline/layer.py    |   21 ++++++++++++++-------
 pitivi/undo/timeline.py     |    5 +++++
 pitivi/undo/undo.py         |    5 +++++
 tests/test_undo_timeline.py |   15 +++++++++++++++
 4 files changed, 39 insertions(+), 7 deletions(-)
---
diff --git a/pitivi/timeline/layer.py b/pitivi/timeline/layer.py
index 28afa97..27b5485 100644
--- a/pitivi/timeline/layer.py
+++ b/pitivi/timeline/layer.py
@@ -145,7 +145,8 @@ class LayerControls(Gtk.EventBox, Loggable):
         self.name_entry = Gtk.Entry()
         self.name_entry.get_style_context().add_class("LayerControlEntry")
         self.name_entry.props.valign = Gtk.Align.CENTER
-        self.name_entry.connect("focus-out-event", self.__nameChangedCb)
+        self.name_entry.connect("focus-out-event", self.__name_focus_out_cb)
+        self.ges_layer.connect("notify-meta", self.__layer_rename_cb)
         self.__updateName()
         name_row.pack_start(self.name_entry, True, True, 0)
 
@@ -180,15 +181,21 @@ class LayerControls(Gtk.EventBox, Loggable):
         self.props.window.set_cursor(Gdk.Cursor.new(Gdk.CursorType.HAND1))
 
     def __del__(self):
-        self.name_entry.disconnect_by_func(self.__nameChangedCb)
+        self.name_entry.disconnect_by_func(self.__name_focus_out_cb)
+        self.ges_layer.disconnect_by_func(self.__layer_rename_cb)
         self.ges_layer.disconnect_by_func(self.__layerPriorityChangedCb)
         self.ges_timeline.disconnect_by_func(self.__timelineLayerAddedCb)
         self.ges_timeline.disconnect_by_func(self.__timelineLayerRemovedCb)
         super(LayerControls, self).__del__()
 
-    def __nameChangedCb(self, unused_widget, unused_event):
-        self.ges_layer.ui.setName(self.name_entry.get_text())
-        self.app.project_manager.current_project.setModificationState(True)
+    def __layer_rename_cb(self, unused_ges_layer, item, value):
+        if not item == "video::name":
+            return
+        self.__updateName()
+
+    def __name_focus_out_cb(self, unused_widget, unused_event):
+        with self.app.action_log.started("change layer name"):
+            self.ges_layer.ui.setName(self.name_entry.get_text())
 
     def __layerPriorityChangedCb(self, unused_ges_layer, unused_pspec):
         self.__updateActions()
@@ -380,14 +387,14 @@ class Layer(Gtk.EventBox, Zoomable, Loggable):
     def setName(self, name):
         self.ges_layer.set_meta("video::name", name)
 
-    def __nameIfSet(self):
+    def _nameIfSet(self):
         name = self.ges_layer.get_meta("video::name")
         if not name:
             name = self.ges_layer.get_meta("audio::name")
         return name
 
     def __nameIfMeaningful(self):
-        name = self.__nameIfSet()
+        name = self._nameIfSet()
         if name:
             for pattern in ("video [0-9]+$", "audio [0-9]+$", "Layer [0-9]+$"):
                 if re.match(pattern, name):
diff --git a/pitivi/undo/timeline.py b/pitivi/undo/timeline.py
index b9cbeda..3b55540 100644
--- a/pitivi/undo/timeline.py
+++ b/pitivi/undo/timeline.py
@@ -23,6 +23,7 @@ from gi.repository import Gst
 from pitivi.effects import PROPS_TO_IGNORE
 from pitivi.undo.undo import FinalizingAction
 from pitivi.undo.undo import GObjectObserver
+from pitivi.undo.undo import MetaContainerObserver
 from pitivi.undo.undo import UndoableAction
 from pitivi.utils.loggable import Loggable
 
@@ -454,6 +455,7 @@ class TimelineObserver(Loggable):
         self.action_log = action_log
         self.app = app
         self.clip_property_trackers = {}
+        self.layer_observers = {}
         self.keyframe_observers = {}
         self.track_element_observers = {}
         self._layers_priorities = {}
@@ -475,6 +477,8 @@ class TimelineObserver(Loggable):
         ges_layer.connect("clip-added", self._clipAddedCb)
         ges_layer.connect("clip-removed", self._clipRemovedCb)
         ges_layer.connect("notify::priority", self._layer_moved_cb)
+        layer_observer = MetaContainerObserver(ges_layer, self.action_log)
+        self.layer_observers[ges_layer] = layer_observer
 
         for ges_clip in ges_layer.get_clips():
             self._connectToClip(ges_clip)
@@ -484,6 +488,7 @@ class TimelineObserver(Loggable):
         ges_layer.disconnect_by_func(self._clipAddedCb)
         ges_layer.disconnect_by_func(self._clipRemovedCb)
         ges_layer.disconnect_by_func(self._layer_moved_cb)
+        self.layer_observers.pop(ges_layer).release()
 
     def _connectToClip(self, ges_clip):
         tracker = GObjectObserver(ges_clip,
diff --git a/pitivi/undo/undo.py b/pitivi/undo/undo.py
index 27bedb0..988ddd6 100644
--- a/pitivi/undo/undo.py
+++ b/pitivi/undo/undo.py
@@ -313,6 +313,7 @@ class MetaContainerObserver(GObject.Object):
     """
 
     def __init__(self, meta_container, action_log):
+        self.meta_container = meta_container
         self.action_log = action_log
 
         self.metas = {}
@@ -329,6 +330,10 @@ class MetaContainerObserver(GObject.Object):
         self.metas[item] = value
         self.action_log.push(action)
 
+    def release(self):
+        self.meta_container.disconnect_by_func(self._notify_meta_cb)
+        self.meta_container = None
+
 
 class PropertyChangedAction(UndoableAction):
 
diff --git a/tests/test_undo_timeline.py b/tests/test_undo_timeline.py
index 0e8a2e0..5b269e2 100644
--- a/tests/test_undo_timeline.py
+++ b/tests/test_undo_timeline.py
@@ -24,6 +24,7 @@ from gi.repository import GES
 from gi.repository import Gst
 from gi.repository import GstController
 
+from pitivi.timeline.layer import Layer
 from pitivi.timeline.timeline import Timeline
 from pitivi.undo.project import AssetAddedAction
 from pitivi.undo.timeline import ClipAdded
@@ -163,6 +164,20 @@ class TestTimelineUndo(TestCase):
         self.action_log.redo()
         self.assertEqual(self.timeline.get_layers(), [layer2, layer3, layer1])
 
+    def test_layer_renamed(self):
+        layer = Layer(self.layer, timeline=mock.Mock())
+        self.assertIsNone(layer._nameIfSet())
+
+        with self.app.action_log.started("change layer name"):
+            layer.setName("Beautiful name")
+        self.assertEqual(layer._nameIfSet(), "Beautiful name")
+
+        self.action_log.undo()
+        self.assertIsNone(layer._nameIfSet())
+
+        self.action_log.redo()
+        self.assertEqual(layer._nameIfSet(), "Beautiful name")
+
     def testControlSourceValueAdded(self):
         uri = common.get_sample_uri("tears_of_steel.webm")
         asset = GES.UriClipAsset.request_sync(uri)


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