diff --git a/panels/timeline.cpp b/panels/timeline.cpp index df5a855c7..0d316e33d 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -55,7 +55,6 @@ Timeline::Timeline(QWidget *parent) : trim_in_point(false), splitting(false), importing(false), - zoomChanged(false), ui(new Ui::Timeline), last_frame(0), creating(false), @@ -315,15 +314,7 @@ void Timeline::repaint_timeline(bool changed) { panel_sequence_viewer->viewer_widget->update(); ui->audio_monitor->update(); last_frame = sequence->playhead; - } - - if (zoomChanged) { - zoomChanged = false; - int target_scroll = getScreenPointFromFrame(zoom, sequence->playhead)-(ui->editAreas->width()>>1); - - // TODO find a way to gradually move towards target_scroll instead of just setting it? - ui->horizontalScrollBar->setValue(target_scroll); - } + } panel_sequence_viewer->update_playhead_timecode(sequence->playhead); @@ -488,14 +479,13 @@ int lerp(int a, int b, double t) { } void Timeline::set_zoom(bool in) { - if (in) { - zoom *= 2; - } else { - zoom /= 2; - } + zoom *= (in) ? 2 : 0.5; ui->headers->update_zoom(zoom); - zoomChanged = true; - repaint_timeline(false); + repaint_timeline(false); + + // TODO find a way to gradually move towards target_scroll instead of just setting it? + int target_scroll = getScreenPointFromFrame(zoom, sequence->playhead)-(ui->editAreas->width()>>1); + ui->horizontalScrollBar->setValue(target_scroll); } void Timeline::decheck_tool_buttons(QObject* sender) { diff --git a/panels/timeline.h b/panels/timeline.h index 08637df38..e1c844568 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -173,10 +173,7 @@ public: QVector split_cache; // importing - bool importing; - - // zoom variables - bool zoomChanged; + bool importing; // creating variables bool creating; diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 36245cc54..6af110d55 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -11,6 +11,8 @@ #define FRAMES_IN_ONE_MINUTE 1798 // 1800 - 2 #define FRAMES_IN_TEN_MINUTES 17978 // (FRAMES_IN_ONE_MINUTE * 10) - 2 +QString panel_name = "Viewer: "; + extern "C" { #include } @@ -19,13 +21,14 @@ extern "C" { Viewer::Viewer(QWidget *parent) : QDockWidget(parent), - ui(new Ui::Viewer) + ui(new Ui::Viewer), + seq(NULL) { ui->setupUi(this); ui->headers->show_text(false); ui->glViewerPane->child = ui->openGLWidget; viewer_widget = ui->openGLWidget; - update_media(MEDIA_TYPE_SEQUENCE, NULL); + set_media(MEDIA_TYPE_SEQUENCE, NULL); ui->currentTimecode->setEnabled(false); ui->currentTimecode->set_default_value(qSNaN()); @@ -38,7 +41,11 @@ Viewer::Viewer(QWidget *parent) : } Viewer::~Viewer() { - delete ui; + delete ui; +} + +void Viewer::set_main_sequence() { + set_sequence(true, sequence); } QString frame_to_timecode(long f, int view, double frame_rate) { @@ -113,80 +120,85 @@ void Viewer::update_playhead_timecode(long p) { } void Viewer::update_end_timecode() { - ui->endTimecode->setText((sequence == NULL) ? frame_to_timecode(0, config.timecode_view, 30) : frame_to_timecode(sequence->getEndFrame(), config.timecode_view, sequence->frame_rate)); + ui->endTimecode->setText((seq == NULL) ? frame_to_timecode(0, config.timecode_view, 30) : frame_to_timecode(seq->getEndFrame(), config.timecode_view, seq->frame_rate)); } -void Viewer::update_media(int type, void* media) { +void Viewer::set_media(int type, void* media) { switch (type) { case MEDIA_TYPE_FOOTAGE: { + } break; case MEDIA_TYPE_SEQUENCE: - { - Sequence* s = static_cast(media); - - bool null_sequence = (s == NULL); - - ui->currentTimecode->setEnabled(!null_sequence); - ui->openGLWidget->setEnabled(!null_sequence); - ui->openGLWidget->setVisible(!null_sequence); - ui->pushButton->setEnabled(!null_sequence); - ui->pushButton_2->setEnabled(!null_sequence); - ui->pushButton_3->setEnabled(!null_sequence); - ui->pushButton_4->setEnabled(!null_sequence); - ui->pushButton_5->setEnabled(!null_sequence); - - init_audio(); - - if (!null_sequence) { - config.timecode_view = (frame_rate_is_droppable(s->frame_rate)) ? TIMECODE_DROP : TIMECODE_NONDROP; - - update_playhead_timecode(s->playhead); - update_end_timecode(); - - ui->glViewerPane->aspect_ratio = (float) s->width / (float) s->height; - ui->glViewerPane->adjust(); - } else { - update_playhead_timecode(0); - update_end_timecode(); - } - - viewer_widget->update(); - - update(); - } + set_sequence(false, static_cast(media)); break; } } -void Viewer::on_pushButton_clicked() -{ +void Viewer::on_pushButton_clicked() { panel_timeline->go_to_start(); } -void Viewer::on_pushButton_5_clicked() -{ +void Viewer::on_pushButton_5_clicked() { panel_timeline->go_to_end(); } -void Viewer::on_pushButton_2_clicked() -{ +void Viewer::on_pushButton_2_clicked() { panel_timeline->previous_frame(); } -void Viewer::on_pushButton_4_clicked() -{ +void Viewer::on_pushButton_4_clicked() { panel_timeline->next_frame(); } -void Viewer::on_pushButton_3_clicked() -{ +void Viewer::on_pushButton_3_clicked() { panel_timeline->toggle_play(); } void Viewer::update_playhead() { - panel_timeline->seek(ui->currentTimecode->value()); + panel_timeline->seek(ui->currentTimecode->value()); +} + +void Viewer::set_sequence(bool main, Sequence *s) { + main_sequence = main; + seq = (main) ? sequence : s; + viewer_widget->display_sequence = seq; + + bool null_sequence = (seq == NULL); + + ui->headers->setEnabled(!null_sequence); + ui->currentTimecode->setEnabled(!null_sequence); + ui->openGLWidget->setEnabled(!null_sequence); + ui->openGLWidget->setVisible(!null_sequence); + ui->pushButton->setEnabled(!null_sequence); + ui->pushButton_2->setEnabled(!null_sequence); + ui->pushButton_3->setEnabled(!null_sequence); + ui->pushButton_4->setEnabled(!null_sequence); + ui->pushButton_5->setEnabled(!null_sequence); + + init_audio(); + + if (!null_sequence) { + config.timecode_view = (frame_rate_is_droppable(seq->frame_rate)) ? TIMECODE_DROP : TIMECODE_NONDROP; + + update_playhead_timecode(seq->playhead); + update_end_timecode(); + + ui->glViewerPane->aspect_ratio = (float) seq->width / (float) seq->height; + ui->glViewerPane->adjust(); + + setWindowTitle(panel_name + seq->name); + } else { + update_playhead_timecode(0); + update_end_timecode(); + + setWindowTitle(panel_name + "(none)"); + } + + viewer_widget->update(); + + update(); } void Viewer::set_playpause_icon(bool play) { diff --git a/panels/viewer.h b/panels/viewer.h index 90197f80f..6925f58ff 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -21,7 +21,9 @@ class Viewer : public QDockWidget public: explicit Viewer(QWidget *parent = 0); ~Viewer(); - void update_media(int type, void* media); + + void set_main_sequence(); + void set_media(int type, void* media); void compose(); void set_playpause_icon(bool play); void update_playhead_timecode(long p); @@ -32,16 +34,15 @@ public: Ui::Viewer *ui; private slots: void on_pushButton_clicked(); - - void on_pushButton_5_clicked(); - + void on_pushButton_5_clicked(); void on_pushButton_2_clicked(); - void on_pushButton_4_clicked(); - void on_pushButton_3_clicked(); - void update_playhead(); +private: + void set_sequence(bool main, Sequence* s); + bool main_sequence; + Sequence* seq; }; #endif // VIEWER_H diff --git a/playback/playback.cpp b/playback/playback.cpp index d3baf4724..338fce490 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -397,7 +397,7 @@ void set_sequence(Sequence* s) { panel_effect_controls->clear_effects(true); sequence = s; panel_timeline->update_sequence(); - panel_sequence_viewer->update_media(MEDIA_TYPE_SEQUENCE, sequence); + panel_sequence_viewer->set_main_sequence(); panel_timeline->setFocus(); } diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index da26aa071..27cfa9117 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -29,7 +29,8 @@ extern "C" { ViewerWidget::ViewerWidget(QWidget *parent) : QOpenGLWidget(parent), rendering(false), - default_fbo(NULL) + default_fbo(NULL), + display_sequence(NULL) { QSurfaceFormat format; format.setDepthBufferSize(24); @@ -43,7 +44,7 @@ ViewerWidget::ViewerWidget(QWidget *parent) : void ViewerWidget::deleteFunction() { // destroy all textures as well makeCurrent(); - closeActiveClips(sequence, true); + closeActiveClips(display_sequence, true); doneCurrent(); } @@ -164,8 +165,8 @@ GLuint ViewerWidget::draw_clip(QOpenGLFramebufferObject* fbo, GLuint texture) { } GLuint ViewerWidget::compose_sequence(Clip* nest, bool render_audio) { - Sequence* s = sequence; - long playhead = sequence->playhead; + Sequence* s = display_sequence; + long playhead = display_sequence->playhead; if (nest != NULL) { s = static_cast(nest->media); @@ -323,7 +324,7 @@ GLuint ViewerWidget::compose_sequence(Clip* nest, bool render_audio) { for (int j=0;jeffects.size();j++) { Effect* e = c->effects.at(j); if (e->is_enabled()) { - double timecode = ((double)(sequence->playhead-c->timeline_in+c->clip_in)/(double)sequence->frame_rate); + double timecode = ((double)(playhead-c->timeline_in+c->clip_in)/(double)c->sequence->frame_rate); if (e->enable_coords) { e->process_coords(timecode, coords); } @@ -415,7 +416,7 @@ GLuint ViewerWidget::compose_sequence(Clip* nest, bool render_audio) { } // visually update all the keyframe values - double ts = (playhead - c->timeline_in + c->clip_in)/sequence->frame_rate; + double ts = (playhead - c->timeline_in + c->clip_in)/s->frame_rate; for (int i=0;ieffects.size();i++) { Effect* e = c->effects.at(i); for (int j=0;jrow_count();j++) { diff --git a/ui/viewerwidget.h b/ui/viewerwidget.h index f50ea916d..9db089d16 100644 --- a/ui/viewerwidget.h +++ b/ui/viewerwidget.h @@ -22,6 +22,7 @@ public: bool rendering; void paintGL(); void initializeGL(); + Sequence* display_sequence; QOpenGLFramebufferObject* default_fbo; protected: