[pitivi/ges: 85/287] utils: Add a seekRelative method to the Seeker



commit 7f5878946442008a35814b299685526777f6b971
Author: Thibault Saunier <thibault saunier collabora com>
Date:   Tue Dec 13 20:19:41 2011 -0300

    utils: Add a seekRelative method to the Seeker
    
        + Handle the "flush" signal it in mainwindow
        + Make use of seekRelative in ui.timeline
    
    bonus: Make use of the new flush() method in clipproperties

 pitivi/ui/clipproperties.py |    5 +++--
 pitivi/ui/mainwindow.py     |   13 +++++++++++++
 pitivi/ui/timeline.py       |   14 ++++----------
 pitivi/utils.py             |   33 +++++++++++++++++++++++++++++----
 4 files changed, 49 insertions(+), 16 deletions(-)
---
diff --git a/pitivi/ui/clipproperties.py b/pitivi/ui/clipproperties.py
index 2566055..6ccd754 100644
--- a/pitivi/ui/clipproperties.py
+++ b/pitivi/ui/clipproperties.py
@@ -515,6 +515,7 @@ class TransformationProperties(gtk.Expander):
         self.default_values = {}
         self.set_label(_("Transformation"))
         self.set_sensitive(False)
+        self._seeker = Seeker(80)
 
         if not "Frei0r" in soft_deps:
             self.builder = gtk.Builder()
@@ -604,7 +605,7 @@ class TransformationProperties(gtk.Expander):
             box.update_from_effect(self.effect)
 
     def _flushPipeLineCb(self, widget):
-        return
+        self._seeker.flush()
 
     def _findEffect(self, name):
         for track_effect in self._current_tl_obj.get_track_objects():
@@ -648,7 +649,7 @@ class TransformationProperties(gtk.Expander):
             if self._current_tl_obj:
                 self._current_tl_obj = None
                 self.zoom_scale.set_value(1.0)
-                self.app.gui.viewer.pipeline.flushSeekVideo()
+                self._seeker.flush()
             self.effect = None
             self.set_sensitive(False)
         self._updateBoxVisibility()
diff --git a/pitivi/ui/mainwindow.py b/pitivi/ui/mainwindow.py
index 5669f81..9da31a7 100644
--- a/pitivi/ui/mainwindow.py
+++ b/pitivi/ui/mainwindow.py
@@ -699,6 +699,7 @@ class PitiviMainWindow(gtk.Window, Loggable):
             self._zoom_duration_changed = True
 
         self.project.seeker.connect("seek", self._timelineSeekCb)
+        self.project.seeker.connect("seek-relative", self._timelineSeekRelativeCb)
         self.project.seeker.connect("flush", self._timelineSeekFlushCb)
 
         # preliminary seek to ensure the project pipeline is configured
@@ -1074,6 +1075,18 @@ class PitiviMainWindow(gtk.Window, Loggable):
         #GES crazyness... Implement
         pass
 
+    def _timelineSeekRelativeCb(self, unused_seeker, time):
+        try:
+            position = self.project_pipeline.query_position(gst.FORMAT_TIME)[0]
+            position += time
+
+            self.project_pipeline.seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH,
+                    gst.SEEK_TYPE_SET, position, gst.SEEK_TYPE_NONE, -1)
+            self.timeline.timelinePositionChanged(position)
+
+        except Exception, e:
+            self.error("seek failed %s %s %s", gst.TIME_ARGS(position), format, e)
+
     def _timelineSeekFlushCb(self, unused_seeker):
         try:
             position = self.project_pipeline.query_position(gst.FORMAT_TIME)[0]
diff --git a/pitivi/ui/timeline.py b/pitivi/ui/timeline.py
index cf3ee94..e069966 100644
--- a/pitivi/ui/timeline.py
+++ b/pitivi/ui/timeline.py
@@ -383,27 +383,21 @@ class Timeline(gtk.Table, Loggable, Zoomable):
 
             if kv == gtk.keysyms.Left:
                 if mod & gtk.gdk.SHIFT_MASK:
-                    self._seekRelative(0 - gst.SECOND)
+                    self._seeker.seekRelative(0 - gst.SECOND)
                 elif mod & gtk.gdk.CONTROL_MASK:
                     self._seeker.seek(ltime + 1)
                 else:
-                    self._seekRelative(0 - long(self.rate * gst.SECOND))
+                    self._seeker.seekRelative(0 - long(self.rate * gst.SECOND))
             elif kv == gtk.keysyms.Right:
                 if mod & gtk.gdk.SHIFT_MASK:
-                    self._seekRelative(gst.SECOND)
+                    self._seeker.seekRelative(gst.SECOND)
                 elif mod & gtk.gdk.CONTROL_MASK:
                     self._seeker.seek(rtime + 1)
                 else:
-                    self._seekRelative(long(self.rate * gst.SECOND))
+                    self.seeker.seekRelative(long(self.rate * gst.SECOND))
         finally:
             return True
 
-    def _seekRelative(self, time):
-        pipeline = self._project.pipeline
-        seekvalue = max(0, min(pipeline.getPosition() + time,
-            pipeline.getDuration()))
-        self._seeker.seek(seekvalue)
-
 ## Drag and Drop callbacks
 
     def _dragMotionCb(self, unused, context, x, y, timestamp):
diff --git a/pitivi/utils.py b/pitivi/utils.py
index d238fb6..85675f8 100644
--- a/pitivi/utils.py
+++ b/pitivi/utils.py
@@ -310,8 +310,11 @@ class Seeker(Signallable):
     operations in the pipeline.
     """
 
-    __signals__ = {'seek': ['position', 'format'],
-                   'flush': []}
+    __signals__ = {
+        'seek': ['position', 'format'],
+        'flush': [],
+        'seek-relative': ['time']
+    }
     _instance = None
 
     def __new__(cls, *args, **kwargs):
@@ -325,6 +328,7 @@ class Seeker(Signallable):
         self.pending_seek_id = None
         self.position = None
         self.format = None
+        self._time = None
 
     def seek(self, position, format=gst.FORMAT_TIME, on_idle=False):
         self.position = position
@@ -338,6 +342,16 @@ class Seeker(Signallable):
             self.pending_seek_id = self._scheduleSeek(self.timeout,
                     self._seekTimeoutCb)
 
+    def seekRelative(self, time, on_idle=False):
+        if self.pending_seek_id is None:
+            self._time = time
+            if on_idle:
+                gobject.idle_add(self._seekRelativeTimeoutCb)
+            else:
+                self._seekTimeoutCb()
+            self.pending_seek_id = self._scheduleSeek(self.timeout,
+                    self._seekTimeoutCb, True)
+
     def flush(self):
         try:
             self.emit('flush')
@@ -347,9 +361,20 @@ class Seeker(Signallable):
     def _scheduleSeek(self, timeout, callback):
         return gobject.timeout_add(timeout, callback)
 
-    def _seekTimeoutCb(self):
+    def _seekTimeoutCb(self, relative=False):
         self.pending_seek_id = None
-        if self.position != None and self.format != None:
+        if relative:
+            try:
+                self.emit('seek-relative', self._time)
+            except:
+                log.doLog(log.ERROR, None, "seeker", "Error while seeking %s relative",
+                        self._time)
+                # if an exception happened while seeking, properly
+                # reset ourselves
+                return False
+
+            self._time = None
+        elif self.position != None and self.format != None:
             position, self.position = self.position, None
             format, self.format = self.format, None
             try:



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