[pitivi/ges: 85/287] utils: Add a seekRelative method to the Seeker
- From: Jean-FranÃois Fortin Tam <jfft src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi/ges: 85/287] utils: Add a seekRelative method to the Seeker
- Date: Thu, 15 Mar 2012 16:32:58 +0000 (UTC)
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]