#include "clip_list.h"
#include "player.h"
#include "post_to_main_thread.h"
+#include "timebase.h"
#include "ui_mainwindow.h"
#include <string>
QShortcut *preview_1 = new QShortcut(QKeySequence(Qt::Key_1), this);
connect(preview_1, &QShortcut::activated, ui->preview_1_btn, &QPushButton::click);
+ connect(ui->input1_display, &JPEGFrameView::clicked, ui->preview_1_btn, &QPushButton::click);
connect(ui->preview_1_btn, &QPushButton::clicked, [this]{ preview_angle_clicked(0); });
+ ui->input1_display->set_overlay("1");
QShortcut *preview_2 = new QShortcut(QKeySequence(Qt::Key_2), this);
connect(preview_2, &QShortcut::activated, ui->preview_2_btn, &QPushButton::click);
+ connect(ui->input2_display, &JPEGFrameView::clicked, ui->preview_2_btn, &QPushButton::click);
connect(ui->preview_2_btn, &QPushButton::clicked, [this]{ preview_angle_clicked(1); });
+ ui->input2_display->set_overlay("2");
QShortcut *preview_3 = new QShortcut(QKeySequence(Qt::Key_3), this);
connect(preview_3, &QShortcut::activated, ui->preview_3_btn, &QPushButton::click);
+ connect(ui->input3_display, &JPEGFrameView::clicked, ui->preview_3_btn, &QPushButton::click);
connect(ui->preview_3_btn, &QPushButton::clicked, [this]{ preview_angle_clicked(2); });
+ ui->input3_display->set_overlay("3");
QShortcut *preview_4 = new QShortcut(QKeySequence(Qt::Key_4), this);
connect(preview_4, &QShortcut::activated, ui->preview_4_btn, &QPushButton::click);
+ connect(ui->input4_display, &JPEGFrameView::clicked, ui->preview_4_btn, &QPushButton::click);
connect(ui->preview_4_btn, &QPushButton::clicked, [this]{ preview_angle_clicked(3); });
+ ui->input4_display->set_overlay("4");
connect(ui->playlist_duplicate_btn, &QPushButton::clicked, this, &MainWindow::playlist_duplicate);
- // TODO: support the delete key iff the widget has focus?
connect(ui->playlist_remove_btn, &QPushButton::clicked, this, &MainWindow::playlist_remove);
+ QShortcut *delete_key = new QShortcut(QKeySequence(Qt::Key_Delete), ui->playlist);
+ connect(delete_key, &QShortcut::activated, [this] {
+ if (ui->playlist->hasFocus()) {
+ playlist_remove();
+ }
+ });
// TODO: support drag-and-drop.
connect(ui->playlist_move_up_btn, &QPushButton::clicked, [this]{ playlist_move(-1); });
this, &MainWindow::playlist_selection_changed);
playlist_selection_changed(); // First time set-up.
- preview_player = new Player(ui->preview_display);
- live_player = new Player(ui->live_display);
+ preview_player = new Player(ui->preview_display, /*also_output_to_stream=*/false);
+ live_player = new Player(ui->live_display, /*also_output_to_stream=*/true);
live_player->set_done_callback([this]{
post_to_main_thread([this]{
live_player_clip_done();
});
});
+ live_player->set_progress_callback([this](double played_this_clip, double total_length) {
+ post_to_main_thread([this, played_this_clip, total_length] {
+ live_player_clip_progress(played_this_clip, total_length);
+ });
+ });
}
void MainWindow::cue_in_clicked()
playlist_clips->set_currently_playing(row);
} else {
playlist_clips->set_currently_playing(-1);
+ ui->live_label->setText("Current output (paused)");
+ }
+}
+
+void MainWindow::live_player_clip_progress(double played_this_clip, double 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);
+ remaining += double(clip.pts_out - clip.pts_in) / TIMEBASE / 0.5; // FIXME: stop hardcoding speed.
}
+ int remaining_ms = lrint(remaining * 1e3);
+
+ int ms = remaining_ms % 1000;
+ remaining_ms /= 1000;
+ int s = remaining_ms % 60;
+ remaining_ms /= 60;
+ int m = remaining_ms;
+
+ char buf[256];
+ snprintf(buf, sizeof(buf), "Current output (%d:%02d.%03d left)", m, s, ms);
+ ui->live_label->setText(buf);
}
void MainWindow::resizeEvent(QResizeEvent *event)