|
39 | 39 |
|
40 | 40 | from PyQt5.QtCore import QFileInfo, pyqtSlot, QUrl, Qt, QCoreApplication, QTimer, pyqtSignal
|
41 | 41 | from PyQt5.QtGui import QCursor, QKeySequence, QColor
|
42 |
| -from PyQt5.QtWidgets import QMenu, QDialog |
| 42 | +from PyQt5.QtWidgets import QMenu, QDialog, QShortcut |
43 | 43 |
|
44 | 44 | from classes import info, updates
|
45 | 45 | from classes.app import get_app
|
@@ -3309,6 +3309,43 @@ def render_cache_json(self):
|
3309 | 3309 | # Log the exception and ignore
|
3310 | 3310 | log.warning("Exception processing timeline cache: %s", ex)
|
3311 | 3311 |
|
| 3312 | + def seekPreviousFrame(self): |
| 3313 | + """Handle previous-frame keypress""" |
| 3314 | + player = get_app().window.preview_thread.player |
| 3315 | + frame_num = player.Position() - 1 |
| 3316 | + |
| 3317 | + # Seek to prevoius frame |
| 3318 | + get_app().window.PauseSignal.emit() |
| 3319 | + get_app().window.SpeedSignal.emit(0) |
| 3320 | + get_app().window.previewFrameSignal.emit(frame_num) |
| 3321 | + |
| 3322 | + # Notify properties dialog |
| 3323 | + get_app().window.propertyTableView.select_frame(frame_num) |
| 3324 | + |
| 3325 | + def seekNextFrame(self): |
| 3326 | + """Handle next-frame keypress""" |
| 3327 | + player = get_app().window.preview_thread.player |
| 3328 | + frame_num = player.Position() + 1 |
| 3329 | + |
| 3330 | + # Seek to next frame |
| 3331 | + get_app().window.PauseSignal.emit() |
| 3332 | + get_app().window.SpeedSignal.emit(0) |
| 3333 | + get_app().window.previewFrameSignal.emit(frame_num) |
| 3334 | + |
| 3335 | + # Notify properties dialog |
| 3336 | + get_app().window.propertyTableView.select_frame(frame_num) |
| 3337 | + |
| 3338 | + def playToggle(self): |
| 3339 | + """Handle play-pause-toggle keypress""" |
| 3340 | + player = get_app().window.preview_thread.player |
| 3341 | + frame_num = player.Position() |
| 3342 | + |
| 3343 | + # Toggle Play/Pause |
| 3344 | + get_app().window.actionPlay.trigger() |
| 3345 | + |
| 3346 | + # Notify properties dialog |
| 3347 | + get_app().window.propertyTableView.select_frame(frame_num) |
| 3348 | + |
3312 | 3349 | def __init__(self, window):
|
3313 | 3350 | super().__init__()
|
3314 | 3351 | self.setObjectName("TimelineWebView")
|
@@ -3366,3 +3403,13 @@ def __init__(self, window):
|
3366 | 3403 | # connect signal to receive waveform data
|
3367 | 3404 | self.clipAudioDataReady.connect(self.clipAudioDataReady_Triggered)
|
3368 | 3405 | self.fileAudioDataReady.connect(self.fileAudioDataReady_Triggered)
|
| 3406 | + |
| 3407 | + # Use shortcuts to override keypress capturing for arrow keys |
| 3408 | + # This is needed mostly due to WebEngine backend eating keypress events |
| 3409 | + # This approach works well for ALL backends though |
| 3410 | + QShortcut(app.window.getShortcutByName("seekPreviousFrame"), self, activated=self.seekPreviousFrame) |
| 3411 | + QShortcut(app.window.getShortcutByName("seekNextFrame"), self, activated=self.seekNextFrame) |
| 3412 | + QShortcut(app.window.getShortcutByName("playToggle"), self, activated=self.playToggle) |
| 3413 | + QShortcut(app.window.getShortcutByName("playToggle1"), self, activated=self.playToggle) |
| 3414 | + QShortcut(app.window.getShortcutByName("playToggle2"), self, activated=self.playToggle) |
| 3415 | + QShortcut(app.window.getShortcutByName("playToggle3"), self, activated=self.playToggle) |
0 commit comments