From d804f7cfc0eb9fb7d62604593aabc3da8ee52483 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 7 Feb 2019 00:44:47 -0800 Subject: [PATCH] made graph editor timeline-based rather than clip based, fixes #438 --- ui/graphview.cpp | 30 ++++++++++++++++++++++-------- ui/keyframedrawing.cpp | 7 +++++++ ui/keyframedrawing.h | 3 +++ ui/keyframeview.cpp | 8 ++------ ui/keyframeview.h | 1 - 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/ui/graphview.cpp b/ui/graphview.cpp index c91a1d0c0..9f0d308cb 100644 --- a/ui/graphview.cpp +++ b/ui/graphview.cpp @@ -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;jkeyframes.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;jkeyframes.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;jkeyframes.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;ifieldCount();i++) { for (int j=0;jfield(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) { diff --git a/ui/keyframedrawing.cpp b/ui/keyframedrawing.cpp index 2621472b7..3e33b28d4 100644 --- a/ui/keyframedrawing.cpp +++ b/ui/keyframedrawing.cpp @@ -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); +} diff --git a/ui/keyframedrawing.h b/ui/keyframedrawing.h index c8c60e9e3..ae1ff7717 100644 --- a/ui/keyframedrawing.h +++ b/ui/keyframedrawing.h @@ -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 diff --git a/ui/keyframeview.cpp b/ui/keyframeview.cpp index 8cfb38f0c..3e5c4b77a 100644 --- a/ui/keyframeview.cpp +++ b/ui/keyframeview.cpp @@ -23,10 +23,6 @@ #include #include -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;kkeyframes.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;kfieldCount();k++) { EffectField* field = row->field(k); for (int j=0;jkeyframes.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); diff --git a/ui/keyframeview.h b/ui/keyframeview.h index 0d553861a..dc0719b88 100644 --- a/ui/keyframeview.h +++ b/ui/keyframeview.h @@ -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 selected_fields; QVector selected_keyframes; QVector rowY;