From e623b8640e0734c0170cad5611f60308a18fed54 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 9 Dec 2018 02:15:53 +1100 Subject: [PATCH] integrated waveform with scrollable playhead --- panels/viewer.cpp | 8 +++++++- ui/viewercontainer.cpp | 41 ++++++++++++++++++++++++----------------- ui/viewercontainer.h | 3 ++- ui/viewerwidget.cpp | 27 ++++++++++++++++++--------- ui/viewerwidget.h | 3 +++ 5 files changed, 54 insertions(+), 28 deletions(-) diff --git a/panels/viewer.cpp b/panels/viewer.cpp index b92d96935..49b144b42 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -61,6 +61,7 @@ Viewer::Viewer(QWidget *parent) : connect(&playback_updater, SIGNAL(timeout()), this, SLOT(timer_update())); connect(&recording_flasher, SIGNAL(timeout()), this, SLOT(recording_flasher_update())); connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), ui->headers, SLOT(set_scroll(int))); + connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), ui->openGLWidget, SLOT(set_waveform_scroll(int))); update_playhead_timecode(0); update_end_timecode(); @@ -386,6 +387,7 @@ void Viewer::update_header_zoom() { minimum_zoom = (sequenceEndFrame > 0) ? ((double) ui->headers->width() / (double) sequenceEndFrame) : 1; ui->headers->update_zoom(qMax(ui->headers->get_zoom(), minimum_zoom)); ui->headers->set_scrollbar_max(ui->horizontalScrollBar, sequenceEndFrame, ui->headers->width()); + ui->openGLWidget->waveform_zoom = ui->headers->get_zoom(); } else { ui->headers->update(); } @@ -401,8 +403,8 @@ void Viewer::update_parents() { } void Viewer::update_viewer() { + update_header_zoom(); viewer_widget->update(); - update_header_zoom(); if (seq != NULL) update_playhead_timecode(seq->playhead); update_end_timecode(); } @@ -428,6 +430,10 @@ void Viewer::set_zoom(bool in) { } else { ui->headers->update_zoom(qMax(minimum_zoom, ui->headers->get_zoom()*0.5)); } + if (ui->openGLWidget->waveform) { + ui->openGLWidget->waveform_zoom = ui->headers->get_zoom(); + ui->openGLWidget->update(); + } ui->headers->set_scrollbar_max(ui->horizontalScrollBar, seq->getEndFrame(), ui->headers->width()); center_scroll_to_playhead(ui->horizontalScrollBar, ui->headers->get_zoom(), seq->playhead); } diff --git a/ui/viewercontainer.cpp b/ui/viewercontainer.cpp index cd3e7cbfd..82b203bba 100644 --- a/ui/viewercontainer.cpp +++ b/ui/viewercontainer.cpp @@ -3,6 +3,8 @@ #include #include +#include "viewerwidget.h" + // enforces aspect ratio ViewerContainer::ViewerContainer(QWidget *parent) : QWidget(parent), @@ -11,26 +13,31 @@ ViewerContainer::ViewerContainer(QWidget *parent) : {} void ViewerContainer::adjust() { - if (child != NULL) { - QSize widget_size = size(); - int widget_x = 0; - int widget_y = 0; - int widget_width = widget_size.width(); - int widget_height = widget_size.height(); - float widget_ar = (float) widget_width /(float) widget_height; + if (child != NULL) { + if (child->waveform) { + child->move(0, 0); + child->resize(size()); + } else { + QSize widget_size = size(); + int widget_x = 0; + int widget_y = 0; + int widget_width = widget_size.width(); + int widget_height = widget_size.height(); + float widget_ar = (float) widget_width /(float) widget_height; - bool widget_is_larger_than_sequence = widget_ar > aspect_ratio; + bool widget_is_larger_than_sequence = widget_ar > aspect_ratio; - if (widget_is_larger_than_sequence) { - widget_width = widget_height * aspect_ratio; - widget_x = (widget_size.width() / 2) - (widget_width / 2); - } else { - widget_height = widget_width / aspect_ratio; - widget_y = (widget_size.height() / 2) - (widget_height / 2); - } + if (widget_is_larger_than_sequence) { + widget_width = widget_height * aspect_ratio; + widget_x = (widget_size.width() / 2) - (widget_width / 2); + } else { + widget_height = widget_width / aspect_ratio; + widget_y = (widget_size.height() / 2) - (widget_height / 2); + } - child->move(widget_x, widget_y); - child->resize(widget_width, widget_height); + child->move(widget_x, widget_y); + child->resize(widget_width, widget_height); + } } } diff --git a/ui/viewercontainer.h b/ui/viewercontainer.h index 2d2bdd0b6..c33a65ac6 100644 --- a/ui/viewercontainer.h +++ b/ui/viewercontainer.h @@ -2,6 +2,7 @@ #define VIEWERCONTAINER_H #include +class ViewerWidget; class ViewerContainer : public QWidget { @@ -9,7 +10,7 @@ class ViewerContainer : public QWidget public: explicit ViewerContainer(QWidget *parent = 0); float aspect_ratio; - QWidget* child; + ViewerWidget* child; void adjust(); protected: diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index d0730a725..53c3c47ee 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -43,7 +43,9 @@ ViewerWidget::ViewerWidget(QWidget *parent) : default_fbo(NULL), waveform(false), dragging(false), - selected_gizmo(NULL) + selected_gizmo(NULL), + waveform_zoom(1.0), + waveform_scroll(0) { setMouseTracking(true); setFocusPolicy(Qt::ClickFocus); @@ -69,6 +71,13 @@ void ViewerWidget::delete_function() { } } +void ViewerWidget::set_waveform_scroll(int s) { + if (waveform) { + waveform_scroll = s; + update(); + } +} + void ViewerWidget::show_context_menu() { QMenu menu(this); @@ -141,7 +150,7 @@ void ViewerWidget::paintEvent(QPaintEvent *e) { } void ViewerWidget::seek_from_click(int x) { - viewer->seek(getFrameFromScreenPoint((double) width() / (double) waveform_clip->timeline_out, x)); + viewer->seek(getFrameFromScreenPoint(waveform_zoom, x+waveform_scroll)); } double get_timecode(Clip* c, long playhead) { @@ -765,23 +774,23 @@ void ViewerWidget::paintGL() { compose_sequence(nests, render_audio); if (waveform) { - double waveform_zoom = (double) waveform_ms->audio_preview.size() / (double) width(); - double timeline_zoom = (double) width() / (double) waveform_clip->timeline_out; - QPainter p(this); if (viewer->seq->using_workarea) { - int in_x = getScreenPointFromFrame(timeline_zoom, viewer->seq->workarea_in); - int out_x = getScreenPointFromFrame(timeline_zoom, viewer->seq->workarea_out); + int in_x = getScreenPointFromFrame(waveform_zoom, viewer->seq->workarea_in) - waveform_scroll; + int out_x = getScreenPointFromFrame(waveform_zoom, viewer->seq->workarea_out) - waveform_scroll; p.fillRect(QRect(in_x, 0, out_x - in_x, height()), QColor(255, 255, 255, 64)); p.setPen(Qt::white); p.drawLine(in_x, 0, in_x, height()); p.drawLine(out_x, 0, out_x, height()); } + QRect wr = rect(); + wr.setX(wr.x() - waveform_scroll); + p.setPen(Qt::green); - draw_waveform(waveform_clip, waveform_ms, waveform_clip->timeline_out, &p, rect(), 0, width(), waveform_zoom); + draw_waveform(waveform_clip, waveform_ms, waveform_clip->timeline_out, &p, wr, waveform_scroll, width()+waveform_scroll, waveform_zoom); p.setPen(Qt::red); - int playhead_x = getScreenPointFromFrame(timeline_zoom, viewer->seq->playhead); + int playhead_x = getScreenPointFromFrame(waveform_zoom, viewer->seq->playhead) - waveform_scroll; p.drawLine(playhead_x, 0, playhead_x, height()); } diff --git a/ui/viewerwidget.h b/ui/viewerwidget.h index 1b7abc7d5..d7b9bb859 100644 --- a/ui/viewerwidget.h +++ b/ui/viewerwidget.h @@ -33,10 +33,13 @@ public: bool waveform; Clip* waveform_clip; MediaStream* waveform_ms; + double waveform_zoom; + int waveform_scroll; bool force_quit; public slots: void delete_function(); + void set_waveform_scroll(int s); protected: void paintEvent(QPaintEvent *e); // void resizeGL(int w, int h);