added more snapping
This commit is contained in:
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE QtCreatorProject>
|
||||
<!-- Written by QtCreator 4.6.1, 2018-06-08T12:56:41. -->
|
||||
<!-- Written by QtCreator 4.6.1, 2018-06-08T22:09:27. -->
|
||||
<qtcreator>
|
||||
<data>
|
||||
<variable>EnvironmentId</variable>
|
||||
|
||||
@@ -454,6 +454,27 @@ void Timeline::split_at_playhead() {
|
||||
if (split_selected) redraw_all_clips();
|
||||
}
|
||||
|
||||
void Timeline::snap_to_clip(long* l) {
|
||||
int limit = 10;
|
||||
snapped = false;
|
||||
for (int i=0;i<sequence->clip_count();i++) {
|
||||
Clip* c = sequence->get_clip(i);
|
||||
if (*l > c->timeline_in-limit-1 &&
|
||||
*l < c->timeline_in+limit+1) {
|
||||
*l = c->timeline_in;
|
||||
snapped = true;
|
||||
snap_point = c->timeline_in;
|
||||
break;
|
||||
} else if (*l > c->timeline_out-limit-1 &&
|
||||
*l < c->timeline_out+limit+1) {
|
||||
*l = c->timeline_out;
|
||||
snapped = true;
|
||||
snap_point = c->timeline_out;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
long Timeline::getFrameFromScreenPoint(int x) {
|
||||
long f = round((float) x / zoom);
|
||||
if (f < 0) {
|
||||
|
||||
@@ -72,6 +72,8 @@ public:
|
||||
int getScreenPointFromFrame(long frame);
|
||||
long getFrameFromScreenPoint(int x);
|
||||
|
||||
void snap_to_clip(long* l);
|
||||
|
||||
Sequence* sequence;
|
||||
long playhead;
|
||||
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
#include "timelineheader.h"
|
||||
|
||||
#include "panels/panels.h"
|
||||
#include "panels/timeline.h"
|
||||
#include "project/sequence.h"
|
||||
|
||||
#include <QPainter>
|
||||
#include <QMouseEvent>
|
||||
|
||||
#define PLAYHEAD_SIZE 6
|
||||
|
||||
TimelineHeader::TimelineHeader(QWidget *parent) : QWidget(parent)
|
||||
{
|
||||
dragging = false;
|
||||
}
|
||||
|
||||
void set_playhead(QMouseEvent* event) {
|
||||
long frame = panel_timeline->getFrameFromScreenPoint(event->pos().x());
|
||||
if (panel_timeline->snapping) {
|
||||
panel_timeline->snap_to_clip(&frame);
|
||||
}
|
||||
panel_timeline->seek(frame);
|
||||
panel_timeline->repaint_timeline();
|
||||
}
|
||||
|
||||
void TimelineHeader::mousePressEvent(QMouseEvent* event) {
|
||||
set_playhead(event);
|
||||
dragging = true;
|
||||
}
|
||||
|
||||
void TimelineHeader::mouseMoveEvent(QMouseEvent* event) {
|
||||
if (dragging) set_playhead(event);
|
||||
}
|
||||
|
||||
void TimelineHeader::mouseReleaseEvent(QMouseEvent *) {
|
||||
dragging = false;
|
||||
}
|
||||
|
||||
void TimelineHeader::paintEvent(QPaintEvent*) {
|
||||
if (panel_timeline->sequence != NULL) {
|
||||
QPainter p(this);
|
||||
p.setPen(Qt::gray);
|
||||
int interval = panel_timeline->getScreenPointFromFrame(panel_timeline->sequence->frame_rate);
|
||||
for (int i=0;i<width();i+=interval) {
|
||||
p.drawLine(i, 0, i, height());
|
||||
}
|
||||
|
||||
// draw playhead triangle
|
||||
int px = panel_timeline->getScreenPointFromFrame(panel_timeline->playhead);
|
||||
QPoint start(px, height());
|
||||
QPainterPath path;
|
||||
path.moveTo(start);
|
||||
path.lineTo(px-PLAYHEAD_SIZE, 0);
|
||||
path.lineTo(px+PLAYHEAD_SIZE, 0);
|
||||
path.lineTo(start);
|
||||
p.fillPath(path, Qt::red);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
#ifndef TIMELINEHEADER_H
|
||||
#define TIMELINEHEADER_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
class TimelineHeader : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit TimelineHeader(QWidget *parent = nullptr);
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent*) override;
|
||||
void mousePressEvent(QMouseEvent*) override;
|
||||
void mouseMoveEvent(QMouseEvent*) override;
|
||||
void mouseReleaseEvent(QMouseEvent*) override;
|
||||
|
||||
private:
|
||||
bool dragging;
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
};
|
||||
|
||||
#endif // TIMELINEHEADER_H
|
||||
@@ -539,11 +539,14 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) {
|
||||
|
||||
if (panel_timeline->tool == TIMELINE_TOOL_EDIT || panel_timeline->tool == TIMELINE_TOOL_RAZOR) {
|
||||
int limit = panel_timeline->getFrameFromScreenPoint(10);
|
||||
if (panel_timeline->snapping &&
|
||||
!panel_timeline->selecting &&
|
||||
panel_timeline->cursor_frame > panel_timeline->playhead-limit-1 &&
|
||||
panel_timeline->cursor_frame < panel_timeline->playhead+limit+1) {
|
||||
panel_timeline->cursor_frame = panel_timeline->playhead;
|
||||
if (panel_timeline->snapping) {
|
||||
if (!panel_timeline->selecting &&
|
||||
panel_timeline->cursor_frame > panel_timeline->playhead-limit-1 &&
|
||||
panel_timeline->cursor_frame < panel_timeline->playhead+limit+1) {
|
||||
panel_timeline->cursor_frame = panel_timeline->playhead;
|
||||
} else {
|
||||
panel_timeline->snap_to_clip(&panel_timeline->cursor_frame);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (panel_timeline->selecting) {
|
||||
|
||||
Reference in New Issue
Block a user