]> git.sesse.net Git - nageru/blobdiff - futatabi/mainwindow.cpp
Fix a Clang warning.
[nageru] / futatabi / mainwindow.cpp
index 852391051a287472a7eb9fd5a51d45e1dff55bbd..0c12b5c17637c6ce648b7a24841cd09f92e29f9a 100644 (file)
@@ -32,17 +32,6 @@ static PlayList *playlist_clips;
 
 extern int64_t current_pts;
 
-template <class Model>
-void replace_model(QTableView *view, Model **model, Model *new_model, MainWindow *main_window)
-{
-       QItemSelectionModel *old_selection_model = view->selectionModel();
-       view->setModel(new_model);
-       delete *model;
-       delete old_selection_model;
-       *model = new_model;
-       main_window->connect(new_model, &Model::any_content_changed, main_window, &MainWindow::content_changed);
-}
-
 MainWindow::MainWindow()
        : ui(new Ui::MainWindow),
          db(global_flags.working_directory + "/futatabi.db")
@@ -146,6 +135,9 @@ MainWindow::MainWindow()
        connect(play, &QShortcut::activated, ui->play_btn, &QPushButton::click);
        connect(ui->play_btn, &QPushButton::clicked, this, &MainWindow::play_clicked);
 
+       connect(ui->stop_btn, &QPushButton::clicked, this, &MainWindow::stop_clicked);
+       ui->stop_btn->setEnabled(false);
+
        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);
@@ -441,6 +433,18 @@ void MainWindow::play_clicked()
        playlist_clips->set_progress({{ row, 0.0f }});
        playlist_clips->set_currently_playing(row, 0.0f);
        playlist_selection_changed();
+
+       ui->stop_btn->setEnabled(true);
+}
+
+void MainWindow::stop_clicked()
+{
+       Clip fake_clip;
+       fake_clip.pts_in = 0;
+       fake_clip.pts_out = 0;
+       size_t last_row = playlist_clips->size() - 1;
+       playlist_clips->set_currently_playing(last_row, 0.0f);
+       live_player->play_clip(fake_clip, last_row, 0);
 }
 
 void MainWindow::live_player_clip_done()
@@ -454,6 +458,7 @@ void MainWindow::live_player_clip_done()
                playlist_clips->set_progress({{ row + 1, 0.0f }});
                playlist_clips->set_currently_playing(row + 1, 0.0f);
        }
+       ui->stop_btn->setEnabled(false);
 }
 
 pair<Clip, size_t> MainWindow::live_player_get_next_clip()
@@ -465,7 +470,7 @@ pair<Clip, size_t> MainWindow::live_player_get_next_clip()
        // for Player to shut down, we could have a deadlock here.
        promise<pair<Clip, size_t>> clip_promise;
        future<pair<Clip, size_t>> clip = clip_promise.get_future();
-       post_to_main_thread([this, &clip_promise] {
+       post_to_main_thread([&clip_promise] {
                int row = playlist_clips->get_currently_playing();
                if (row != -1 && row < int(playlist_clips->size()) - 1) {
                        clip_promise.set_value(make_pair(*playlist_clips->clip(row + 1), row + 1));
@@ -927,8 +932,8 @@ void MainWindow::undo_triggered()
        StateProto state = undo_stack.back();
        ui->undo_action->setEnabled(undo_stack.size() > 1);
 
-       replace_model(ui->clip_list, &cliplist_clips, new ClipList(state.clip_list()), this);
-       replace_model(ui->playlist, &playlist_clips, new PlayList(state.play_list()), this);
+       replace_model(ui->clip_list, &cliplist_clips, new ClipList(state.clip_list()));
+       replace_model(ui->playlist, &playlist_clips, new PlayList(state.play_list()));
 
        db.store_state(state);
 }
@@ -946,8 +951,8 @@ void MainWindow::redo_triggered()
        ui->redo_action->setEnabled(!redo_stack.empty());
 
        const StateProto &state = undo_stack.back();
-       replace_model(ui->clip_list, &cliplist_clips, new ClipList(state.clip_list()), this);
-       replace_model(ui->playlist, &playlist_clips, new PlayList(state.play_list()), this);
+       replace_model(ui->clip_list, &cliplist_clips, new ClipList(state.clip_list()));
+       replace_model(ui->playlist, &playlist_clips, new PlayList(state.play_list()));
 
        db.store_state(state);
 }
@@ -1007,3 +1012,14 @@ pair<string, string> MainWindow::get_queue_status() const {
        lock_guard<mutex> lock(queue_status_mu);
        return {queue_status, "text/plain"};
 }
+
+template <class Model>
+void MainWindow::replace_model(QTableView *view, Model **model, Model *new_model)
+{
+       QItemSelectionModel *old_selection_model = view->selectionModel();
+       view->setModel(new_model);
+       delete *model;
+       delete old_selection_model;
+       *model = new_model;
+       connect(new_model, &Model::any_content_changed, this, &MainWindow::content_changed);
+}