[pitivi] titleeditor: Make new TitleClip visible if first layer is occupied



commit b71b3f39e6fb340a0821cdd6f809256144d8a98c
Author: Suhas Nayak <suhas2go gmail com>
Date:   Fri Feb 3 00:50:44 2017 +0530

    titleeditor: Make new TitleClip visible if first layer is occupied
    
    If there is not enough space at current playhead position,
    a new first layer is created to insert the TitleClip.
    
    This fixes T7687
    
    Reviewed-by: Alex Băluț <alexandru balut gmail com>
    Differential Revision: https://phabricator.freedesktop.org/D1635

 pitivi/timeline/timeline.py |   15 +++++++++++----
 pitivi/titleeditor.py       |   12 ++++++------
 tests/test_undo_timeline.py |   42 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 59 insertions(+), 10 deletions(-)
---
diff --git a/pitivi/timeline/timeline.py b/pitivi/timeline/timeline.py
index 77abb51..86c038a 100644
--- a/pitivi/timeline/timeline.py
+++ b/pitivi/timeline/timeline.py
@@ -1305,11 +1305,18 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
         layer = self._getLongestLayer()
         self._insertClipsAndAssets(assets, position, layer)
 
-    def insertClips(self, clips, position=None):
+    def insert_clips_on_first_layer(self, clips, position=None):
         """Adds clips to the timeline on the first layer."""
-        layers = self.ges_timeline.get_layers()
-        layer = layers[0]
-        self._insertClipsAndAssets(clips, position, layer)
+        with self.app.action_log.started("insert on first layer",
+                                         CommitTimelineFinalizingAction(self._project.pipeline)):
+            layers = self.ges_timeline.get_layers()
+            first_layer = layers[0]
+            start = self.__getInsertPosition(position)
+            end = start + sum([clip.get_duration() for clip in clips])
+            intersecting_clips = first_layer.get_clips_in_interval(start, end)
+            if intersecting_clips:
+                first_layer = self.timeline.create_layer(0)
+            self._insertClipsAndAssets(clips, start, first_layer)
 
     def _insertClipsAndAssets(self, objs, position, layer):
         if self.ges_timeline is None:
diff --git a/pitivi/titleeditor.py b/pitivi/titleeditor.py
index a4e536b..d379869 100644
--- a/pitivi/titleeditor.py
+++ b/pitivi/titleeditor.py
@@ -206,12 +206,12 @@ class TitleEditor(Loggable):
             self.editing_box.hide()
 
     def _createCb(self, unused_button):
-        clip = GES.TitleClip()
-        clip.set_duration(int(Gst.SECOND * 5))
-        self.app.gui.timeline_ui.insertClips([clip])
+        title_clip = GES.TitleClip()
+        title_clip.set_duration(Gst.SECOND * 5)
+        self.app.gui.timeline_ui.insert_clips_on_first_layer([title_clip])
         # Now that the clip is inserted in the timeline, it has a source which
         # can be used to set its properties.
-        source = clip.get_children(False)[0]
+        source = title_clip.get_children(False)[0]
         assert source.set_child_property("text", "")
         assert source.set_child_property("foreground-color", BACKGROUND_DEFAULT_COLOR)
         assert source.set_child_property("color", FOREGROUND_DEFAULT_COLOR)
@@ -219,9 +219,9 @@ class TitleEditor(Loggable):
         assert source.set_child_property("valignment", DEFAULT_VALIGNMENT)
         assert source.set_child_property("halignment", DEFAULT_HALIGNMENT)
         # Select it so the Title editor becomes active.
-        self._selection.setSelection([clip], SELECT)
+        self._selection.setSelection([title_clip], SELECT)
         self.app.gui.timeline_ui.timeline.resetSelectionGroup()
-        self.app.gui.timeline_ui.timeline.current_group.add(clip)
+        self.app.gui.timeline_ui.timeline.current_group.add(title_clip)
 
     def _propertyChangedCb(self, source, unused_gstelement, pspec):
         if self._setting_props:
diff --git a/tests/test_undo_timeline.py b/tests/test_undo_timeline.py
index de7e184..f03515e 100644
--- a/tests/test_undo_timeline.py
+++ b/tests/test_undo_timeline.py
@@ -235,6 +235,48 @@ class TestTimelineObserver(BaseTestUndoTimeline):
             self.assertEqual(len(clips), 1, clips)
             self.assertEqual(len(clips[0].get_children(False)), 2)
 
+    def test_insert_on_first_layer(self):
+        self.setup_timeline_container()
+        uri = common.get_sample_uri("tears_of_steel.webm")
+        asset = GES.UriClipAsset.request_sync(uri)
+        clip1 = asset.extract()
+        self.timeline_container.insert_clips_on_first_layer(clips=[clip1], position=0)
+        clips = list(self.getTimelineClips())
+        self.assertEqual(len(clips), 1, clips)
+
+        # Undo insert on first layer
+        self.action_log.undo()
+        clips = list(self.getTimelineClips())
+        self.assertEqual(len(clips), 0, clips)
+
+        # Redo insert on first layer
+        self.action_log.redo()
+        clips = list(self.getTimelineClips())
+        self.assertEqual(len(clips), 1, clips)
+
+        # Insert new clip to create a layer
+        clip2 = common.create_test_clip(GES.TitleClip)
+        clip2.set_start(0 * Gst.SECOND)
+        clip2.set_duration(1 * Gst.SECOND)
+        self.timeline_container.insert_clips_on_first_layer(clips=[clip2], position=0)
+        layers = self.timeline.get_layers()
+        self.check_layers([layers[0], self.layer])
+        self.assertEqual(layers[0].get_clips(), [clip2])
+        self.assertEqual(layers[1].get_clips(), [clip1])
+
+        # Undo insert to create a layer
+        self.action_log.undo()
+        layers = self.timeline.get_layers()
+        self.check_layers([self.layer])
+        self.assertEqual(layers[0].get_clips(), [clip1])
+
+        # Redo insert to create a layer
+        self.action_log.redo()
+        layers = self.timeline.get_layers()
+        self.check_layers([layers[0], self.layer])
+        self.assertEqual(layers[0].get_clips(), [clip2])
+        self.assertEqual(layers[1].get_clips(), [clip1])
+
 
 class TestLayerObserver(BaseTestUndoTimeline):
 


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