implemented some resizable scroll bars
This commit is contained in:
@@ -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
@@ -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
@@ -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));
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
|
||||
@@ -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
@@ -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"/>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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*);
|
||||
|
||||
Reference in New Issue
Block a user