From 3a2c9e40ad5550a729a754de5df83a0650724415 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 13 Jun 2018 19:44:45 +0200 Subject: [PATCH] Allow playing from the playlist. --- clip_list.cpp | 71 +++++++++++++++++++++++++++++++++++++++----------- clip_list.h | 4 +++ mainwindow.cpp | 11 ++++++-- mainwindow.h | 2 +- 4 files changed, 70 insertions(+), 18 deletions(-) diff --git a/clip_list.cpp b/clip_list.cpp index 0d9fc6c..5602d90 100644 --- a/clip_list.cpp +++ b/clip_list.cpp @@ -32,23 +32,48 @@ QVariant ClipList::data(const QModelIndex &parent, int role) const { if (size_t(row) >= clips.size()) return QVariant(); - switch (column) { - case 0: - return qlonglong(clips[row].pts_in); - case 1: - if (clips[row].pts_out >= 0) { - return qlonglong(clips[row].pts_out); - } else { - return QVariant(); + if (display_type == ListDisplay::CLIP_LIST) { + switch (ClipListColumn(column)) { + case ClipListColumn::IN: + return qlonglong(clips[row].pts_in); + case ClipListColumn::OUT: + if (clips[row].pts_out >= 0) { + return qlonglong(clips[row].pts_out); + } else { + return QVariant(); + } + case ClipListColumn::DURATION: + if (clips[row].pts_out >= 0) { + return qlonglong(clips[row].pts_out - clips[row].pts_in); + } else { + return QVariant(); + } + default: + return ""; } - case 2: - if (clips[row].pts_out >= 0) { - return qlonglong(clips[row].pts_out - clips[row].pts_in); - } else { - return QVariant(); + } else { + switch (PlayListColumn(column)) { + case PlayListColumn::PLAYING: + return (row == currently_playing_index) ? "→" : ""; + case PlayListColumn::IN: + return qlonglong(clips[row].pts_in); + case PlayListColumn::OUT: + if (clips[row].pts_out >= 0) { + return qlonglong(clips[row].pts_out); + } else { + return QVariant(); + } + case PlayListColumn::DURATION: + if (clips[row].pts_out >= 0) { + return qlonglong(clips[row].pts_out - clips[row].pts_in); + } else { + return QVariant(); + } + case PlayListColumn::CAMERA: + return qlonglong(clips[row].stream_idx + 1); + default: + return ""; } - default: - return QVariant(); } } @@ -79,6 +104,8 @@ QVariant ClipList::headerData(int section, Qt::Orientation orientation, int role } } else { switch (PlayListColumn(section)) { + case PlayListColumn::PLAYING: + return ""; case PlayListColumn::IN: return "In"; case PlayListColumn::OUT: @@ -110,3 +137,17 @@ void ClipList::emit_data_changed(size_t row) emit dataChanged(index(row, 0), index(row, int(PlayListColumn::NUM_COLUMNS))); } } + +void ClipList::set_currently_playing(int index) +{ + int old_index = currently_playing_index; + if (index != old_index) { + currently_playing_index = index; + if (old_index != -1) { + emit_data_changed(old_index); + } + if (index != -1) { + emit_data_changed(index); + } + } +} diff --git a/clip_list.h b/clip_list.h index ddb4a4a..851f86a 100644 --- a/clip_list.h +++ b/clip_list.h @@ -36,6 +36,7 @@ public: NUM_COLUMNS }; enum class PlayListColumn { + PLAYING, IN, OUT, DURATION, @@ -78,11 +79,14 @@ public: ClipProxy back() { return clip(size() - 1); } const Clip *back() const { return clip(size() - 1); } + void set_currently_playing(int index); // -1 = none. Only makes sense for the playlist. + void emit_data_changed(size_t row); private: std::vector clips; ListDisplay display_type; + int currently_playing_index = -1; }; #endif // !defined (_CLIP_LIST_H) diff --git a/mainwindow.cpp b/mainwindow.cpp index aba38db..74b67e4 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -62,6 +62,7 @@ MainWindow::MainWindow() connect(ui->play_btn, &QPushButton::clicked, this, &MainWindow::play_clicked); preview_player = new Player(ui->preview_display); + live_player = new Player(ui->live_display); } void MainWindow::queue_clicked() @@ -102,8 +103,14 @@ void MainWindow::preview_clicked() void MainWindow::play_clicked() { QItemSelectionModel *selected = ui->playlist->selectionModel(); + int row; if (!selected->hasSelection()) { - ui->playlist->selectRow(0); - return; + row = 0; + } else { + row = selected->selectedRows(0)[0].row(); } + + const Clip &clip = *cliplist_clips->clip(row); + live_player->play_clip(clip, clip.stream_idx); + playlist_clips->set_currently_playing(row); } diff --git a/mainwindow.h b/mainwindow.h index 583f0e2..e9b8dc1 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -22,7 +22,7 @@ public: Ui::MainWindow *ui; private: - Player *preview_player; + Player *preview_player, *live_player; void queue_clicked(); void preview_clicked(); -- 2.39.2