made graph editor timeline-based rather than clip based, fixes #438

This commit is contained in:
itsmattkc
2019-02-07 00:44:47 -08:00
parent 8a5c25f41d
commit d804f7cfc0
5 changed files with 34 additions and 15 deletions
+22 -8
View File
@@ -105,6 +105,10 @@ void GraphView::set_view_to_selection() {
min_dbl = qMin(key.data.toDouble(), min_dbl);
max_dbl = qMax(key.data.toDouble(), max_dbl);
}
min_time -= row->parent_effect->parent_clip->clip_in;
max_time -= row->parent_effect->parent_clip->clip_in;
set_view_to_rect(min_time, min_dbl, max_time, max_dbl);
}
}
@@ -128,6 +132,9 @@ void GraphView::set_view_to_all() {
}
}
if (can_set) {
min_time -= row->parent_effect->parent_clip->clip_in;
max_time -= row->parent_effect->parent_clip->clip_in;
set_view_to_rect(min_time, min_dbl, max_time, max_dbl);
}
}
@@ -228,7 +235,7 @@ void GraphView::paintEvent(QPaintEvent *) {
for (int j=0;j<sorted_keys.size();j++) {
const EffectKeyframe& key = field->keyframes.at(sorted_keys.at(j));
int key_x = get_screen_x(key.time);
int key_x = get_screen_x(key.time);
int key_y = get_screen_y(key.data.toDouble());
line_pen.setColor(get_curve_color(i, row->fieldCount()));
@@ -283,7 +290,7 @@ void GraphView::paintEvent(QPaintEvent *) {
for (int j=0;j<sorted_keys.size();j++) {
const EffectKeyframe& key = field->keyframes.at(sorted_keys.at(j));
int key_x = get_screen_x(key.time);
int key_x = get_screen_x(key.time);
int key_y = get_screen_y(key.data.toDouble());
if (key.type == EFFECT_KEYFRAME_BEZIER) {
@@ -316,7 +323,7 @@ void GraphView::paintEvent(QPaintEvent *) {
// draw playhead
p.setPen(Qt::red);
int playhead_x = get_screen_x(panel_sequence_viewer->seq->playhead - visible_in);
int playhead_x = qRound((double(panel_sequence_viewer->seq->playhead - visible_in)*zoom) - x_scroll);
p.drawLine(playhead_x, 0, playhead_x, height());
if (rect_select) {
@@ -362,7 +369,7 @@ void GraphView::mousePressEvent(QMouseEvent *event) {
if (field->type == EFFECT_FIELD_DOUBLE && field_visibility.at(i)) {
for (int j=0;j<field->keyframes.size();j++) {
const EffectKeyframe& key = field->keyframes.at(j);
int key_x = get_screen_x(key.time);
int key_x = get_screen_x(key.time);
int key_y = get_screen_y(key.data.toDouble());
if (event->pos().x() > key_x-KEYFRAME_SIZE
&& event->pos().x() < key_x+KEYFRAME_SIZE
@@ -544,7 +551,7 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) {
for (int i=0;i<row->fieldCount();i++) {
for (int j=0;j<row->field(i)->keyframes.size();j++) {
const EffectKeyframe& key = row->field(i)->keyframes.at(j);
int key_x = get_screen_x(key.time);
int key_x = get_screen_x(key.time);
int key_y = get_screen_y(key.data.toDouble());
QRect test_rect(
key_x - KEYFRAME_SIZE,
@@ -812,11 +819,14 @@ void GraphView::set_scroll_y(int s) {
void GraphView::set_zoom(double z) {
zoom = z;
emit zoom_changed(zoom);
emit zoom_changed(zoom);
}
int GraphView::get_screen_x(double d) {
return qRound((d*zoom) - x_scroll);
if (row != nullptr) {
d -= row->parent_effect->parent_clip->clip_in;
}
return qRound((d*zoom) - x_scroll);
}
int GraphView::get_screen_y(double d) {
@@ -824,7 +834,11 @@ int GraphView::get_screen_y(double d) {
}
long GraphView::get_value_x(int i) {
return qRound((i + x_scroll)/zoom);
long frame = qRound((i + x_scroll)/zoom);
if (row != nullptr) {
frame += row->parent_effect->parent_clip->clip_in;
}
return frame;
}
double GraphView::get_value_y(int i) {
+7
View File
@@ -1,9 +1,11 @@
#include "keyframedrawing.h"
#include "project/effect.h"
#include "project/clip.h"
#define KEYFRAME_POINT_COUNT 4
// routine for drawing a keyframe onscreen
void draw_keyframe(QPainter &p, int type, int x, int y, bool darker, int r, int g, int b) {
if (darker) {
r *= 0.625;
@@ -30,3 +32,8 @@ void draw_keyframe(QPainter &p, int type, int x, int y, bool darker, int r, int
p.setBrush(Qt::NoBrush);
}
// adjusts keyframe's internal time (in clip time) to timeline time
long adjust_row_keyframe(EffectRow* row, long time, long visible_in) {
return time-row->parent_effect->parent_clip->clip_in+(row->parent_effect->parent_clip->timeline_in-visible_in);
}
+3
View File
@@ -6,6 +6,9 @@
#define KEYFRAME_SIZE 6
#define KEYFRAME_COLOR 160
class EffectRow;
void draw_keyframe(QPainter &p, int type, int x, int y, bool darker, int r = KEYFRAME_COLOR, int g = KEYFRAME_COLOR, int b = KEYFRAME_COLOR);
long adjust_row_keyframe(EffectRow* row, long time, long visible_in);
#endif // KEYFRAMEDRAWING_H
+2 -6
View File
@@ -23,10 +23,6 @@
#include <QtMath>
#include <QMenu>
long KeyframeView::adjust_row_keyframe(EffectRow* row, long time) {
return time-row->parent_effect->parent_clip->clip_in+(row->parent_effect->parent_clip->timeline_in-visible_in);
}
KeyframeView::KeyframeView(QWidget *parent) :
QWidget(parent),
visible_in(0),
@@ -113,7 +109,7 @@ void KeyframeView::paintEvent(QPaintEvent*) {
for (int k=0;k<f->keyframes.size();k++) {
if (!key_times.contains(f->keyframes.at(k).time)) {
bool keyframe_selected = keyframeIsSelected(f, k);
long keyframe_frame = adjust_row_keyframe(row, f->keyframes.at(k).time);
long keyframe_frame = adjust_row_keyframe(row, f->keyframes.at(k).time, visible_in);
// see if any other keyframes have this time
int appearances = 0;
@@ -337,7 +333,7 @@ void KeyframeView::mouseMoveEvent(QMouseEvent* event) {
for (int k=0;k<row->fieldCount();k++) {
EffectField* field = row->field(k);
for (int j=0;j<field->keyframes.size();j++) {
long keyframe_frame = adjust_row_keyframe(row, field->keyframes.at(j).time);
long keyframe_frame = adjust_row_keyframe(row, field->keyframes.at(j).time, visible_in);
if (!keyframeIsSelected(field, j) && keyframe_frame >= min_frame && keyframe_frame <= max_frame) {
selected_fields.append(field);
selected_keyframes.append(j);
-1
View File
@@ -28,7 +28,6 @@ public slots:
void set_y_scroll(int);
void resize_move(double d);
private:
long adjust_row_keyframe(EffectRow* row, long time);
QVector<EffectField*> selected_fields;
QVector<int> selected_keyframes;
QVector<int> rowY;