added more snapping

This commit is contained in:
itsmattkc
2018-06-09 01:59:16 -07:00
parent cf18e52e90
commit b8fc5f4dac
6 changed files with 116 additions and 6 deletions
+1 -1
View File
@@ -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>
+21
View File
@@ -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) {
+2
View File
@@ -72,6 +72,8 @@ public:
int getScreenPointFromFrame(long frame);
long getFrameFromScreenPoint(int x);
void snap_to_clip(long* l);
Sequence* sequence;
long playhead;
+58
View File
@@ -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);
}
}
+26
View File
@@ -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
+8 -5
View File
@@ -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) {