diff --git a/effects/effect.cpp b/effects/effect.cpp index 8b0f9685c..6495aa73a 100644 --- a/effects/effect.cpp +++ b/effects/effect.cpp @@ -1259,6 +1259,14 @@ QVariant EffectField::validate_keyframe_data(double timecode, bool async) { double progress; get_keyframe_data(timecode, before_keyframe, after_keyframe, progress); + int kf_type = (progress < 0.5) ? parent_row->keyframe_types.at(before_keyframe) : parent_row->keyframe_types.at(after_keyframe); + if (kf_type == KEYFRAME_TYPE_SMOOTH) { + double b = 4; + double c = 1.313; + double x = (b * progress) - (b*0.5); + progress = (c*(qPow(M_E, x)/(qPow(M_E, x) + 1)))-((c-1)*0.5); + } + const QVariant& before_data = keyframe_data.at(before_keyframe); switch (type) { case EFFECT_FIELD_DOUBLE: diff --git a/effects/effect.h b/effects/effect.h index cd58bfea8..bce0fafbc 100644 --- a/effects/effect.h +++ b/effects/effect.h @@ -73,6 +73,10 @@ extern QMutex effects_loaded; #define EFFECT_INTERNAL_LOGARITHMICFADE 11 #define EFFECT_INTERNAL_COUNT 12 +#define KEYFRAME_TYPE_LINEAR 0 +#define KEYFRAME_TYPE_SMOOTH 1 +#define KEYFRAME_TYPE_BEZIER 2 + #define TRAN_TYPE_OPEN 1 #define TRAN_TYPE_CLOSE 2 #define TRAN_TYPE_OPENWLINK 3 diff --git a/ui/keyframeview.cpp b/ui/keyframeview.cpp index 184c306ea..c17a7c76d 100644 --- a/ui/keyframeview.cpp +++ b/ui/keyframeview.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #define KEYFRAME_SIZE 6 #define KEYFRAME_POINT_COUNT 4 @@ -37,6 +38,32 @@ KeyframeView::KeyframeView(QWidget *parent) : { setFocusPolicy(Qt::ClickFocus); setMouseTracking(true); + + setContextMenuPolicy(Qt::CustomContextMenu); + connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(show_context_menu(const QPoint&))); +} + +void KeyframeView::show_context_menu(const QPoint& pos) { + if (selected_rows.size() > 0) { + QMenu menu(this); + QAction* linear = menu.addAction("Linear"); + linear->setData(KEYFRAME_TYPE_LINEAR); + QAction* smooth = menu.addAction("Smooth"); + smooth->setData(KEYFRAME_TYPE_SMOOTH); + /*QAction* bezier = menu.addAction("Bezier"); + bezier->setData(KEYFRAME_TYPE_BEZIER);*/ + connect(&menu, SIGNAL(triggered(QAction*)), this, SLOT(menu_set_key_type(QAction*))); + menu.exec(mapToGlobal(pos)); + } +} + +void KeyframeView::menu_set_key_type(QAction* a) { + ComboAction* ca = new ComboAction(); + for (int i=0;iappend(new SetInt(&selected_rows.at(i)->keyframe_types[selected_keyframes.at(i)], a->data().toInt())); + } + undo_stack.push(ca); + update(); } void KeyframeView::paintEvent(QPaintEvent*) { @@ -71,7 +98,7 @@ void KeyframeView::paintEvent(QPaintEvent*) { bool keyframe_selected = keyframeIsSelected(row, k); long keyframe_frame = adjust_row_keyframe(row, row->keyframe_times.at(k)); if (dragging && keyframe_selected) keyframe_frame += frame_diff; - draw_keyframe(p, getScreenPointFromFrame(panel_effect_controls->zoom, keyframe_frame) - x_scroll, keyframe_y, keyframe_selected); + draw_keyframe(p, row->keyframe_types.at(k), getScreenPointFromFrame(panel_effect_controls->zoom, keyframe_frame) - x_scroll, keyframe_y, keyframe_selected); } rows.append(row); @@ -144,12 +171,22 @@ void KeyframeView::set_y_scroll(int s) { update(); } -void KeyframeView::draw_keyframe(QPainter &p, int x, int y, bool darker) { - QPoint points[KEYFRAME_POINT_COUNT] = {QPoint(x-KEYFRAME_SIZE, y), QPoint(x, y-KEYFRAME_SIZE), QPoint(x+KEYFRAME_SIZE, y), QPoint(x, y+KEYFRAME_SIZE)}; +void KeyframeView::draw_keyframe(QPainter &p, int type, int x, int y, bool darker) { int color = (darker) ? 100 : 160; p.setPen(QColor(0, 0, 0)); p.setBrush(QColor(color, color, color)); - p.drawPolygon(points, KEYFRAME_POINT_COUNT); + + switch (type) { + case KEYFRAME_TYPE_LINEAR: + { + QPoint points[KEYFRAME_POINT_COUNT] = {QPoint(x-KEYFRAME_SIZE, y), QPoint(x, y-KEYFRAME_SIZE), QPoint(x+KEYFRAME_SIZE, y), QPoint(x, y+KEYFRAME_SIZE)}; + p.drawPolygon(points, KEYFRAME_POINT_COUNT); + } + break; + case KEYFRAME_TYPE_SMOOTH: + p.drawEllipse(QPoint(x, y), KEYFRAME_SIZE, KEYFRAME_SIZE); + break; + } } void KeyframeView::mousePressEvent(QMouseEvent *event) { diff --git a/ui/keyframeview.h b/ui/keyframeview.h index ec22b503e..cfaebc419 100644 --- a/ui/keyframeview.h +++ b/ui/keyframeview.h @@ -34,7 +34,7 @@ private: void mouseMoveEvent(QMouseEvent* event); void mouseReleaseEvent(QMouseEvent *event); void paintEvent(QPaintEvent *event); - void draw_keyframe(QPainter& p, int x, int y, bool darker); + void draw_keyframe(QPainter& p, int type, int x, int y, bool darker); bool mousedown; bool dragging; bool keys_selected; @@ -51,6 +51,9 @@ private: int x_scroll; int y_scroll; +private slots: + void show_context_menu(const QPoint& pos); + void menu_set_key_type(QAction*); }; #endif // KEYFRAMEVIEW_H