Implemented dynamic playlists
[someplayer] / src / playerform.cpp
index a1af42f..d0bb5dc 100644 (file)
@@ -4,6 +4,7 @@
 #include <QDebug>
 #include <QTime>
 #include <QSlider>
+#include "trackrenderer.h"
 
 using namespace SomePlayer::DataObjects;
 using namespace SomePlayer::Playback;
@@ -15,8 +16,8 @@ inline void __fill_list(QStandardItemModel *_model, Playlist playlist) {
        _model->setRowCount(count);
        for (int i = 0; i < count; i++) {
                TrackMetadata meta = tracks.at(i).metadata();
-               _model->setItem(i, 0, new QStandardItem(meta.title()));
-               _model->setItem(i, 1, new QStandardItem(meta.artist()));
+               QString t = meta.title()+"#_#"+meta.artist()+"#_#"+meta.album();
+               _model->setItem(i, 0, new QStandardItem(t));
        }
 }
 
@@ -30,19 +31,34 @@ PlayerForm::PlayerForm(Library* lib, QWidget *parent) :
        connect(ui->libraryButton, SIGNAL(clicked()), this, SLOT(_library()));
        connect(ui->viewButton, SIGNAL(clicked()), this, SLOT(_toggle_view()));
        connect(ui->playlistView, SIGNAL(clicked(QModelIndex)), this, SLOT(_process_click(QModelIndex)));
-       connect(ui->playButton, SIGNAL(clicked()), _player, SLOT(play()));
-       connect(ui->pauseButton, SIGNAL(clicked()), _player, SLOT(pause()));
+       connect(ui->playpauseButton, SIGNAL(clicked()), _player, SLOT(toggle()));
        connect(ui->stopButton, SIGNAL(clicked()), _player, SLOT(stop()));
        connect(ui->nextButton, SIGNAL(clicked()), _player, SLOT(next()));
        connect(ui->prevButton, SIGNAL(clicked()), _player, SLOT(prev()));
        connect(_player, SIGNAL(trackChanged(Track)), this, SLOT(_track_changed(Track)));
        connect(_player, SIGNAL(tick(int,int)), this, SLOT(_tick(int,int)));
+       connect(ui->randomButton, SIGNAL(clicked()), _player, SLOT(toggleRandom()));
+       connect(ui->repeatButton, SIGNAL(clicked()), _player, SLOT(toggleRepeat()));
+       ui->randomButton->setChecked(_player->random());
+       ui->repeatButton->setChecked(_player->repeat());
        _seek_slider = new QSlider(Qt::Horizontal);
        ui->progressLayout->insertWidget(1, _seek_slider);
        _seek_slider->setTracking(false);
-       connect(_seek_slider, SIGNAL(sliderMoved(int)), _player, SLOT(seek(int)));
+       connect(_seek_slider, SIGNAL(sliderReleased()), this, SLOT(_slider_released()));
+       connect(ui->playlistView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(_custom_context_venu_requested(QPoint)));
        _model = new QStandardItemModel(0, 2, this);
        ui->playlistView->setModel(_model);
+       _context_menu = new QMenu(ui->playlistView);
+       QAction *delete_action = _context_menu->addAction("Delete");
+       connect(delete_action, SIGNAL(triggered()), this, SLOT(_delete_track()));
+       QAction *enqueue_action = _context_menu->addAction("Enqueue");
+       connect(enqueue_action, SIGNAL(triggered()), this, SLOT(_enqueue_track()));
+       QAction *add_to_favorites = _context_menu->addAction("Add to favorites");
+       connect(add_to_favorites, SIGNAL(triggered()), this, SLOT(_add_to_favorites()));
+
+       _track_renderer = new TrackRenderer(this);
+       ui->playlistView->setItemDelegateForColumn(0, _track_renderer);
+       connect(_player, SIGNAL(trackDone(Track)), _lib, SLOT(updateTrackCount(Track)));
 }
 
 PlayerForm::~PlayerForm()
@@ -71,12 +87,19 @@ void PlayerForm::_process_click(QModelIndex index) {
        _player->stop();
        _player->setTrackId(id);
        _player->play();
+       _track_renderer->setActiveRow(id);
+       ui->playlistView->hide();
+       ui->playlistView->show();
 }
 
 void PlayerForm::_track_changed(Track track) {
        int id = _current_playlist.tracks().indexOf(track);
        QModelIndex index = _model->index(id, 0);
        ui->playlistView->setCurrentIndex(index);
+       ui->playlistView->scrollTo(index);
+       _track_renderer->setActiveRow(id);
+       ui->playlistView->hide();
+       ui->playlistView->show();
        _display_track(track);
 }
 
@@ -90,16 +113,41 @@ void PlayerForm::_display_track(Track track) {
                                                                  arg(track.metadata().album()));
        _seek_slider->setMinimum(0);
        _seek_slider->setMaximum(track.metadata().length());
+       _tick(0, track.metadata().length());
 }
 
 void PlayerForm::_tick(int done, int all) {
-       QTime time1(0, all/60, all%60);
-       QTime time2(0, done/60, done%60);
-       ui->allTimeLabel->setText(time1.toString("mm:ss"));
-       ui->doneTimeLabel->setText(time2.toString("mm:ss"));
+       QTime time(0, all/60, all%60);
+       ui->allTimeLabel->setText(time.toString("mm:ss"));
+       time.setHMS(0, done/60, done%60);
+       ui->doneTimeLabel->setText(time.toString("mm:ss"));
        _seek_slider->setValue(done);
 }
 
 void PlayerForm::_slider_released() {
        _player->seek(_seek_slider->value());
 }
+
+void PlayerForm::_custom_context_venu_requested(const QPoint &pos) {
+       _context_menu->exec(pos);
+}
+
+void PlayerForm::_delete_track() {
+       QList<QModelIndex> idx = ui->playlistView->selectionModel()->selectedIndexes();
+       int id = idx.first().row();
+       _current_playlist.removeTrackAt(id);
+       _lib->saveCurrentPlaylist(_current_playlist);
+       reload();
+}
+
+void PlayerForm::_enqueue_track() {
+       QList<QModelIndex> idx = ui->playlistView->selectionModel()->selectedIndexes();
+       int id = idx.first().row();
+       _player->enqueue(id);
+}
+
+void PlayerForm::_add_to_favorites() {
+       QList<QModelIndex> idx = ui->playlistView->selectionModel()->selectedIndexes();
+       int id = idx.first().row();
+       _lib->addToFavorites(_current_playlist.tracks().at(id));
+}