Skip to content

Commit 65ce747

Browse files
committed
Updating keypress detection for arrow keys, moving to QShortcut on Webview, to fix issues on WebEngine which would eat certain keypress events (left, right, up, down)
1 parent 19ef8fc commit 65ce747

File tree

3 files changed

+49
-37
lines changed

3 files changed

+49
-37
lines changed

src/settings/_default.settings

-4
Original file line numberDiff line numberDiff line change
@@ -738,10 +738,6 @@
738738
"value": "-",
739739
"type": "text"
740740
},
741-
742-
743-
744-
745741
{
746742
"category": "Keyboard",
747743
"title": "Previous Frame",

src/windows/main_window.py

+1-32
Original file line numberDiff line numberDiff line change
@@ -1592,45 +1592,14 @@ def keyPressEvent(self, event):
15921592
fps_float = float(fps["num"]) / float(fps["den"])
15931593
playhead_position = float(self.preview_thread.current_frame - 1) / fps_float
15941594

1595-
# Basic shortcuts i.e just a letter
1596-
if key.matches(self.getShortcutByName("seekPreviousFrame")) == QKeySequence.ExactMatch:
1597-
# Pause video
1598-
self.PauseSignal.emit()
1599-
self.SpeedSignal.emit(0)
1600-
# Seek to previous frame
1601-
self.SeekSignal.emit(player.Position() - 1)
1602-
1603-
# Notify properties dialog
1604-
self.propertyTableView.select_frame(player.Position())
1605-
1606-
elif key.matches(self.getShortcutByName("seekNextFrame")) == QKeySequence.ExactMatch:
1607-
# Pause video
1608-
self.PauseSignal.emit()
1609-
self.SpeedSignal.emit(0)
1610-
# Seek to next frame
1611-
self.SeekSignal.emit(player.Position() + 1)
1612-
1613-
# Notify properties dialog
1614-
self.propertyTableView.select_frame(player.Position())
1615-
1616-
elif key.matches(self.getShortcutByName("rewindVideo")) == QKeySequence.ExactMatch:
1595+
if key.matches(self.getShortcutByName("rewindVideo")) == QKeySequence.ExactMatch:
16171596
# Toggle rewind and start playback
16181597
self.actionRewind.trigger()
16191598

16201599
elif key.matches(self.getShortcutByName("fastforwardVideo")) == QKeySequence.ExactMatch:
16211600
# Toggle fastforward button and start playback
16221601
self.actionFastForward.trigger()
16231602

1624-
elif any([
1625-
key.matches(self.getShortcutByName("playToggle")) == QKeySequence.ExactMatch,
1626-
key.matches(self.getShortcutByName("playToggle1")) == QKeySequence.ExactMatch,
1627-
key.matches(self.getShortcutByName("playToggle2")) == QKeySequence.ExactMatch,
1628-
key.matches(self.getShortcutByName("playToggle3")) == QKeySequence.ExactMatch,
1629-
]):
1630-
# Toggle playbutton and show properties
1631-
self.actionPlay.trigger()
1632-
self.propertyTableView.select_frame(player.Position())
1633-
16341603
elif any([
16351604
key.matches(self.getShortcutByName("deleteItem")) == QKeySequence.ExactMatch,
16361605
key.matches(self.getShortcutByName("deleteItem1")) == QKeySequence.ExactMatch,

src/windows/views/webview.py

+48-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939

4040
from PyQt5.QtCore import QFileInfo, pyqtSlot, QUrl, Qt, QCoreApplication, QTimer, pyqtSignal
4141
from PyQt5.QtGui import QCursor, QKeySequence, QColor
42-
from PyQt5.QtWidgets import QMenu, QDialog
42+
from PyQt5.QtWidgets import QMenu, QDialog, QShortcut
4343

4444
from classes import info, updates
4545
from classes.app import get_app
@@ -3309,6 +3309,43 @@ def render_cache_json(self):
33093309
# Log the exception and ignore
33103310
log.warning("Exception processing timeline cache: %s", ex)
33113311

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+
33123349
def __init__(self, window):
33133350
super().__init__()
33143351
self.setObjectName("TimelineWebView")
@@ -3366,3 +3403,13 @@ def __init__(self, window):
33663403
# connect signal to receive waveform data
33673404
self.clipAudioDataReady.connect(self.clipAudioDataReady_Triggered)
33683405
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

Comments
 (0)