diff --git a/panels/timeline.cpp b/panels/timeline.cpp index e9279206f..7726a08e8 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -417,16 +417,6 @@ bool Timeline::focused() { return (sequence != NULL && (ui->headers->hasFocus() || ui->video_area->hasFocus() || ui->audio_area->hasFocus())); } -bool Timeline::center_scroll_to_playhead() { - // returns true is the scroll was changed, false if not - int target_scroll = qMin(ui->horizontalScrollBar->maximum(), qMax(0, getScreenPointFromFrame(zoom, sequence->playhead)-(ui->editAreas->width()>>1))); - if (target_scroll == ui->horizontalScrollBar->value()) { - return false; - } - ui->horizontalScrollBar->setValue(target_scroll); - return true; -} - void Timeline::repaint_timeline() { bool draw = true; @@ -442,7 +432,7 @@ void Timeline::repaint_timeline() { draw = false; } } else if (config.autoscroll == AUTOSCROLL_SMOOTH_SCROLL) { - if (center_scroll_to_playhead()) { + if (center_scroll_to_playhead(ui->horizontalScrollBar, zoom, sequence->playhead)) { draw = false; } } @@ -458,7 +448,7 @@ void Timeline::repaint_timeline() { if (sequence != NULL) { long sequenceEndFrame = sequence->getEndFrame(); - ui->horizontalScrollBar->setMaximum(qMax(0, getScreenPointFromFrame(zoom, sequenceEndFrame) - (ui->editAreas->width()/2))); + ui->headers->set_scrollbar_max(ui->horizontalScrollBar, sequenceEndFrame, (ui->editAreas->width()/2)); if (last_frame != sequence->playhead) { ui->audio_monitor->update(); @@ -579,7 +569,7 @@ void Timeline::set_zoom_value(double v) { repaint_timeline(); // TODO find a way to gradually move towards target_scroll instead of just centering it? - center_scroll_to_playhead(); + center_scroll_to_playhead(ui->horizontalScrollBar, zoom, sequence->playhead); } void Timeline::set_zoom(bool in) { diff --git a/panels/timeline.h b/panels/timeline.h index db73a87da..fddd177b4 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -227,8 +227,7 @@ private: void set_zoom_value(double v); QVector tool_buttons; void decheck_tool_buttons(QObject* sender); - void set_tool(int tool); - bool center_scroll_to_playhead(); + void set_tool(int tool); long last_frame; int scroll; diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 5b13fe699..b92d96935 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -385,6 +385,7 @@ void Viewer::update_header_zoom() { if (cached_end_frame != sequenceEndFrame) { 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()); } else { ui->headers->update(); } @@ -427,6 +428,8 @@ void Viewer::set_zoom(bool in) { } else { ui->headers->update_zoom(qMax(minimum_zoom, ui->headers->get_zoom()*0.5)); } + ui->headers->set_scrollbar_max(ui->horizontalScrollBar, seq->getEndFrame(), ui->headers->width()); + center_scroll_to_playhead(ui->horizontalScrollBar, ui->headers->get_zoom(), seq->playhead); } void Viewer::set_media(int type, void* media) { diff --git a/panels/viewer.ui b/panels/viewer.ui index 648765042..0a7613183 100644 --- a/panels/viewer.ui +++ b/panels/viewer.ui @@ -66,6 +66,15 @@ + + 0 + + + 20 + + + 1826 + Qt::Horizontal diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index c67c8d39f..d39976bbd 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -10,7 +10,7 @@ #include #include -#include +#include #include #define CLICK_RANGE 5 @@ -19,6 +19,16 @@ #define SUBLINE_MIN_PADDING 50 // TODO play with this #define MARKER_SIZE 4 +bool center_scroll_to_playhead(QScrollBar* bar, double zoom, long playhead) { + // returns true is the scroll was changed, false if not + int target_scroll = qMin(bar->maximum(), qMax(0, getScreenPointFromFrame(zoom, playhead)-(bar->width()>>1))); + if (target_scroll == bar->value()) { + return false; + } + bar->setValue(target_scroll); + return true; +} + TimelineHeader::TimelineHeader(QWidget *parent) : QWidget(parent), snapping(true), @@ -87,6 +97,10 @@ void TimelineHeader::set_out_point(long new_out) { update_parents(); } +void TimelineHeader::set_scrollbar_max(QScrollBar* bar, long sequence_end_frame, int offset) { + bar->setMaximum(qMax(0, getScreenPointFromFrame(zoom, sequence_end_frame) - offset)); +} + void TimelineHeader::show_text(bool enable) { text_enabled = enable; if (enable) { diff --git a/ui/timelineheader.h b/ui/timelineheader.h index 979b3fd38..88adc3151 100644 --- a/ui/timelineheader.h +++ b/ui/timelineheader.h @@ -3,8 +3,10 @@ #include #include -class QScrollArea; class Viewer; +class QScrollBar; + +bool center_scroll_to_playhead(QScrollBar* bar, double zoom, long playhead); class TimelineHeader : public QWidget { @@ -22,6 +24,7 @@ public: void update_zoom(double z); double get_zoom(); void delete_markers(); + void set_scrollbar_max(QScrollBar* bar, long sequence_end_frame, int offset); public slots: void set_scroll(int);