From b278660b3e68a23d39c9783ac64675b44675016c Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Thu, 27 Sep 2018 01:09:09 +0200 Subject: [PATCH] Mark play progress with background color in the play list. --- clip_list.cpp | 28 +++++++++++++++++++++++++--- clip_list.h | 3 ++- mainwindow.cpp | 8 +++++--- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/clip_list.cpp b/clip_list.cpp index 75f4a9f..69a87ae 100644 --- a/clip_list.cpp +++ b/clip_list.cpp @@ -129,6 +129,23 @@ QVariant PlayList::data(const QModelIndex &parent, int role) const { return Qt::AlignLeft + Qt::AlignVCenter; } } + if (role == Qt::BackgroundRole) { + if (Column(column) == Column::PLAYING) { + if (row == currently_playing_index) { + // This only really works well for the first column, for whatever odd Qt reason. + QLinearGradient grad(QPointF(0, 0), QPointF(1, 0)); + grad.setCoordinateMode(grad.QGradient::ObjectBoundingMode); + grad.setColorAt(0.0f, QColor::fromRgbF(0.0f, 0.0f, 1.0f, 0.2f)); + grad.setColorAt(play_progress, QColor::fromRgbF(0.0f, 0.0f, 1.0f, 0.2f)); + grad.setColorAt(play_progress + 0.01f, QColor::fromRgbF(0.0f, 0.0f, 1.0f, 0.0f)); + return QBrush(grad); + } else { + return QVariant(); + } + } else { + return QVariant(); + } + } if (role != Qt::DisplayRole && role != Qt::EditRole) return QVariant(); @@ -353,16 +370,21 @@ void PlayList::emit_data_changed(size_t row) emit dataChanged(index(row, 0), index(row, int(Column::NUM_COLUMNS))); } -void PlayList::set_currently_playing(int index) +void PlayList::set_currently_playing(int index, double progress) { int old_index = currently_playing_index; + int column = int(Column::PLAYING); if (index != old_index) { currently_playing_index = index; + play_progress = progress; if (old_index != -1) { - emit_data_changed(old_index); + emit dataChanged(this->index(old_index, column), this->index(old_index, column)); } if (index != -1) { - emit_data_changed(index); + emit dataChanged(this->index(index, column), this->index(index, column)); } + } else if (index != -1 && fabs(progress - play_progress) > 1e-3) { + play_progress = progress; + emit dataChanged(this->index(index, column), this->index(index, column)); } } diff --git a/clip_list.h b/clip_list.h index db3a479..2d37eab 100644 --- a/clip_list.h +++ b/clip_list.h @@ -120,7 +120,7 @@ public: ClipProxy mutable_back() { return mutable_clip(size() - 1); } const Clip *back() const { return clip(size() - 1); } - void set_currently_playing(int index); // -1 = none. + void set_currently_playing(int index, double progress); // -1 = none. int get_currently_playing() const { return currently_playing_index; } void emit_data_changed(size_t row) override; @@ -128,6 +128,7 @@ public: private: std::vector clips; int currently_playing_index = -1; + double play_progress = 0.0; }; #endif // !defined (_CLIP_LIST_H) diff --git a/mainwindow.cpp b/mainwindow.cpp index 656ff1e..1b7a71f 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -261,7 +261,7 @@ void MainWindow::play_clicked() const Clip &clip = *playlist_clips->clip(row); live_player->play_clip(clip, clip.stream_idx); - playlist_clips->set_currently_playing(row); + playlist_clips->set_currently_playing(row, 0.0f); playlist_selection_changed(); } @@ -272,15 +272,17 @@ void MainWindow::live_player_clip_done() ++row; const Clip &clip = *playlist_clips->clip(row); live_player->play_clip(clip, clip.stream_idx); - playlist_clips->set_currently_playing(row); + playlist_clips->set_currently_playing(row, 0.0f); } else { - playlist_clips->set_currently_playing(-1); + playlist_clips->set_currently_playing(-1, 0.0f); ui->live_label->setText("Current output (paused)"); } } void MainWindow::live_player_clip_progress(double played_this_clip, double total_length) { + playlist_clips->set_currently_playing(playlist_clips->get_currently_playing(), played_this_clip / total_length); + double remaining = total_length - played_this_clip; for (int row = playlist_clips->get_currently_playing() + 1; row < int(playlist_clips->size()); ++row) { const Clip clip = *playlist_clips->clip(row); -- 2.39.2