[pitivi] Implement the ability to go a frame forward or backwards
- From: Jean-FranÃois Fortin Tam <jfft src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi] Implement the ability to go a frame forward or backwards
- Date: Sun, 2 Sep 2012 04:04:01 +0000 (UTC)
commit d6006aa11900b91b148987e8ea155d8f6177ed76
Author: Jean-FranÃois Fortin Tam <nekohayo gmail com>
Date: Fri Aug 24 11:29:53 2012 -0700
Implement the ability to go a frame forward or backwards
Fixes bug #573895
pitivi/timeline/timeline.py | 31 +++++++++++++++----------------
pitivi/utils/pipeline.py | 12 +++++++++++-
2 files changed, 26 insertions(+), 17 deletions(-)
---
diff --git a/pitivi/timeline/timeline.py b/pitivi/timeline/timeline.py
index 46a3ca7..37cbdda 100644
--- a/pitivi/timeline/timeline.py
+++ b/pitivi/timeline/timeline.py
@@ -108,8 +108,8 @@ AUDIO_EFFECT_LIST = [AUDIO_EFFECT_TARGET_ENTRY.target, EFFECT_TARGET_ENTRY.targe
DELETE = _("Delete Selected")
SPLIT = _("Split clip at playhead position")
KEYFRAME = _("Add a keyframe")
-PREVFRAME = _("Move to the previous keyframe")
-NEXTFRAME = _("Move to the next keyframe")
+PREVKEYFRAME = _("Move to the previous keyframe")
+NEXTKEYFRAME = _("Move to the next keyframe")
ZOOM_IN = _("Zoom In")
ZOOM_OUT = _("Zoom Out")
ZOOM_FIT = _("Zoom Fit")
@@ -143,8 +143,8 @@ ui = '''
<menuitem action="AlignObj" />
<separator />
<menuitem action="Keyframe" />
- <menuitem action="Prevframe" />
- <menuitem action="Nextframe" />
+ <menuitem action="Prevkeyframe" />
+ <menuitem action="Nextkeyframe" />
<separator />
<menuitem action="PlayPause" />
<menuitem action="Screenshot" />
@@ -956,7 +956,7 @@ class Timeline(gtk.Table, Loggable, Zoomable):
self._factories = None
self._finish_drag = False
self._createUI()
- self.rate = gst.Fraction(1, 1)
+ self._framerate = gst.Fraction(1, 1)
self._timeline = None
# Used to insert sources at the end of the timeline
@@ -1105,11 +1105,11 @@ class Timeline(gtk.Table, Loggable, Zoomable):
("Keyframe", "pitivi-keyframe", _("Add a Keyframe"),
"K", KEYFRAME, self.keyframe),
- ("Prevframe", "pitivi-prevframe", _("_Previous Keyframe"),
- "E", PREVFRAME, self.prevframe),
+ ("Prevkeyframe", None, _("_Previous Keyframe"),
+ "E", PREVKEYFRAME, self._previousKeyframeCb),
- ("Nextframe", "pitivi-nextframe", _("_Next Keyframe"),
- "R", NEXTFRAME, self.nextframe),
+ ("Nextkeyframe", None, _("_Next Keyframe"),
+ "R", NEXTKEYFRAME, self._nextKeyframeCb),
)
actiongroup = gtk.ActionGroup("timelinepermanent")
@@ -1158,14 +1158,14 @@ class Timeline(gtk.Table, Loggable, Zoomable):
elif mod & gtk.gdk.CONTROL_MASK:
self._seeker.seek(ltime + 1)
else:
- self._seeker.seekRelative(0 - long(self.rate * gst.SECOND))
+ self.app.current.pipeline.stepFrame(self._framerate, -1)
elif kv == gtk.keysyms.Right:
if mod & gtk.gdk.SHIFT_MASK:
self._seeker.seekRelative(gst.SECOND)
elif mod & gtk.gdk.CONTROL_MASK:
self._seeker.seek(rtime + 1)
else:
- self._seeker.seekRelative(long(self.rate * gst.SECOND))
+ self.app.current.pipeline.stepFrame(self._framerate, 1)
finally:
return True
@@ -1602,9 +1602,8 @@ class Timeline(gtk.Table, Loggable, Zoomable):
projectmanager.connect("new-project-loaded", self._projectChangedCb)
def _settingsChangedCb(self, project, old, new):
- rate = new.videorate
- self.rate = float(1 / rate)
- self.ruler.setProjectFrameRate(rate)
+ self._framerate = new.videorate
+ self.ruler.setProjectFrameRate(self._framerate)
## Timeline callbacks
@@ -1829,14 +1828,14 @@ class Timeline(gtk.Table, Loggable, Zoomable):
def playPause(self, unused_action):
self.app.current.pipeline.togglePlayback()
- def prevframe(self, action):
+ def _previousKeyframeCb(self, action):
position = self.app.current.pipeline.getPosition()
prev_kf = self.timeline.getPrevKeyframe(position)
if prev_kf:
self._seeker.seek(prev_kf)
self.scrollToPlayhead()
- def nextframe(self, action):
+ def _nextKeyframeCb(self, action):
position = self.app.current.pipeline.getPosition()
next_kf = self.timeline.getNextKeyframe(position)
if next_kf:
diff --git a/pitivi/utils/pipeline.py b/pitivi/utils/pipeline.py
index ef08f97..685fd18 100644
--- a/pitivi/utils/pipeline.py
+++ b/pitivi/utils/pipeline.py
@@ -377,7 +377,7 @@ class SimplePipeline(Loggable, Signallable):
self.debug("seeking failed")
raise PipelineError("seek failed")
- self.debug("seeking succesfull")
+ self.debug("seeking successful")
self.emit('position', position)
def seekRelative(self, time):
@@ -502,6 +502,16 @@ class Pipeline(ges.TimelinePipeline, SimplePipeline):
def _seekRelativeCb(self, unused_seeker, time):
self.seekRelative(time)
+ def stepFrame(self, framerate, frames_offset):
+ """
+ Seek backwards or forwards a certain amount of frames (frames_offset).
+ This clamps the playhead to the project frames.
+ """
+ cur_frame = int(round(self.getPosition() * framerate.num / float(gst.SECOND * framerate.denom), 2))
+ new_frame = cur_frame + frames_offset
+ new_pos = long(new_frame * gst.SECOND * framerate.denom / framerate.num)
+ self.simple_seek(new_pos)
+
def _seekCb(self, ruler, position, format):
"""
The app's main seek method used when the user seeks manually.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]