made graph editor timeline-based rather than clip based, fixes #438
This commit is contained in:
+22
-8
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user