X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=futatabi%2Fmainwindow.cpp;h=fa93a7b458fe4982f3efd6f0f258ee7d78ebf036;hb=13c7a8f2386ca7fbe9f6e04d24bd584993dc76c6;hp=a5592930e2a3217df0b980db3d65165a362c4781;hpb=3974e42a86665521c477ab0c1dfc0af1a28bede1;p=nageru diff --git a/futatabi/mainwindow.cpp b/futatabi/mainwindow.cpp index a559293..fa93a7b 100644 --- a/futatabi/mainwindow.cpp +++ b/futatabi/mainwindow.cpp @@ -205,6 +205,10 @@ MainWindow::MainWindow() connect(play, &QShortcut::activated, ui->play_btn, &QPushButton::click); connect(ui->play_btn, &QPushButton::clicked, this, &MainWindow::play_clicked); + QShortcut *next = new QShortcut(QKeySequence(Qt::Key_N), this); + connect(next, &QShortcut::activated, ui->next_btn, &QPushButton::click); + connect(ui->next_btn, &QPushButton::clicked, this, &MainWindow::next_clicked); + connect(ui->stop_btn, &QPushButton::clicked, this, &MainWindow::stop_clicked); ui->stop_btn->setEnabled(false); @@ -297,9 +301,17 @@ void MainWindow::change_num_cameras() { assert(num_cameras >= displays.size()); // We only add, never remove. + // Make new entries to hide the displays. + for (unsigned i = displays.size(); i < num_cameras; ++i) { + char title[256]; + snprintf(title, sizeof(title), "Camera %u", i + 1); + QAction *hide_action = ui->hide_camera_menu->addAction(title); + hide_action->setCheckable(true); + hide_action->setChecked(false); + connect(hide_action, &QAction::toggled, bind(&MainWindow::hide_camera_toggled, this, i, _1)); + } + // Make new display rows. - unsigned display_rows = (num_cameras + 1) / 2; - ui->video_displays->setStretch(1, display_rows); for (unsigned i = displays.size(); i < num_cameras; ++i) { QFrame *frame = new QFrame(this); frame->setAutoFillBackground(true); @@ -312,7 +324,6 @@ void MainWindow::change_num_cameras() display->setAutoFillBackground(true); layout->addWidget(display); - ui->input_displays->addWidget(frame, i / 2, i % 2); display->set_overlay(to_string(i + 1)); QPushButton *preview_btn = new QPushButton(this); @@ -320,7 +331,7 @@ void MainWindow::change_num_cameras() preview_btn->setText(QString::fromStdString(to_string(i + 1))); ui->preview_layout->addWidget(preview_btn); - displays.emplace_back(FrameAndDisplay{ frame, display, preview_btn }); + displays.emplace_back(FrameAndDisplay{ frame, display, preview_btn, /*hidden=*/false }); connect(display, &JPEGFrameView::clicked, preview_btn, &QPushButton::click); QShortcut *shortcut = new QShortcut(QKeySequence(Qt::Key_1 + i), this); @@ -328,6 +339,7 @@ void MainWindow::change_num_cameras() connect(preview_btn, &QPushButton::clicked, [this, i] { preview_angle_clicked(i); }); } + relayout_displays(); cliplist_clips->change_num_cameras(num_cameras); playlist_clips->change_num_cameras(num_cameras); @@ -335,6 +347,28 @@ void MainWindow::change_num_cameras() QMetaObject::invokeMethod(this, "relayout", Qt::QueuedConnection); } +void MainWindow::relayout_displays() +{ + while (ui->input_displays->count() > 0) { + QLayoutItem *item = ui->input_displays->takeAt(0); + ui->input_displays->removeWidget(item->widget()); + } + + unsigned cell_idx = 0; + for (unsigned i = 0; i < displays.size(); ++i) { + if (displays[i].hidden) { + displays[i].frame->setVisible(false); + } else { + displays[i].frame->setVisible(true); + ui->input_displays->addWidget(displays[i].frame, cell_idx / 2, cell_idx % 2); + ++cell_idx; + } + } + ui->video_displays->setStretch(1, (cell_idx + 1) / 2); + + QMetaObject::invokeMethod(this, "relayout", Qt::QueuedConnection); +} + MainWindow::~MainWindow() { // We don't have a context to release Player's OpenGL resources in here, @@ -663,6 +697,11 @@ void MainWindow::play_clicked() playlist_selection_changed(); } +void MainWindow::next_clicked() +{ + live_player->skip_to_next(); +} + void MainWindow::stop_clicked() { Clip fake_clip; @@ -733,6 +772,7 @@ bool MainWindow::eventFilter(QObject *watched, QEvent *event) if (event->type() == QEvent::FocusIn || event->type() == QEvent::FocusOut) { enable_or_disable_preview_button(); + playlist_selection_changed(); hidden_jog_column = -1; } @@ -932,7 +972,7 @@ void MainWindow::playlist_selection_changed() enable_or_disable_preview_button(); QItemSelectionModel *selected = ui->playlist->selectionModel(); - bool any_selected = selected->hasSelection(); + bool any_selected = ui->playlist->hasFocus() && selected->hasSelection(); ui->playlist_duplicate_btn->setEnabled(any_selected); ui->playlist_remove_btn->setEnabled(any_selected); ui->playlist_move_up_btn->setEnabled( @@ -941,6 +981,19 @@ void MainWindow::playlist_selection_changed() any_selected && selected->selectedRows().back().row() < int(playlist_clips->size()) - 1); ui->play_btn->setEnabled(any_selected); + ui->next_btn->setEnabled(ui->stop_btn->isEnabled()); // TODO: Perhaps not if we're on the last clip? + midi_mapper.set_next_ready(ui->next_btn->isEnabled() ? MIDIMapper::On : MIDIMapper::Off); + + // NOTE: The hidden button is still reachable by keyboard or MIDI. + if (any_selected) { + ui->play_btn->setVisible(true); + } else if (ui->stop_btn->isEnabled()) { // Playing. + ui->play_btn->setVisible(false); + } else { + ui->play_btn->setVisible(true); + } + ui->next_btn->setVisible(!ui->play_btn->isVisible()); + if (ui->stop_btn->isEnabled()) { // Playing. midi_mapper.set_play_enabled(MIDIMapper::On); } else if (any_selected) { @@ -1174,6 +1227,12 @@ void MainWindow::out_padding_toggled(double seconds, bool checked) save_settings(); } +void MainWindow::hide_camera_toggled(unsigned camera_idx, bool checked) +{ + displays[camera_idx].hidden = checked; + relayout_displays(); +} + void MainWindow::highlight_camera_input(int stream_idx) { for (unsigned i = 0; i < num_cameras; ++i) { @@ -1288,6 +1347,13 @@ void MainWindow::play() }); } +void MainWindow::next() +{ + post_to_main_thread([this] { + next_clicked(); + }); +} + void MainWindow::toggle_lock() { post_to_main_thread([this] {