v0.55.0: Kaleidostrobe smooth again; visualizer tile hover controls

The cones move only on the plugin's own 25 fps frames again: driving them
from fresh audio every refresh made bass-heavy songs twitch (a jump on 84%
of refreshes against 41%). The continuous turn, texture crossfade and the
GPU big window stay.

The tile: a click opens it big (and it stays blank while big); hovering
shows a colour wheel (colour / gray / off) and up/down arrows (previous /
next visualizer). No more double-click or click-to-cycle. The big album
art closes on a click or Esc, like the big visualizer.
This commit is contained in:
2026-10-14 12:51:38 -07:00
parent 7ae55e757a
commit 00aa5e7f2e
14 changed files with 414 additions and 95 deletions
+9 -9
View File
@@ -80,11 +80,11 @@ class TestVisualizerToggle:
vis = VisualizerWidget(player)
assert vis._mode == MODE_ON
vis.mousePressEvent(None) # on -> dim
vis.cycle_mode() # on -> dim
assert vis._mode == MODE_DIM
vis.mousePressEvent(None) # dim -> off
vis.cycle_mode() # dim -> off
assert vis._mode == MODE_OFF
vis.mousePressEvent(None) # off -> on (wraps)
vis.cycle_mode() # off -> on (wraps)
assert vis._mode == MODE_ON
def test_off_goes_blank_and_stops(self, qapp):
@@ -94,8 +94,8 @@ class TestVisualizerToggle:
vis = VisualizerWidget(player)
vis._bars = [7] * BANDS # pretend mid-animation
vis.mousePressEvent(None) # on -> dim
vis.mousePressEvent(None) # dim -> off
vis.cycle_mode() # on -> dim
vis.cycle_mode() # dim -> off
assert vis._mode == MODE_OFF
assert vis._bars == [0] * BANDS # blank, not the held frame
@@ -108,7 +108,7 @@ class TestVisualizerToggle:
player._playing = True
vis = VisualizerWidget(player)
vis.mousePressEvent(None) # on -> dim
vis.cycle_mode() # on -> dim
assert vis._mode == MODE_DIM
assert vis._timer.isActive() # dim animates while playing
@@ -119,9 +119,9 @@ class TestVisualizerToggle:
player._playing = True
vis = VisualizerWidget(player)
vis.mousePressEvent(None) # on -> dim
vis.mousePressEvent(None) # dim -> off
vis.mousePressEvent(None) # off -> on again
vis.cycle_mode() # on -> dim
vis.cycle_mode() # dim -> off
vis.cycle_mode() # off -> on again
assert vis._mode == MODE_ON
assert vis._timer.isActive()