v0.5.1: one cast control instead of two

The cast glyph showed up both under the volume slider and inside the
visualizer, which was redundant. Dropped the volume-slider indicator
(gui/cast_indicator.py deleted) and made the visualizer panel the single
cast control — the volume slider goes back to sitting on its own, and
nothing shifts position when a session starts.

The panel's glyph is bigger (20 -> 40px) and always painted in the theme
highlight rather than following the brightness mode. Clicking it now stops
casting instead of cycling on/dim/off, which meant nothing when there are
no bars to dim; that click was the useful behavior the volume-slider icon
had, so it moves here rather than being lost.

transport_icon() takes a size and scales the painter, so the bigger glyph
is repainted crisply rather than being a blown-up 20px pixmap; size joins
the cache key. The cast/cast_connected glyph pair collapses into one,
since only the connected state was ever drawn.

450 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-13 22:24:31 -04:00
co-authored by Claude Opus 5
parent 6c746c3330
commit bcc17a7542
8 changed files with 132 additions and 141 deletions
+6 -3
View File
@@ -127,9 +127,12 @@ persistence) → GUI (Qt widgets that read the manager and connect to its signal
`CastBrowser`; `sink.py` is the `PlaybackSink`; `controller.py` owns the
session and its own `SleepInhibitor`. **pychromecast is imported lazily**, never
at module scope, so the app still launches where the dep isn't installed yet.
While casting there is no local PCM, so the visualizer shows the cast glyph
instead of bars, and position comes from a 500 ms poll of
`adjusted_current_time` (only trusted while PLAYING — it creeps while paused).
While casting there is no local PCM, so the **visualizer panel doubles as the
cast indicator**: it shows the cast glyph instead of bars and a click there
stops casting (the brightness cycle is suppressed — it means nothing with no
bars). That is the only cast control in the transport bar. Position comes from
a 500 ms poll of `adjusted_current_time` (only trusted while PLAYING — it
creeps while paused).
## Conventions & gotchas