fix: let lock mode scrub audio timeline playhead

This commit is contained in:
2026-07-04 20:40:28 +02:00
parent 6cfac8baa9
commit 36fc1b9591
2 changed files with 39 additions and 1 deletions
+3 -1
View File
@@ -2617,8 +2617,10 @@ class TimelineWidget(QWidget):
self._sb_drag_offset = thumb_w / 2 self._sb_drag_offset = thumb_w / 2
self.update() self.update()
return return
# Audio mode: dragging/resizing the teal band takes priority over seeking. # Audio mode: dragging/resizing the teal band takes priority over seeking,
# except in lock mode where clicks scrub playback without moving regions.
if (self._audio_mode and self._audio_region is not None if (self._audio_mode and self._audio_region is not None
and not self._locked
and event.button() == Qt.MouseButton.LeftButton): and event.button() == Qt.MouseButton.LeftButton):
self._audio_begin_drag_at_x(x) self._audio_begin_drag_at_x(x)
if self._audio_drag is not None: if self._audio_drag is not None:
+36
View File
@@ -371,6 +371,42 @@ def test_timeline_audio_hover_cursor_state(win):
assert tl._audio_hit_at_x(tl._time_to_x(12.0)) == "create" assert tl._audio_hit_at_x(tl._time_to_x(12.0)) == "create"
def test_timeline_audio_mode_lock_click_scrubs_playhead_not_region(win):
from PyQt6.QtCore import QEvent, QPointF, Qt
from PyQt6.QtGui import QMouseEvent
tl = win._timeline
tl._duration = 20.0
tl._view_start = 0.0
tl._view_span = 20.0
tl.resize(400, tl.height() or 80)
tl.set_audio_mode(True)
tl.set_audio_region(4.0, 8.0)
tl.set_cursor(4.0)
tl._locked = True
got_seek = []
got_audio = []
tl.seek_changed.connect(lambda t: got_seek.append(t))
tl.audio_region_changed.connect(lambda s, e: got_audio.append((s, e)))
x = tl._time_to_x(12.0)
y = tl._SCROLLBAR_H + tl._RULER_H + 20
press = QMouseEvent(
QEvent.Type.MouseButtonPress, QPointF(x, y),
Qt.MouseButton.LeftButton, Qt.MouseButton.LeftButton,
Qt.KeyboardModifier.NoModifier)
release = QMouseEvent(
QEvent.Type.MouseButtonRelease, QPointF(x, y),
Qt.MouseButton.LeftButton, Qt.MouseButton.NoButton,
Qt.KeyboardModifier.NoModifier)
tl.mousePressEvent(press)
tl.mouseReleaseEvent(release)
assert abs((tl._play_pos or 0.0) - 12.0) < 0.1
assert tl._audio_region == (4.0, 8.0)
assert not got_audio
assert got_seek and abs(got_seek[-1] - 12.0) < 0.1
def test_timeline_audio_mode_follows_deck(win): def test_timeline_audio_mode_follows_deck(win):
win._control_deck.setCurrentWidget(win._tab_audio) win._control_deck.setCurrentWidget(win._tab_audio)
assert win._timeline._audio_mode is True assert win._timeline._audio_mode is True