refactor: unify context menus across all views
- Add icons to all context menus (search panel, genre browser, queue panel) matching the track list's established pattern - Standardize navigation wording: "Open album: X" / "Open artist: X" consistently (was "Go to" in search panel, bare "Open Album" in genre browser) - Genre browser album menu: add "Add to favorites" and "Open artist: X" (was missing both) - Genre browser playlist menu: add icon, lowercase "playlist" for consistency - Queue panel menu: add list-remove and go-up icons - Track list: add icon to "Remove from this playlist" action - Search panel album menu: add icons for all actions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -347,7 +347,7 @@ void Tracks::onContextMenu(const QPoint &pos)
|
|||||||
m_model->data(index, TrackListModel::PlaylistTrackIdRole).toLongLong();
|
m_model->data(index, TrackListModel::PlaylistTrackIdRole).toLongLong();
|
||||||
if (playlistTrackId > 0) {
|
if (playlistTrackId > 0) {
|
||||||
if (m_userPlaylists.isEmpty()) menu.addSeparator();
|
if (m_userPlaylists.isEmpty()) menu.addSeparator();
|
||||||
auto *remFromPl = menu.addAction(tr("Remove from this playlist"));
|
auto *remFromPl = menu.addAction(QIcon(":/res/icons/list-remove.svg"), tr("Remove from this playlist"));
|
||||||
const qint64 curPlaylistId = m_playlistId;
|
const qint64 curPlaylistId = m_playlistId;
|
||||||
const int curRow = index.row();
|
const int curRow = index.row();
|
||||||
connect(remFromPl, &QAction::triggered, this, [this, curPlaylistId, playlistTrackId, curRow] {
|
connect(remFromPl, &QAction::triggered, this, [this, curPlaylistId, playlistTrackId, curRow] {
|
||||||
|
|||||||
@@ -723,16 +723,28 @@ void GenreBrowserView::onAlbumContextMenu(const QPoint &pos)
|
|||||||
|
|
||||||
const QString albumId = item->data(1, Qt::UserRole).toString();
|
const QString albumId = item->data(1, Qt::UserRole).toString();
|
||||||
const qint64 artistId = item->data(2, Qt::UserRole).toLongLong();
|
const qint64 artistId = item->data(2, Qt::UserRole).toLongLong();
|
||||||
|
const QString albumTitle = item->text(1);
|
||||||
|
const QString artistName = item->text(2);
|
||||||
|
|
||||||
QMenu menu(this);
|
QMenu menu(this);
|
||||||
|
|
||||||
auto *openAlbum = menu.addAction(tr("Open Album"));
|
auto *openAlbum = menu.addAction(
|
||||||
|
QIcon(":/res/icons/view-media-album-cover.svg"),
|
||||||
|
tr("Open album: %1").arg(QString(albumTitle).replace(QLatin1Char('&'), QStringLiteral("&&"))));
|
||||||
connect(openAlbum, &QAction::triggered, this, [this, albumId] {
|
connect(openAlbum, &QAction::triggered, this, [this, albumId] {
|
||||||
emit albumSelected(albumId);
|
emit albumSelected(albumId);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
auto *addFav = menu.addAction(QIcon(":/res/icons/starred-symbolic.svg"), tr("Add to favorites"));
|
||||||
|
connect(addFav, &QAction::triggered, this, [this, albumId] {
|
||||||
|
m_backend->addFavAlbum(albumId);
|
||||||
|
});
|
||||||
|
|
||||||
if (artistId > 0) {
|
if (artistId > 0) {
|
||||||
auto *openArtist = menu.addAction(tr("Open Artist"));
|
menu.addSeparator();
|
||||||
|
auto *openArtist = menu.addAction(
|
||||||
|
QIcon(":/res/icons/view-media-artist.svg"),
|
||||||
|
tr("Open artist: %1").arg(QString(artistName).replace(QLatin1Char('&'), QStringLiteral("&&"))));
|
||||||
connect(openArtist, &QAction::triggered, this, [this, artistId] {
|
connect(openArtist, &QAction::triggered, this, [this, artistId] {
|
||||||
emit artistSelected(artistId);
|
emit artistSelected(artistId);
|
||||||
});
|
});
|
||||||
@@ -762,7 +774,8 @@ void GenreBrowserView::onPlaylistContextMenu(const QPoint &pos)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
QMenu menu(this);
|
QMenu menu(this);
|
||||||
auto *openPlaylist = menu.addAction(tr("Open Playlist"));
|
auto *openPlaylist = menu.addAction(
|
||||||
|
QIcon(":/res/icons/view-media-playlist.svg"), tr("Open playlist"));
|
||||||
connect(openPlaylist, &QAction::triggered, this, [this, playlistId] {
|
connect(openPlaylist, &QAction::triggered, this, [this, playlistId] {
|
||||||
emit playlistSelected(playlistId);
|
emit playlistSelected(playlistId);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -225,8 +225,8 @@ void QueuePanel::onContextMenu(const QPoint &pos)
|
|||||||
const int idx = item->data(UpcomingIndexRole).toInt();
|
const int idx = item->data(UpcomingIndexRole).toInt();
|
||||||
|
|
||||||
QMenu menu(this);
|
QMenu menu(this);
|
||||||
auto *removeAct = menu.addAction(tr("Remove from queue"));
|
auto *removeAct = menu.addAction(QIcon(":/res/icons/list-remove.svg"), tr("Remove from queue"));
|
||||||
auto *toTopAct = menu.addAction(tr("Move to top (play next)"));
|
auto *toTopAct = menu.addAction(QIcon(":/res/icons/go-up.svg"), tr("Move to top (play next)"));
|
||||||
|
|
||||||
connect(removeAct, &QAction::triggered, this, [this, idx] { m_queue->removeUpcoming(idx); });
|
connect(removeAct, &QAction::triggered, this, [this, idx] { m_queue->removeUpcoming(idx); });
|
||||||
connect(toTopAct, &QAction::triggered, this, [this, idx] { m_queue->moveUpcomingToTop(idx); });
|
connect(toTopAct, &QAction::triggered, this, [this, idx] { m_queue->moveUpcomingToTop(idx); });
|
||||||
|
|||||||
@@ -241,12 +241,15 @@ void SearchTab::onTrackContextMenu(const QPoint &pos)
|
|||||||
|
|
||||||
QMenu menu(this);
|
QMenu menu(this);
|
||||||
|
|
||||||
auto *playNow = menu.addAction(tr("Play now"));
|
auto *playNow = menu.addAction(QIcon(":/res/icons/media-playback-start.svg"), tr("Play now"));
|
||||||
auto *playNext = menu.addAction(tr("Play next"));
|
auto *playNext = menu.addAction(QIcon(":/res/icons/media-skip-forward.svg"), tr("Play next"));
|
||||||
auto *addQueue = menu.addAction(tr("Add to queue"));
|
auto *addQueue = menu.addAction(QIcon(":/res/icons/media-playlist-append.svg"), tr("Add to queue"));
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
|
|
||||||
auto *addFav = menu.addAction(tr("Add to favorites"));
|
auto *favAction = menu.addAction(QIcon(":/res/icons/starred-symbolic.svg"), tr("Add to favorites"));
|
||||||
|
connect(favAction, &QAction::triggered, this, [this, trackId] {
|
||||||
|
m_backend->addFavTrack(trackId);
|
||||||
|
});
|
||||||
|
|
||||||
// Open album / artist
|
// Open album / artist
|
||||||
const QString albumId = trackJson["album"].toObject()["id"].toString();
|
const QString albumId = trackJson["album"].toObject()["id"].toString();
|
||||||
@@ -255,15 +258,20 @@ void SearchTab::onTrackContextMenu(const QPoint &pos)
|
|||||||
const QString artistName = trackJson["performer"].toObject()["name"].toString();
|
const QString artistName = trackJson["performer"].toObject()["name"].toString();
|
||||||
const QString albumTitle = trackJson["album"].toObject()["title"].toString();
|
const QString albumTitle = trackJson["album"].toObject()["title"].toString();
|
||||||
|
|
||||||
menu.addSeparator();
|
if (!albumId.isEmpty() || artistId > 0)
|
||||||
|
menu.addSeparator();
|
||||||
if (!albumId.isEmpty()) {
|
if (!albumId.isEmpty()) {
|
||||||
auto *openAlbum = menu.addAction(tr("Go to album: %1").arg(QString(albumTitle).replace(QLatin1Char('&'), QStringLiteral("&&"))));
|
auto *openAlbum = menu.addAction(
|
||||||
|
QIcon(":/res/icons/view-media-album-cover.svg"),
|
||||||
|
tr("Open album: %1").arg(QString(albumTitle).replace(QLatin1Char('&'), QStringLiteral("&&"))));
|
||||||
connect(openAlbum, &QAction::triggered, this, [this, albumId] {
|
connect(openAlbum, &QAction::triggered, this, [this, albumId] {
|
||||||
emit albumSelected(albumId);
|
emit albumSelected(albumId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (artistId > 0) {
|
if (artistId > 0) {
|
||||||
auto *openArtist = menu.addAction(tr("Go to artist: %1").arg(QString(artistName).replace(QLatin1Char('&'), QStringLiteral("&&"))));
|
auto *openArtist = menu.addAction(
|
||||||
|
QIcon(":/res/icons/view-media-artist.svg"),
|
||||||
|
tr("Open artist: %1").arg(QString(artistName).replace(QLatin1Char('&'), QStringLiteral("&&"))));
|
||||||
connect(openArtist, &QAction::triggered, this, [this, artistId] {
|
connect(openArtist, &QAction::triggered, this, [this, artistId] {
|
||||||
emit artistSelected(artistId);
|
emit artistSelected(artistId);
|
||||||
});
|
});
|
||||||
@@ -272,9 +280,9 @@ void SearchTab::onTrackContextMenu(const QPoint &pos)
|
|||||||
// Add to playlist submenu
|
// Add to playlist submenu
|
||||||
if (!m_userPlaylists.isEmpty()) {
|
if (!m_userPlaylists.isEmpty()) {
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
auto *plMenu = menu.addMenu(tr("Add to playlist"));
|
auto *plMenu = menu.addMenu(QIcon(":/res/icons/media-playlist-append.svg"), tr("Add to playlist"));
|
||||||
for (const auto &pl : m_userPlaylists) {
|
for (const auto &pl : m_userPlaylists) {
|
||||||
auto *act = plMenu->addAction(pl.second);
|
auto *act = plMenu->addAction(QString(pl.second).replace(QLatin1Char('&'), QStringLiteral("&&")));
|
||||||
connect(act, &QAction::triggered, this, [this, trackId, plId = pl.first] {
|
connect(act, &QAction::triggered, this, [this, trackId, plId = pl.first] {
|
||||||
emit addToPlaylistRequested(trackId, plId);
|
emit addToPlaylistRequested(trackId, plId);
|
||||||
});
|
});
|
||||||
@@ -294,9 +302,6 @@ void SearchTab::onTrackContextMenu(const QPoint &pos)
|
|||||||
connect(addQueue, &QAction::triggered, this, [this, trackJson] {
|
connect(addQueue, &QAction::triggered, this, [this, trackJson] {
|
||||||
m_queue->addToQueue(trackJson);
|
m_queue->addToQueue(trackJson);
|
||||||
});
|
});
|
||||||
connect(addFav, &QAction::triggered, this, [this, trackId] {
|
|
||||||
m_backend->addFavTrack(trackId);
|
|
||||||
});
|
|
||||||
connect(info, &QAction::triggered, this, [this, trackJson] {
|
connect(info, &QAction::triggered, this, [this, trackJson] {
|
||||||
showTrackInfo(trackJson);
|
showTrackInfo(trackJson);
|
||||||
});
|
});
|
||||||
@@ -315,15 +320,17 @@ void SearchTab::onAlbumContextMenu(const QPoint &pos)
|
|||||||
|
|
||||||
QMenu menu(this);
|
QMenu menu(this);
|
||||||
|
|
||||||
auto *openAlbum = menu.addAction(tr("Open album"));
|
auto *openAlbum = menu.addAction(QIcon(":/res/icons/view-media-album-cover.svg"), tr("Open album"));
|
||||||
auto *addFav = menu.addAction(tr("Add to favorites"));
|
auto *addFav = menu.addAction(QIcon(":/res/icons/starred-symbolic.svg"), tr("Add to favorites"));
|
||||||
|
|
||||||
const qint64 artistId = static_cast<qint64>(
|
const qint64 artistId = static_cast<qint64>(
|
||||||
albumJson["artist"].toObject()["id"].toDouble());
|
albumJson["artist"].toObject()["id"].toDouble());
|
||||||
const QString artistName = albumJson["artist"].toObject()["name"].toString();
|
const QString artistName = albumJson["artist"].toObject()["name"].toString();
|
||||||
if (artistId > 0) {
|
if (artistId > 0) {
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
auto *openArtist = menu.addAction(tr("Go to artist: %1").arg(QString(artistName).replace(QLatin1Char('&'), QStringLiteral("&&"))));
|
auto *openArtist = menu.addAction(
|
||||||
|
QIcon(":/res/icons/view-media-artist.svg"),
|
||||||
|
tr("Open artist: %1").arg(QString(artistName).replace(QLatin1Char('&'), QStringLiteral("&&"))));
|
||||||
connect(openArtist, &QAction::triggered, this, [this, artistId] {
|
connect(openArtist, &QAction::triggered, this, [this, artistId] {
|
||||||
emit artistSelected(artistId);
|
emit artistSelected(artistId);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user