#include "keyframeview.h" #include "effects/effect.h" #include "ui/collapsiblewidget.h" #include "panels/panels.h" #include "panels/effectcontrols.h" #include "project/clip.h" #include "panels/timeline.h" #include #include #define KEYFRAME_SIZE 6 #define KEYFRAME_POINT_COUNT 4 KeyframeView::KeyframeView(QWidget *parent) : QWidget(parent), mousedown(false), visible_in(0), visible_out(0) { setFocusPolicy(Qt::ClickFocus); setMouseTracking(true); } void KeyframeView::paintEvent(QPaintEvent*) { QPainter p(this); setMinimumWidth(getScreenPointFromFrame(panel_effect_controls->zoom, visible_out - visible_in)); rowY.clear(); rows.clear(); for (int i=0;icontainer->is_expanded()) { for (int j=0;jrow_count();j++) { EffectRow* row = e->row(j); QLabel* label = row->label; QWidget* contents = e->container->contents; int keyframe_y = label->y() + (label->height()>>1) + mapFrom(panel_effect_controls, contents->mapTo(panel_effect_controls, contents->pos())).y() - e->container->title_bar->height(); for (int k=0;kkeyframe_times.size();k++) { bool keyframe_selected = false; for (int l=0;lzoom, row->keyframe_times.at(k)-row->parent_effect->parent_clip->clip_in+(row->parent_effect->parent_clip->timeline_in-visible_in)), keyframe_y, keyframe_selected); } rows.append(row); rowY.append(keyframe_y); } } } if (rowY.size() > 0) { int playhead_x = getScreenPointFromFrame(panel_effect_controls->zoom, panel_timeline->playhead-visible_in); p.setPen(Qt::red); p.drawLine(playhead_x, 0, playhead_x, height()); } /*if (mouseover && mouseover_row < rowY.size()) { draw_keyframe(p, getScreenPointFromFrame(panel_effect_controls->zoom, mouseover_frame - visible_in), rowY.at(mouseover_row), true); }*/ } 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)}; int color = (darker) ? 100 : 160; p.setPen(QColor(0, 0, 0)); p.setBrush(QColor(color, color, color)); p.drawPolygon(points, KEYFRAME_POINT_COUNT); } void KeyframeView::mousePressEvent(QMouseEvent *event) { int row_index = -1; int keyframe_index = -1; long frame_diff = 0; long frame_min = getFrameFromScreenPoint(panel_effect_controls->zoom, event->x()-KEYFRAME_SIZE); long frame_mid = getFrameFromScreenPoint(panel_effect_controls->zoom, event->x()); long frame_max = getFrameFromScreenPoint(panel_effect_controls->zoom, event->x()+KEYFRAME_SIZE); for (int i=0;iy() > rowY.at(i)-KEYFRAME_SIZE-KEYFRAME_SIZE && event->y() < rowY.at(i)+KEYFRAME_SIZE+KEYFRAME_SIZE) { EffectRow* row = rows.at(i); for (int j=0;jkeyframe_times.size();j++) { long eval_keyframe_time = row->keyframe_times.at(j)-row->parent_effect->parent_clip->clip_in+(row->parent_effect->parent_clip->timeline_in-visible_in); if (eval_keyframe_time >= frame_min && eval_keyframe_time <= frame_max) { long eval_frame_diff = qAbs(eval_keyframe_time - frame_mid); if (keyframe_index == -1 || eval_frame_diff < frame_diff) { row_index = i; keyframe_index = j; frame_diff = eval_frame_diff; } } } break; } } bool already_selected = false; if (keyframe_index > -1) { for (int i=0;imodifiers() & Qt::ShiftModifier)) { selected_rows.clear(); selected_keyframes.clear(); } if (keyframe_index > -1) { selected_rows.append(row_index); selected_keyframes.append(keyframe_index); } } update(); mousedown = true; } void KeyframeView::mouseMoveEvent(QMouseEvent* event) { /*unsetCursor(); bool new_mo = false; for (int i=0;iy() > rowY.at(i)-KEYFRAME_SIZE-KEYFRAME_SIZE && event->y() < rowY.at(i)+KEYFRAME_SIZE+KEYFRAME_SIZE) { setCursor(Qt::CrossCursor); mouseover_frame = getFrameFromScreenPoint(panel_effect_controls->zoom, event->x()) + visible_in; mouseover_row = i; new_mo = true; break; } } if (new_mo || (new_mo != mouseover)) { update(); } mouseover = new_mo;*/ if (mousedown) { } } void KeyframeView::mouseReleaseEvent(QMouseEvent* event) { mousedown = false; }