When the H badge column was added, TypeRole was accidentally stored in
col 1 but the double-click handler reads it from col 0, breaking album
navigation from search. Move TypeRole back to col 0.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add QPalette::PlaceholderText (#8C8C8C) to the dark palette so
placeholder text in search box and settings fields is readable
- Add H column to search album results (same gold badge as album list view)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds a narrow first column showing a small bold gold "H" for any album
with hires_streamable=true. Applies to both fav albums and artist pages.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Seeking:
- Rust player: seek_requested/seek_target_secs atomics on PlayerStatus
- Decoder loop checks for seek each iteration, calls format.seek() and resets decoder
- New qobuz_backend_seek C FFI + QobuzBackend::seek(quint64)
- Progress slider onProgressReleased now seeks to the dragged position
Last.fm:
- LastFmScrobbler: now-playing + scrobble (50% or 240s threshold, min 30s)
- API signature follows Last.fm spec (sorted params, md5)
- Settings dialog: API key/secret, username/password, Connect button with status
- AppSettings: lastfm/enabled, api_key, api_secret, session_key
- Scrobbler wired to trackChanged, positionChanged, trackFinished in MainWindow
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removed the sortApplied→syncQueueToModel connection. Sorting the track
list only reorders the view; the queue is only set when a track is
actually played (double-click or Play Now), at which point the current
sorted order and clicked row are used.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fav albums: now shows a sortable list (title/artist/year/tracks);
double-click opens the album
- Fav artists: now shows a sortable list; double-click opens the artist
- Artist detail page: name, biography summary, and their album list
- Rust ArtistDto gains albums field; get_artist fixed to extra=albums only
- Volume popup minimum width set so "100%" label is never clipped
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Opening a playlist/album no longer resets the queue. The queue context
is now set inside onDoubleClicked and the "Play Now" context menu action,
using the current (possibly sorted) model order at the moment of play.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
advance() was removing the playNext item then calling current(), which
fell back to m_queue[m_index] — the same track already playing. Fix:
use takeFirst() and return that item directly, only advancing m_index
when the playNext list is empty.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Lightweight Qt6 desktop client for Qobuz with a Rust audio backend
(Symphonia/CPAL via staticlib FFI). Mirrors the spotify-qt layout:
toolbar with playback controls, library/context docks on the left,
tabbed search side panel on the right, queue panel, now-playing dock.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ClickableSlider previously accepted the mouse press without forwarding
to QSlider, so the drag mechanism never started. Now setSliderPosition
is called first (jumping the handle to the click point) and the event
is always forwarded so Qt enters normal drag mode. mouseMoveEvent is
also overridden to keep snapping to the cursor during a drag.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>