[pitivi] timeline: Disable previewers while removing clips
- From: Thibault Saunier <tsaunier src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi] timeline: Disable previewers while removing clips
- Date: Sat, 25 Nov 2017 19:32:29 +0000 (UTC)
commit 22e9418769c2e134cf072e202344d2fd91719378
Author: Thibault Saunier <tsaunier gnome org>
Date: Tue Nov 7 16:58:19 2017 -0300
timeline: Disable previewers while removing clips
Without that we will go crazy about starting/stoping preview generation
while removing clips.
Reviewed-by: Alex Băluț <<alexandru balut gmail com>>
Differential Revision: https://phabricator.freedesktop.org/D1877
pitivi/timeline/previewers.py | 26 +++++++++++++------
pitivi/timeline/timeline.py | 56 ++++++++++++++++++++--------------------
2 files changed, 46 insertions(+), 36 deletions(-)
---
diff --git a/pitivi/timeline/previewers.py b/pitivi/timeline/previewers.py
index b40f7f7..26ab468 100644
--- a/pitivi/timeline/previewers.py
+++ b/pitivi/timeline/previewers.py
@@ -17,6 +17,7 @@
# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301, USA.
"""Previewers for the timeline."""
+import contextlib
import os
import random
import sqlite3
@@ -330,10 +331,10 @@ class PreviewGeneratorManager():
previewer.connect("done", self.__previewer_done_cb)
previewer.startGeneration()
- def start_flushing(self):
- """Flushes all previewers and start ignoring any update."""
- if self._running:
- self._running = False
+ @contextlib.contextmanager
+ def paused(self, interrupt=False):
+ """Pauses (and flushes if interrupt=True) managed previewers."""
+ if interrupt:
for previewer in list(self._current_previewers.values()):
previewer.stopGeneration()
@@ -341,12 +342,21 @@ class PreviewGeneratorManager():
for previewer in previewers:
previewer.stopGeneration()
- def stop_flushing(self):
- """Stop ignoring managed previewers updates."""
- self._running = True
+ try:
+ self._running = False
+ yield
+ except:
+ self.warning("An exception occurred while the previewer was paused")
+ raise
+ finally:
+ self._running = True
+ for track_type in self._previewers:
+ self.__start_next_previewer(track_type)
def __previewer_done_cb(self, previewer):
- track_type = previewer.track_type
+ self.__start_next_previewer(previewer.track_type)
+
+ def __start_next_previewer(self, track_type):
next_previewer = self._current_previewers.pop(track_type, None)
if next_previewer:
next_previewer.disconnect_by_func(self.__previewer_done_cb)
diff --git a/pitivi/timeline/timeline.py b/pitivi/timeline/timeline.py
index 9cf0064..3407f45 100644
--- a/pitivi/timeline/timeline.py
+++ b/pitivi/timeline/timeline.py
@@ -439,26 +439,25 @@ class Timeline(Gtk.EventBox, Zoomable, Loggable):
def setProject(self, project):
"""Connects to the GES.Timeline holding the project."""
# Avoid starting/closing preview generation like crazy while tearing down project
- Previewer.manager.start_flushing()
- if self.ges_timeline is not None:
- self.disconnect_by_func(self._button_press_event_cb)
- self.disconnect_by_func(self._button_release_event_cb)
- self.disconnect_by_func(self._motion_notify_event_cb)
-
- self.ges_timeline.disconnect_by_func(self._durationChangedCb)
- self.ges_timeline.disconnect_by_func(self._layer_added_cb)
- self.ges_timeline.disconnect_by_func(self._layer_removed_cb)
- self.ges_timeline.disconnect_by_func(self._snapCb)
- self.ges_timeline.disconnect_by_func(self._snapEndedCb)
- for ges_layer in self.ges_timeline.get_layers():
- self._remove_layer(ges_layer)
-
- self.ges_timeline.ui = None
- self.ges_timeline = None
-
- if self._project:
- self._project.pipeline.disconnect_by_func(self._positionCb)
- Previewer.manager.stop_flushing()
+ with Previewer.manager.paused(True):
+ if self.ges_timeline is not None:
+ self.disconnect_by_func(self._button_press_event_cb)
+ self.disconnect_by_func(self._button_release_event_cb)
+ self.disconnect_by_func(self._motion_notify_event_cb)
+
+ self.ges_timeline.disconnect_by_func(self._durationChangedCb)
+ self.ges_timeline.disconnect_by_func(self._layer_added_cb)
+ self.ges_timeline.disconnect_by_func(self._layer_removed_cb)
+ self.ges_timeline.disconnect_by_func(self._snapCb)
+ self.ges_timeline.disconnect_by_func(self._snapEndedCb)
+ for ges_layer in self.ges_timeline.get_layers():
+ self._remove_layer(ges_layer)
+
+ self.ges_timeline.ui = None
+ self.ges_timeline = None
+
+ if self._project:
+ self._project.pipeline.disconnect_by_func(self._positionCb)
self._project = project
if self._project:
@@ -1631,14 +1630,15 @@ class TimelineContainer(Gtk.Grid, Zoomable, Loggable):
def _deleteSelected(self, unused_action, unused_parameter):
if self.ges_timeline:
- with self.app.action_log.started("delete clip",
-
finalizing_action=CommitTimelineFinalizingAction(self._project.pipeline),
- toplevel=True):
- for clip in self.timeline.selection:
- layer = clip.get_layer()
- if isinstance(clip, GES.TransitionClip):
- continue
- layer.remove_clip(clip)
+ with Previewer.manager.paused():
+ with self.app.action_log.started("delete clip",
+
finalizing_action=CommitTimelineFinalizingAction(self._project.pipeline),
+ toplevel=True):
+ for clip in self.timeline.selection:
+ layer = clip.get_layer()
+ if isinstance(clip, GES.TransitionClip):
+ continue
+ layer.remove_clip(clip)
self.timeline.selection.setSelection([], SELECT)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]