[pitivi] Implement the ability to go a frame forward or backwards



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]