refactor: UI polish — lock sidebar, remove nav buttons, uniform artist tables, deep shuffle

- Lock sidebar width (setFixedWidth) so it doesn't jump between views
- Remove back/forward navigation buttons and all NavPage history code
- Uniform column layout on artist page: hide Artist column from both
  Popular Tracks and release sections, set matching fixed column widths
  so columns align vertically across all sections
- Deep shuffle: new Rust FFI endpoint fetches tracks from all albums
  in parallel, combines them, and returns via EV_DEEP_SHUFFLE_OK
- Auto-paginate artist releases in Rust (loop until has_more=false)
  so all releases load at once sorted newest-first

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
joren
2026-03-25 23:42:00 +01:00
parent 333a620be2
commit a21d0c8a33
13 changed files with 217 additions and 161 deletions

View File

@@ -40,7 +40,8 @@ MainWindow::MainWindow(QobuzBackend *backend, QWidget *parent)
m_libraryDock->setObjectName(QStringLiteral("libraryDock"));
m_libraryDock->setFeatures(QDockWidget::DockWidgetMovable);
m_libraryDock->setWidget(m_library);
m_libraryDock->setMinimumWidth(200);
m_libraryDock->setMinimumWidth(180);
m_library->setFixedWidth(220);
addDockWidget(Qt::LeftDockWidgetArea, m_libraryDock);
// ---- Now-playing context dock (left, below library) ----
@@ -86,6 +87,8 @@ MainWindow::MainWindow(QobuzBackend *backend, QWidget *parent)
connect(m_backend, &QobuzBackend::artistLoaded, this, &MainWindow::onArtistLoaded);
connect(m_backend, &QobuzBackend::artistReleasesLoaded,
m_content, &MainContent::updateArtistReleases);
connect(m_backend, &QobuzBackend::deepShuffleTracksLoaded,
m_content, &MainContent::onDeepShuffleTracks);
connect(m_backend, &QobuzBackend::playlistLoaded, this, &MainWindow::onPlaylistLoaded);
connect(m_backend, &QobuzBackend::playlistCreated, this, &MainWindow::onPlaylistCreated);
connect(m_backend, &QobuzBackend::playlistDeleted, this, [this](const QJsonObject &) {
@@ -170,22 +173,6 @@ MainWindow::MainWindow(QobuzBackend *backend, QWidget *parent)
connect(m_toolBar, &MainToolBar::queueToggled,
this, [this](bool v) { m_queuePanel->setVisible(v); });
connect(m_toolBar->backAction(), &QAction::triggered, this, [this] {
if (m_navIndex <= 0) return;
--m_navIndex;
m_navFromHistory = true;
navigateTo(m_navHistory[m_navIndex]);
m_navFromHistory = false;
updateNavButtons();
});
connect(m_toolBar->forwardAction(), &QAction::triggered, this, [this] {
if (m_navIndex >= m_navHistory.size() - 1) return;
++m_navIndex;
m_navFromHistory = true;
navigateTo(m_navHistory[m_navIndex]);
m_navFromHistory = false;
updateNavButtons();
});
connect(m_toolBar, &MainToolBar::albumRequested, this, &MainWindow::onSearchAlbumSelected);
connect(m_toolBar, &MainToolBar::artistRequested, this, &MainWindow::onSearchArtistSelected);
@@ -394,16 +381,12 @@ void MainWindow::onPlayTrackRequested(qint64 trackId)
void MainWindow::onSearchAlbumSelected(const QString &albumId)
{
NavPage p; p.type = NavPage::Album; p.albumId = albumId;
pushNav(p.type, p.albumId);
m_backend->getAlbum(albumId);
statusBar()->showMessage(tr("Loading album…"));
}
void MainWindow::onSearchArtistSelected(qint64 artistId)
{
NavPage p; p.type = NavPage::Artist; p.artistId = artistId;
pushNav(p.type, {}, p.artistId);
m_backend->getArtist(artistId);
statusBar()->showMessage(tr("Loading artist…"));
}
@@ -429,38 +412,3 @@ void MainWindow::onUserPlaylistsChanged(const QVector<QPair<qint64, QString>> &p
m_content->tracksList()->setUserPlaylists(playlists);
}
void MainWindow::pushNav(NavPage::Type type, const QString &albumId, qint64 artistId)
{
if (m_navFromHistory) return;
// Truncate any forward history
while (m_navHistory.size() > m_navIndex + 1)
m_navHistory.removeLast();
NavPage p;
p.type = type;
p.albumId = albumId;
p.artistId = artistId;
m_navHistory.push_back(p);
m_navIndex = m_navHistory.size() - 1;
updateNavButtons();
}
void MainWindow::navigateTo(const NavPage &page)
{
switch (page.type) {
case NavPage::Album:
m_backend->getAlbum(page.albumId);
statusBar()->showMessage(tr("Loading album…"));
break;
case NavPage::Artist:
m_backend->getArtist(page.artistId);
statusBar()->showMessage(tr("Loading artist…"));
break;
default: break;
}
}
void MainWindow::updateNavButtons()
{
m_toolBar->backAction()->setEnabled(m_navIndex > 0);
m_toolBar->forwardAction()->setEnabled(m_navIndex < m_navHistory.size() - 1);
}