implemented some resizable scroll bars

This commit is contained in:
itsmattkc
2018-12-24 02:15:37 +11:00
parent a53aac2366
commit edf6f00271
12 changed files with 159 additions and 23 deletions
+4 -2
View File
@@ -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 \
+1 -1
View File
@@ -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) {
+8 -1
View File
@@ -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));
+2
View File
@@ -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<QPushButton*> tool_buttons;
+6 -1
View File
@@ -456,7 +456,7 @@
</widget>
</item>
<item>
<widget class="QScrollBar" name="horizontalScrollBar">
<widget class="ResizableScrollBar" name="horizontalScrollBar">
<property name="maximum">
<number>0</number>
</property>
@@ -506,6 +506,11 @@
<header>ui/audiomonitor.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>ResizableScrollBar</class>
<extends>QScrollBar</extends>
<header>ui/resizablescrollbar.h</header>
</customwidget>
</customwidgets>
<resources>
<include location="../icons/icons.qrc"/>
+16 -11
View File
@@ -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;
+2
View File
@@ -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;
+12 -7
View File
@@ -55,7 +55,7 @@
<widget class="TimelineHeader" name="headers" native="true"/>
</item>
<item>
<widget class="QScrollBar" name="horizontalScrollBar">
<widget class="ResizableScrollBar" name="horizontalScrollBar">
<property name="maximum">
<number>0</number>
</property>
@@ -322,6 +322,17 @@
</widget>
</widget>
<customwidgets>
<customwidget>
<class>TimelineHeader</class>
<extends>QWidget</extends>
<header>ui/timelineheader.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>ResizableScrollBar</class>
<extends>QScrollBar</extends>
<header>ui/resizablescrollbar.h</header>
</customwidget>
<customwidget>
<class>ViewerContainer</class>
<extends>QWidget</extends>
@@ -333,12 +344,6 @@
<extends>QLabel</extends>
<header>ui/labelslider.h</header>
</customwidget>
<customwidget>
<class>TimelineHeader</class>
<extends>QWidget</extends>
<header>ui/timelineheader.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<include location="../icons/icons.qrc"/>
+78
View File
@@ -0,0 +1,78 @@
#include "resizablescrollbar.h"
#include <QMouseEvent>
#include <QStyle>
#include <QStyleOptionSlider>
#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);
}
}
+25
View File
@@ -0,0 +1,25 @@
#ifndef RESIZABLESCROLLBAR_H
#define RESIZABLESCROLLBAR_H
#include <QScrollBar>
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
+4
View File
@@ -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);
}
+1
View File
@@ -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*);