diff --git a/src/playlist/queue.cpp b/src/playlist/queue.cpp index 76d620a73..6e59c35b1 100644 --- a/src/playlist/queue.cpp +++ b/src/playlist/queue.cpp @@ -151,6 +151,18 @@ void Queue::ToggleTracks(const QModelIndexList& source_indexes) { } } +void Queue::InsertFirst(const QModelIndexList& source_indexes) { + const int rows = source_indexes.count(); + // Enqueue the tracks at the beginning + beginInsertRows(QModelIndex(), 0, rows - 1); + int offset = 0; + for (const QModelIndex& source_index : source_indexes) { + source_indexes_.insert(offset, QPersistentModelIndex(source_index)); + offset++; + } + endInsertRows(); +} + int Queue::PositionOf(const QModelIndex& source_index) const { return mapFromSource(source_index).row(); } diff --git a/src/playlist/queue.h b/src/playlist/queue.h index de1edefd2..77751f0f5 100644 --- a/src/playlist/queue.h +++ b/src/playlist/queue.h @@ -39,6 +39,7 @@ class Queue : public QAbstractProxyModel { // Modify the queue int TakeNext(); void ToggleTracks(const QModelIndexList& source_indexes); + void InsertFirst(const QModelIndexList& source_indexes); void Clear(); void Move(const QList& proxy_rows, int pos); void MoveUp(int row); diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index b383b7126..4c24d00b2 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -677,6 +677,9 @@ MainWindow::MainWindow(Application* app, SystemTrayIcon* tray_icon, OSD* osd, playlist_queue_ = playlist_menu_->addAction("", this, SLOT(PlaylistQueue())); playlist_queue_->setShortcut(QKeySequence("Ctrl+D")); ui_->playlist->addAction(playlist_queue_); + playlist_queue_play_next_ = playlist_menu_->addAction("", this, SLOT(PlaylistQueuePlayNext())); + playlist_queue_play_next_->setShortcut(QKeySequence("Ctrl+Shift+D")); + ui_->playlist->addAction(playlist_queue_play_next_); playlist_skip_ = playlist_menu_->addAction("", this, SLOT(PlaylistSkip())); ui_->playlist->addAction(playlist_skip_); playlist_menu_->addSeparator(); @@ -1760,6 +1763,11 @@ void MainWindow::PlaylistRightClick(const QPoint& global_pos, else playlist_queue_->setText(tr("Toggle queue status")); + if (in_queue == 0 && not_in_queue == 1) + playlist_queue_play_next_->setText(tr("Play next")); + else if (in_queue == 0 && not_in_queue > 1) + playlist_queue_play_next_->setText(tr("Play selected tracks next")); + if (in_skipped == 1 && not_in_skipped == 0) playlist_skip_->setText(tr("Unskip track")); else if (in_skipped > 1 && not_in_skipped == 0) @@ -2500,6 +2508,17 @@ void MainWindow::PlaylistQueue() { app_->playlist_manager()->current()->queue()->ToggleTracks(indexes); } +void MainWindow::PlaylistQueuePlayNext() { + QModelIndexList indexes; + for (const QModelIndex& proxy_index : + ui_->playlist->view()->selectionModel()->selectedRows()) { + indexes << app_->playlist_manager()->current()->proxy()->mapToSource( + proxy_index); + } + + app_->playlist_manager()->current()->queue()->InsertFirst(indexes); +} + void MainWindow::PlaylistSkip() { QModelIndexList indexes; for (const QModelIndex& proxy_index : diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index 03709ed8a..86f07aad9 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -162,6 +162,7 @@ signals: void PlaylistPlay(); void PlaylistStopAfter(); void PlaylistQueue(); + void PlaylistQueuePlayNext(); void PlaylistSkip(); void PlaylistRemoveCurrent(); void PlaylistEditFinished(const QModelIndex& index); @@ -361,6 +362,7 @@ signals: QAction* playlist_delete_; QAction* playlist_open_in_browser_; QAction* playlist_queue_; + QAction* playlist_queue_play_next_; QAction* playlist_skip_; QAction* playlist_add_to_another_; QList playlistitem_actions_;