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*);