83 lines
2.9 KiB
Python
83 lines
2.9 KiB
Python
"""Round 24: sidebar drag auto-scroll.
|
|
|
|
Dragging a playlist (or tracks) near the top/bottom edge of the sidebar's
|
|
playlist tree scrolls the tree so off-screen rows can be reached. Same root
|
|
cause and fix as the track table's Round 13: our dragMoveEvent accepts the
|
|
event itself, so Qt's built-in autoscroll never runs. The direction helper
|
|
(autoscroll_direction) is shared with the table and already covered by
|
|
test_round13.
|
|
"""
|
|
|
|
from PyQt6.QtCore import QPoint
|
|
|
|
from lintunes.models import Library, Track
|
|
from lintunes.library_manager import LibraryManager
|
|
from lintunes.gui.sidebar import PlaylistTree
|
|
|
|
|
|
def _tree(qapp, tmp_path, playlists=0):
|
|
library = Library(tracks={1: Track(track_id=1, name="One")})
|
|
manager = LibraryManager(library, tmp_path)
|
|
tree = PlaylistTree(manager)
|
|
for i in range(playlists):
|
|
manager.create_playlist(f"playlist {i}")
|
|
# Small viewport: enough rows that the scrollbar gets a real range (the
|
|
# view re-derives the range itself, so a manual setRange doesn't stick;
|
|
# show() forces the polish/layout pass that computes it).
|
|
tree.resize(200, 100)
|
|
tree.show()
|
|
return tree
|
|
|
|
|
|
class TestAutoscrollTick:
|
|
def test_tick_scrolls_by_direction(self, qapp, tmp_path):
|
|
tree = _tree(qapp, tmp_path, playlists=60)
|
|
bar = tree.verticalScrollBar()
|
|
assert bar.maximum() > 20 # real range from the rows
|
|
bar.setValue(10)
|
|
|
|
tree._autoscroll_dir = 1
|
|
tree._autoscroll_tick()
|
|
assert bar.value() == 11
|
|
|
|
tree._autoscroll_dir = -1
|
|
tree._autoscroll_tick()
|
|
assert bar.value() == 10
|
|
|
|
def test_tick_stops_at_the_end(self, qapp, tmp_path):
|
|
tree = _tree(qapp, tmp_path, playlists=60)
|
|
bar = tree.verticalScrollBar()
|
|
bar.setValue(bar.maximum()) # already at the bottom
|
|
|
|
tree._autoscroll_dir = 1
|
|
tree._autoscroll_timer.start()
|
|
tree._autoscroll_tick()
|
|
|
|
assert bar.value() == bar.maximum()
|
|
assert not tree._autoscroll_timer.isActive()
|
|
|
|
|
|
class TestUpdateAutoscroll:
|
|
def test_edge_starts_timer(self, qapp, tmp_path):
|
|
tree = _tree(qapp, tmp_path)
|
|
tree.resize(200, 300)
|
|
tree._update_autoscroll(QPoint(10, 5), accepted=True)
|
|
assert tree._autoscroll_dir == -1
|
|
assert tree._autoscroll_timer.isActive()
|
|
|
|
def test_rejected_drop_keeps_timer_off(self, qapp, tmp_path):
|
|
tree = _tree(qapp, tmp_path)
|
|
tree.resize(200, 300)
|
|
tree._update_autoscroll(QPoint(10, 5), accepted=False)
|
|
assert tree._autoscroll_dir == 0
|
|
assert not tree._autoscroll_timer.isActive()
|
|
|
|
def test_stop_autoscroll_resets(self, qapp, tmp_path):
|
|
tree = _tree(qapp, tmp_path)
|
|
tree._autoscroll_dir = 1
|
|
tree._autoscroll_timer.start()
|
|
tree._stop_autoscroll()
|
|
assert tree._autoscroll_dir == 0
|
|
assert tree._autoscroll_pos is None
|
|
assert not tree._autoscroll_timer.isActive()
|