From edf6f002718f65296035835922d99a175b455fc9 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 24 Dec 2018 02:15:37 +1100 Subject: [PATCH 1/4] implemented some resizable scroll bars --- olive.pro | 6 ++- panels/project.cpp | 2 +- panels/timeline.cpp | 9 ++++- panels/timeline.h | 2 + panels/timeline.ui | 7 +++- panels/viewer.cpp | 27 ++++++++------ panels/viewer.h | 2 + panels/viewer.ui | 19 ++++++---- ui/resizablescrollbar.cpp | 78 +++++++++++++++++++++++++++++++++++++++ ui/resizablescrollbar.h | 25 +++++++++++++ ui/timelineheader.cpp | 4 ++ ui/timelineheader.h | 1 + 12 files changed, 159 insertions(+), 23 deletions(-) create mode 100644 ui/resizablescrollbar.cpp create mode 100644 ui/resizablescrollbar.h diff --git a/olive.pro b/olive.pro index 78bd16870..f38efd430 100644 --- a/olive.pro +++ b/olive.pro @@ -96,7 +96,8 @@ SOURCES += \ project/effectgizmo.cpp \ io/clipboard.cpp \ dialogs/stabilizerdialog.cpp \ - io/avtogl.cpp + io/avtogl.cpp \ + ui/resizablescrollbar.cpp HEADERS += \ mainwindow.h \ @@ -172,7 +173,8 @@ HEADERS += \ project/effectgizmo.h \ io/clipboard.h \ dialogs/stabilizerdialog.h \ - io/avtogl.h + io/avtogl.h \ + ui/resizablescrollbar.h FORMS += \ mainwindow.ui \ diff --git a/panels/project.cpp b/panels/project.cpp index dc391ae0b..ae105cd47 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -1003,7 +1003,7 @@ void Project::save_recent_projects() { void Project::clear_recent_projects() { recent_projects.clear(); - save_recent_projects(); + save_recent_projects(); } void Project::add_recent_project(QString url) { diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 0cb5ac181..a5efdb4be 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -108,6 +108,7 @@ Timeline::Timeline(QWidget *parent) : connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(setScroll(int))); connect(ui->videoScrollbar, SIGNAL(valueChanged(int)), ui->video_area, SLOT(setScroll(int))); connect(ui->audioScrollbar, SIGNAL(valueChanged(int)), ui->audio_area, SLOT(setScroll(int))); + connect(ui->horizontalScrollBar, SIGNAL(resized_scroll(double)), this, SLOT(resized_scroll_listener(double))); update_sequence(); } @@ -423,6 +424,7 @@ void Timeline::repaint_timeline() { if (sequence != NULL && !ui->horizontalScrollBar->isSliderDown() + && !ui->horizontalScrollBar->is_resizing() && panel_sequence_viewer->playing && !zoom_just_changed) { // auto scroll @@ -570,7 +572,8 @@ 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(ui->horizontalScrollBar, zoom, sequence->playhead); + if (!ui->horizontalScrollBar->is_resizing()) + center_scroll_to_playhead(ui->horizontalScrollBar, zoom, sequence->playhead); } void Timeline::set_zoom(bool in) { @@ -1573,6 +1576,10 @@ void Timeline::transition_menu_select(QAction* a) { ui->toolTransitionButton->setChecked(true); } +void Timeline::resized_scroll_listener(double z) { + set_zoom_value(zoom * z); +} + void move_clip(ComboAction* ca, Clip *c, long iin, long iout, long iclip_in, int itrack, bool verify_transitions) { ca->append(new MoveClipAction(c, iin, iout, iclip_in, itrack)); diff --git a/panels/timeline.h b/panels/timeline.h index 6d4bb4a5a..3829f934a 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -223,6 +223,8 @@ private slots: void transition_menu_select(QAction*); + void resized_scroll_listener(double z); + private: void set_zoom_value(double v); QVector tool_buttons; diff --git a/panels/timeline.ui b/panels/timeline.ui index d5fb2e486..aadfdb639 100644 --- a/panels/timeline.ui +++ b/panels/timeline.ui @@ -456,7 +456,7 @@ - + 0 @@ -506,6 +506,11 @@
ui/audiomonitor.h
1 + + ResizableScrollBar + QScrollBar +
ui/resizablescrollbar.h
+
diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 667780ea3..52d7bfd79 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -65,6 +65,7 @@ Viewer::Viewer(QWidget *parent) : 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)), viewer_widget, SLOT(set_waveform_scroll(int))); + connect(ui->horizontalScrollBar, SIGNAL(resized_scroll(double)), this, SLOT(resized_scroll_listener(double))); connect(ui->zoomComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(zoom_update(int))); update_playhead_timecode(0); @@ -419,20 +420,20 @@ void Viewer::set_out_point() { void Viewer::set_zoom(bool in) { if (seq != NULL) { - if (in) { - ui->headers->update_zoom(ui->headers->get_zoom()*2); - } else { - ui->headers->update_zoom(qMax(minimum_zoom, ui->headers->get_zoom()*0.5)); - } - if (viewer_widget->waveform) { - viewer_widget->waveform_zoom = ui->headers->get_zoom(); - viewer_widget->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); + set_zoom_value(in ? ui->headers->get_zoom()*2 : qMax(minimum_zoom, ui->headers->get_zoom()*0.5)); } } +void Viewer::set_zoom_value(double d) { + ui->headers->update_zoom(d); + if (viewer_widget->waveform) { + viewer_widget->waveform_zoom = d; + viewer_widget->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); +} + void Viewer::set_media(Media* m) { main_sequence = false; media = m; @@ -572,6 +573,10 @@ void Viewer::zoom_update(int i) { ui->glViewerPane->adjust(); } +void Viewer::resized_scroll_listener(double d) { + set_zoom_value(ui->headers->get_zoom()*d); +} + void Viewer::clean_created_seq() { viewer_widget->waveform = false; diff --git a/panels/viewer.h b/panels/viewer.h index 449f884e2..b9cdc7a14 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -84,6 +84,7 @@ private slots: void timer_update(); void recording_flasher_update(); void zoom_update(int i); + void resized_scroll_listener(double d); private: void clean_created_seq(); void set_sequence(bool main, Sequence* s); @@ -92,6 +93,7 @@ private: long cached_end_frame; QString panel_name; double minimum_zoom; + void set_zoom_value(double d); bool cue_recording_internal; QTimer recording_flasher; diff --git a/panels/viewer.ui b/panels/viewer.ui index acb55f077..7d88f0742 100644 --- a/panels/viewer.ui +++ b/panels/viewer.ui @@ -55,7 +55,7 @@
- + 0 @@ -322,6 +322,17 @@ + + TimelineHeader + QWidget +
ui/timelineheader.h
+ 1 +
+ + ResizableScrollBar + QScrollBar +
ui/resizablescrollbar.h
+
ViewerContainer QWidget @@ -333,12 +344,6 @@ QLabel
ui/labelslider.h
- - TimelineHeader - QWidget -
ui/timelineheader.h
- 1 -
diff --git a/ui/resizablescrollbar.cpp b/ui/resizablescrollbar.cpp new file mode 100644 index 000000000..77dec0e1a --- /dev/null +++ b/ui/resizablescrollbar.cpp @@ -0,0 +1,78 @@ +#include "resizablescrollbar.h" + +#include +#include +#include + +#define RESIZE_HANDLE_SIZE 10 + +ResizableScrollBar::ResizableScrollBar(QWidget *parent) : + QScrollBar(parent), + resize_init(false), + resize_proc(false) +{ + setMouseTracking(true); +} + +bool ResizableScrollBar::is_resizing() { + return resize_proc; +} + +void ResizableScrollBar::mousePressEvent(QMouseEvent *e) { + if (resize_init) { + resize_proc = true; + resize_start = e->pos().x(); + } else { + QScrollBar::mousePressEvent(e); + } +} + +void ResizableScrollBar::mouseMoveEvent(QMouseEvent *e) { + QStyleOptionSlider opt; + initStyleOption(&opt); + + QRect sr = style()->subControlRect(QStyle::CC_ScrollBar, &opt, + QStyle::SC_ScrollBarSlider, this); + + if (resize_proc) { + int diff = e->pos().x() - resize_start; + if (resize_top) { + setValue(value() + diff); + diff = -diff; + } + int w = sr.width() + diff; + emit resized_scroll(double(sr.width())/double(w)); + resize_start = e->pos().x(); + } else { + bool new_resize_init = false; + + if ((orientation() == Qt::Horizontal && e->pos().x() > sr.left()-RESIZE_HANDLE_SIZE && e->pos().x() < sr.left()+RESIZE_HANDLE_SIZE) + || (orientation() == Qt::Vertical && e->pos().y() > sr.top()-RESIZE_HANDLE_SIZE && e->pos().y() < sr.top()+RESIZE_HANDLE_SIZE)) { + new_resize_init = true; + resize_top = true; + } else if ((orientation() == Qt::Horizontal && e->pos().x() > sr.right()-RESIZE_HANDLE_SIZE && e->pos().x() < sr.right()+RESIZE_HANDLE_SIZE) + || (orientation() == Qt::Vertical && e->pos().y() > sr.bottom()-RESIZE_HANDLE_SIZE && e->pos().y() < sr.bottom()+RESIZE_HANDLE_SIZE)) { + new_resize_init = true; + resize_top = false; + } + + if (resize_init != new_resize_init) { + if (new_resize_init) { + setCursor(Qt::SizeHorCursor); + } else { + unsetCursor(); + } + resize_init = new_resize_init; + } + + QScrollBar::mouseMoveEvent(e); + } +} + +void ResizableScrollBar::mouseReleaseEvent(QMouseEvent *e) { + if (resize_proc) { + resize_proc = false; + } else { + QScrollBar::mouseReleaseEvent(e); + } +} diff --git a/ui/resizablescrollbar.h b/ui/resizablescrollbar.h new file mode 100644 index 000000000..3ba8ab21d --- /dev/null +++ b/ui/resizablescrollbar.h @@ -0,0 +1,25 @@ +#ifndef RESIZABLESCROLLBAR_H +#define RESIZABLESCROLLBAR_H + +#include + +class ResizableScrollBar : public QScrollBar +{ + Q_OBJECT +public: + ResizableScrollBar(QWidget * parent = 0); + bool is_resizing(); +signals: + void resized_scroll(double d); +protected: + void mousePressEvent(QMouseEvent *) override; + void mouseMoveEvent(QMouseEvent *) override; + void mouseReleaseEvent(QMouseEvent *) override; +private: + bool resize_init; + bool resize_proc; + int resize_start; + bool resize_top; +}; + +#endif // RESIZABLESCROLLBAR_H diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index 53cddecab..5db385314 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -410,3 +410,7 @@ void TimelineHeader::show_context_menu(const QPoint &pos) { contextMenu.addAction(&clear_in_out); contextMenu.exec(mapToGlobal(pos)); } + +void TimelineHeader::resized_scroll_listener(double d) { + update_zoom(zoom * d); +} diff --git a/ui/timelineheader.h b/ui/timelineheader.h index 4bced42af..884a44adf 100644 --- a/ui/timelineheader.h +++ b/ui/timelineheader.h @@ -30,6 +30,7 @@ public slots: void set_scroll(int); void set_visible_in(long i); void show_context_menu(const QPoint &pos); + void resized_scroll_listener(double d); protected: void paintEvent(QPaintEvent*); From 5aca8b881d2d9a941fe84f07d8d58f5698022c5f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 25 Dec 2018 21:12:25 +1100 Subject: [PATCH 2/4] accurate math on timeline, near-accurate on viewer --- panels/timeline.cpp | 10 +++++----- panels/timeline.h | 4 ++-- panels/viewer.cpp | 7 ++++--- panels/viewer.h | 2 +- ui/resizablescrollbar.cpp | 32 +++++++++++++++++++++++++------- ui/resizablescrollbar.h | 2 +- 6 files changed, 38 insertions(+), 19 deletions(-) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index a5efdb4be..23e37b03e 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -108,7 +108,7 @@ Timeline::Timeline(QWidget *parent) : connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(setScroll(int))); connect(ui->videoScrollbar, SIGNAL(valueChanged(int)), ui->video_area, SLOT(setScroll(int))); connect(ui->audioScrollbar, SIGNAL(valueChanged(int)), ui->audio_area, SLOT(setScroll(int))); - connect(ui->horizontalScrollBar, SIGNAL(resized_scroll(double)), this, SLOT(resized_scroll_listener(double))); + connect(ui->horizontalScrollBar, SIGNAL(resize_move(double)), this, SLOT(resize_move(double))); update_sequence(); } @@ -451,7 +451,7 @@ void Timeline::repaint_timeline() { if (sequence != NULL) { long sequenceEndFrame = sequence->getEndFrame(); - ui->headers->set_scrollbar_max(ui->horizontalScrollBar, sequenceEndFrame, (ui->editAreas->width()/2)); + ui->headers->set_scrollbar_max(ui->horizontalScrollBar, sequenceEndFrame, ui->editAreas->width() - getScreenPointFromFrame(zoom, 200)); if (last_frame != sequence->playhead) { ui->audio_monitor->update(); @@ -1403,7 +1403,7 @@ void Timeline::deselect() { } long getFrameFromScreenPoint(double zoom, int x) { - long f = qCeil((float) x / zoom); + long f = qCeil((float) x / zoom); if (f < 0) { return 0; } @@ -1411,7 +1411,7 @@ long getFrameFromScreenPoint(double zoom, int x) { } int getScreenPointFromFrame(double zoom, long frame) { - return (int) qFloor(frame*zoom); + return (int) qFloor(frame*zoom); } long Timeline::getTimelineFrameFromScreenPoint(int x) { @@ -1576,7 +1576,7 @@ void Timeline::transition_menu_select(QAction* a) { ui->toolTransitionButton->setChecked(true); } -void Timeline::resized_scroll_listener(double z) { +void Timeline::resize_move(double z) { set_zoom_value(zoom * z); } diff --git a/panels/timeline.h b/panels/timeline.h index 3829f934a..7c91881c1 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -223,7 +223,7 @@ private slots: void transition_menu_select(QAction*); - void resized_scroll_listener(double z); + void resize_move(double d); private: void set_zoom_value(double v); @@ -231,7 +231,7 @@ private: void decheck_tool_buttons(QObject* sender); void set_tool(int tool); long last_frame; - int scroll; + int scroll; int default_track_height; }; diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 52d7bfd79..f46810b01 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -65,7 +65,7 @@ Viewer::Viewer(QWidget *parent) : 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)), viewer_widget, SLOT(set_waveform_scroll(int))); - connect(ui->horizontalScrollBar, SIGNAL(resized_scroll(double)), this, SLOT(resized_scroll_listener(double))); + connect(ui->horizontalScrollBar, SIGNAL(resize_move(double)), this, SLOT(resize_move(double))); connect(ui->zoomComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(zoom_update(int))); update_playhead_timecode(0); @@ -431,7 +431,8 @@ void Viewer::set_zoom_value(double d) { viewer_widget->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); + if (!ui->horizontalScrollBar->is_resizing()) + center_scroll_to_playhead(ui->horizontalScrollBar, ui->headers->get_zoom(), seq->playhead); } void Viewer::set_media(Media* m) { @@ -573,7 +574,7 @@ void Viewer::zoom_update(int i) { ui->glViewerPane->adjust(); } -void Viewer::resized_scroll_listener(double d) { +void Viewer::resize_move(double d) { set_zoom_value(ui->headers->get_zoom()*d); } diff --git a/panels/viewer.h b/panels/viewer.h index b9cdc7a14..a443254bf 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -84,7 +84,7 @@ private slots: void timer_update(); void recording_flasher_update(); void zoom_update(int i); - void resized_scroll_listener(double d); + void resize_move(double d); private: void clean_created_seq(); void set_sequence(bool main, Sequence* s); diff --git a/ui/resizablescrollbar.cpp b/ui/resizablescrollbar.cpp index 77dec0e1a..fd09f46c6 100644 --- a/ui/resizablescrollbar.cpp +++ b/ui/resizablescrollbar.cpp @@ -4,6 +4,8 @@ #include #include +#include "debug.h" + #define RESIZE_HANDLE_SIZE 10 ResizableScrollBar::ResizableScrollBar(QWidget *parent) : @@ -20,6 +22,12 @@ bool ResizableScrollBar::is_resizing() { void ResizableScrollBar::mousePressEvent(QMouseEvent *e) { if (resize_init) { + QStyleOptionSlider opt; + initStyleOption(&opt); + + QRect sr = style()->subControlRect(QStyle::CC_ScrollBar, &opt, + QStyle::SC_ScrollBarSlider, this); + resize_proc = true; resize_start = e->pos().x(); } else { @@ -33,16 +41,26 @@ void ResizableScrollBar::mouseMoveEvent(QMouseEvent *e) { QRect sr = style()->subControlRect(QStyle::CC_ScrollBar, &opt, QStyle::SC_ScrollBarSlider, this); + QRect gr = style()->subControlRect(QStyle::CC_ScrollBar, &opt, + QStyle::SC_ScrollBarGroove, this); if (resize_proc) { - int diff = e->pos().x() - resize_start; - if (resize_top) { - setValue(value() + diff); - diff = -diff; + int diff = (e->pos().x() - resize_start); + if (resize_top) diff = -diff; + double scale = double(sr.width())/double(sr.width()+diff); + if (!qIsInf(scale) && !qIsNull(scale)) { + emit resize_move(scale); + resize_start = e->pos().x(); + + if (resize_top) { + int slider_min = gr.x(); + int slider_max = gr.right() - (sr.width()+diff) + 1; + int val = QStyle::sliderValueFromPosition(minimum(), maximum(), e->pos().x() - slider_min, slider_max - slider_min, opt.upsideDown); + setValue(val); + } else { + setValue(qRound(value() * scale)); + } } - int w = sr.width() + diff; - emit resized_scroll(double(sr.width())/double(w)); - resize_start = e->pos().x(); } else { bool new_resize_init = false; diff --git a/ui/resizablescrollbar.h b/ui/resizablescrollbar.h index 3ba8ab21d..d3d8d0720 100644 --- a/ui/resizablescrollbar.h +++ b/ui/resizablescrollbar.h @@ -10,7 +10,7 @@ public: ResizableScrollBar(QWidget * parent = 0); bool is_resizing(); signals: - void resized_scroll(double d); + void resize_move(double i); protected: void mousePressEvent(QMouseEvent *) override; void mouseMoveEvent(QMouseEvent *) override; From 9bc9d33ee5c4324b63e07117a7f470ac14a3ea1c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 26 Dec 2018 18:10:23 +1100 Subject: [PATCH 3/4] correct math in resizable scrollbars --- panels/timeline.cpp | 12 ++++++++++-- panels/timeline.h | 3 +++ panels/viewer.cpp | 21 +++++++++++++++++---- panels/viewer.h | 5 ++++- ui/resizablescrollbar.cpp | 10 +++++++++- ui/resizablescrollbar.h | 4 ++++ 6 files changed, 47 insertions(+), 8 deletions(-) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 23e37b03e..b4c1abf0c 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -451,7 +451,7 @@ void Timeline::repaint_timeline() { if (sequence != NULL) { long sequenceEndFrame = sequence->getEndFrame(); - ui->headers->set_scrollbar_max(ui->horizontalScrollBar, sequenceEndFrame, ui->editAreas->width() - getScreenPointFromFrame(zoom, 200)); + set_sb_max(); if (last_frame != sequence->playhead) { ui->audio_monitor->update(); @@ -475,7 +475,11 @@ void Timeline::select_all() { } } repaint_timeline(); - } + } +} + +void Timeline::resizeEvent(QResizeEvent *event) { + if (sequence != NULL) set_sb_max(); } void Timeline::delete_in_out(bool ripple) { @@ -1580,6 +1584,10 @@ void Timeline::resize_move(double z) { set_zoom_value(zoom * z); } +void Timeline::set_sb_max() { + ui->headers->set_scrollbar_max(ui->horizontalScrollBar, sequence->getEndFrame(), ui->editAreas->width() - getScreenPointFromFrame(zoom, 200)); +} + void move_clip(ComboAction* ca, Clip *c, long iin, long iout, long iclip_in, int itrack, bool verify_transitions) { ca->append(new MoveClipAction(c, iin, iout, iclip_in, itrack)); diff --git a/panels/timeline.h b/panels/timeline.h index 7c91881c1..a9633e723 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -186,6 +186,8 @@ public: int transition_tool_side; Ui::Timeline *ui; + + void resizeEvent(QResizeEvent *event); public slots: void repaint_timeline(); @@ -232,6 +234,7 @@ private: void set_tool(int tool); long last_frame; int scroll; + void set_sb_max(); int default_track_height; }; diff --git a/panels/viewer.cpp b/panels/viewer.cpp index f46810b01..351a47ba3 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -380,7 +380,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()); + set_sb_max(); viewer_widget->waveform_zoom = ui->headers->get_zoom(); } else { ui->headers->update(); @@ -393,7 +393,13 @@ void Viewer::update_parents() { update_ui(false); } else { update_viewer(); - } + } +} + +void Viewer::resizeEvent(QResizeEvent *event) { + if (seq != NULL) { + set_sb_max(); + } } void Viewer::update_viewer() { @@ -430,9 +436,15 @@ void Viewer::set_zoom_value(double d) { viewer_widget->waveform_zoom = d; viewer_widget->update(); } + if (seq != NULL) { + set_sb_max(); + if (!ui->horizontalScrollBar->is_resizing()) + center_scroll_to_playhead(ui->horizontalScrollBar, ui->headers->get_zoom(), seq->playhead); + } +} + +void Viewer::set_sb_max() { ui->headers->set_scrollbar_max(ui->horizontalScrollBar, seq->getEndFrame(), ui->headers->width()); - if (!ui->horizontalScrollBar->is_resizing()) - center_scroll_to_playhead(ui->horizontalScrollBar, ui->headers->get_zoom(), seq->playhead); } void Viewer::set_media(Media* m) { @@ -575,6 +587,7 @@ void Viewer::zoom_update(int i) { } void Viewer::resize_move(double d) { + dout << "RM"; set_zoom_value(ui->headers->get_zoom()*d); } diff --git a/panels/viewer.h b/panels/viewer.h index a443254bf..c826aea80 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -71,6 +71,8 @@ public: Ui::Viewer *ui; + void resizeEvent(QResizeEvent *event); + public slots: void play_wake(); @@ -94,9 +96,10 @@ private: QString panel_name; double minimum_zoom; void set_zoom_value(double d); + void set_sb_max(); bool cue_recording_internal; - QTimer recording_flasher; + QTimer recording_flasher; }; #endif // VIEWER_H diff --git a/ui/resizablescrollbar.cpp b/ui/resizablescrollbar.cpp index fd09f46c6..0bde2cfeb 100644 --- a/ui/resizablescrollbar.cpp +++ b/ui/resizablescrollbar.cpp @@ -20,6 +20,10 @@ bool ResizableScrollBar::is_resizing() { return resize_proc; } +void ResizableScrollBar::resizeEvent(QResizeEvent *event) { + setPageStep(event->size().width()); +} + void ResizableScrollBar::mousePressEvent(QMouseEvent *e) { if (resize_init) { QStyleOptionSlider opt; @@ -30,6 +34,9 @@ void ResizableScrollBar::mousePressEvent(QMouseEvent *e) { resize_proc = true; resize_start = e->pos().x(); + + resize_start_max = maximum(); + resize_start_width = sr.width(); } else { QScrollBar::mousePressEvent(e); } @@ -54,8 +61,9 @@ void ResizableScrollBar::mouseMoveEvent(QMouseEvent *e) { if (resize_top) { int slider_min = gr.x(); - int slider_max = gr.right() - (sr.width()+diff) + 1; + int slider_max = gr.right() - (sr.width()+diff); int val = QStyle::sliderValueFromPosition(minimum(), maximum(), e->pos().x() - slider_min, slider_max - slider_min, opt.upsideDown); + setValue(val); } else { setValue(qRound(value() * scale)); diff --git a/ui/resizablescrollbar.h b/ui/resizablescrollbar.h index d3d8d0720..70e4094d7 100644 --- a/ui/resizablescrollbar.h +++ b/ui/resizablescrollbar.h @@ -12,6 +12,7 @@ public: signals: void resize_move(double i); protected: + void resizeEvent(QResizeEvent *event) override; void mousePressEvent(QMouseEvent *) override; void mouseMoveEvent(QMouseEvent *) override; void mouseReleaseEvent(QMouseEvent *) override; @@ -20,6 +21,9 @@ private: bool resize_proc; int resize_start; bool resize_top; + + int resize_start_max; + int resize_start_width; }; #endif // RESIZABLESCROLLBAR_H From 26c7133cc7c898c3b84c6e9a43fb056604615c23 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 26 Dec 2018 18:27:12 +1100 Subject: [PATCH 4/4] added it to effect controls --- panels/effectcontrols.cpp | 1 + panels/effectcontrols.ui | 11 ++++++++--- ui/keyframeview.cpp | 4 ++++ ui/keyframeview.h | 3 ++- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 3fa48359c..4809aa482 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -43,6 +43,7 @@ EffectControls::EffectControls(QWidget *parent) : ui->label_2->setVisible(false); connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), ui->headers, SLOT(set_scroll(int))); + connect(ui->horizontalScrollBar, SIGNAL(resize_move(double)), ui->keyframeView, SLOT(resize_move(double))); connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), ui->keyframeView, SLOT(set_x_scroll(int))); connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), ui->keyframeView, SLOT(set_y_scroll(int))); connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), ui->scrollArea->verticalScrollBar(), SLOT(setValue(int))); diff --git a/panels/effectcontrols.ui b/panels/effectcontrols.ui index 8c450c815..587946d5a 100644 --- a/panels/effectcontrols.ui +++ b/panels/effectcontrols.ui @@ -71,8 +71,8 @@ 0 0 - 225 - 477 + 189 + 483 @@ -502,7 +502,7 @@
- + 0 @@ -543,6 +543,11 @@
panels/effectcontrols.h
1 + + ResizableScrollBar + QScrollBar +
ui/resizablescrollbar.h
+
diff --git a/ui/keyframeview.cpp b/ui/keyframeview.cpp index de5ff7cb3..8fd23f63c 100644 --- a/ui/keyframeview.cpp +++ b/ui/keyframeview.cpp @@ -189,6 +189,10 @@ void KeyframeView::draw_keyframe(QPainter &p, int type, int x, int y, bool darke } } +void KeyframeView::resize_move(double d) { + header->update_zoom(header->get_zoom()*d); +} + void KeyframeView::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { int row_index = -1; diff --git a/ui/keyframeview.h b/ui/keyframeview.h index cfaebc419..e565d6e61 100644 --- a/ui/keyframeview.h +++ b/ui/keyframeview.h @@ -23,6 +23,7 @@ public: public slots: void set_x_scroll(int); void set_y_scroll(int); + void resize_move(double d); private: long adjust_row_keyframe(EffectRow* row, long time); QVector selected_rows; @@ -38,7 +39,7 @@ private: bool mousedown; bool dragging; bool keys_selected; - bool select_rect; + bool select_rect; bool keyframeIsSelected(EffectRow* row, int keyframe);