feat: album list, artist list, and artist detail views

- 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>
This commit is contained in:
joren
2026-03-24 00:59:02 +01:00
parent 2436b53697
commit d5dedacc36
11 changed files with 255 additions and 16 deletions

View File

@@ -63,10 +63,11 @@ MainWindow::MainWindow(QobuzBackend *backend, QWidget *parent)
// ---- Backend signals ----
connect(m_backend, &QobuzBackend::loginSuccess, this, &MainWindow::onLoginSuccess);
connect(m_backend, &QobuzBackend::loginError, this, &MainWindow::onLoginError);
connect(m_backend, &QobuzBackend::favTracksLoaded, this, &MainWindow::onFavTracksLoaded);
connect(m_backend, &QobuzBackend::favAlbumsLoaded, this, &MainWindow::onFavAlbumsLoaded);
connect(m_backend, &QobuzBackend::albumLoaded, this, &MainWindow::onAlbumLoaded);
connect(m_backend, &QobuzBackend::artistLoaded, this, &MainWindow::onArtistLoaded);
connect(m_backend, &QobuzBackend::favTracksLoaded, this, &MainWindow::onFavTracksLoaded);
connect(m_backend, &QobuzBackend::favAlbumsLoaded, this, &MainWindow::onFavAlbumsLoaded);
connect(m_backend, &QobuzBackend::favArtistsLoaded, this, &MainWindow::onFavArtistsLoaded);
connect(m_backend, &QobuzBackend::albumLoaded, this, &MainWindow::onAlbumLoaded);
connect(m_backend, &QobuzBackend::artistLoaded, this, &MainWindow::onArtistLoaded);
connect(m_backend, &QobuzBackend::playlistLoaded, this, &MainWindow::onPlaylistLoaded);
connect(m_backend, &QobuzBackend::trackChanged, this, &MainWindow::onTrackChanged);
connect(m_backend, &QobuzBackend::error, this, [this](const QString &msg) {
@@ -104,6 +105,12 @@ MainWindow::MainWindow(QobuzBackend *backend, QWidget *parent)
connect(m_sidePanel, &SidePanel::View::trackPlayRequested,
this, &MainWindow::onPlayTrackRequested);
// ---- Album / artist navigation from content views ----
connect(m_content, &MainContent::albumRequested,
this, &MainWindow::onSearchAlbumSelected);
connect(m_content, &MainContent::artistRequested,
this, &MainWindow::onSearchArtistSelected);
// ---- Toolbar toggles ----
connect(m_toolBar, &MainToolBar::searchToggled, this, &MainWindow::onSearchToggled);
connect(m_toolBar, &MainToolBar::queueToggled,
@@ -224,9 +231,16 @@ void MainWindow::onFavTracksLoaded(const QJsonObject &result)
void MainWindow::onFavAlbumsLoaded(const QJsonObject &result)
{
const int total = result["total"].toInt();
statusBar()->showMessage(tr("%1 favorite albums").arg(total), 4000);
// TODO: album grid view
m_content->showFavAlbums(result);
statusBar()->showMessage(
tr("%1 favorite albums").arg(result["total"].toInt()), 4000);
}
void MainWindow::onFavArtistsLoaded(const QJsonObject &result)
{
m_content->showFavArtists(result);
statusBar()->showMessage(
tr("%1 favorite artists").arg(result["total"].toInt()), 4000);
}
void MainWindow::onAlbumLoaded(const QJsonObject &album)
@@ -238,9 +252,9 @@ void MainWindow::onAlbumLoaded(const QJsonObject &album)
void MainWindow::onArtistLoaded(const QJsonObject &artist)
{
m_content->showArtist(artist);
statusBar()->showMessage(
tr("Artist: %1").arg(artist["name"].toString()), 4000);
// TODO: artist view
}
void MainWindow::onPlaylistLoaded(const QJsonObject &playlist)