[pitivi] undo: Support layer renaming
- From: Alexandru Băluț <alexbalut src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi] undo: Support layer renaming
- Date: Thu, 2 Jun 2016 21:49:49 +0000 (UTC)
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]