X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsimplekeyframes%2Fsimpletimelinewidget.cpp;h=ab181e0b99b9420108a88fb1d90b3af7e2414b5d;hb=662a80165046655e809262812fab4ae30dc536e3;hp=25dc36931db5f4d26063cedc95038984468ff716;hpb=3af8852c671bb7a87d399a303c42a520824812e5;p=kdenlive diff --git a/src/simplekeyframes/simpletimelinewidget.cpp b/src/simplekeyframes/simpletimelinewidget.cpp index 25dc3693..ab181e0b 100644 --- a/src/simplekeyframes/simpletimelinewidget.cpp +++ b/src/simplekeyframes/simpletimelinewidget.cpp @@ -52,13 +52,17 @@ void SimpleTimelineWidget::setKeyframes(QList keyframes) m_keyframes = keyframes; qSort(m_keyframes); m_currentKeyframe = m_currentKeyframeOriginal = -1; + emit atKeyframe(m_keyframes.contains(m_position)); update(); } void SimpleTimelineWidget::slotSetPosition(int pos) { - m_position = pos; - update(); + if (pos != m_position) { + m_position = pos; + emit atKeyframe(m_keyframes.contains(m_position)); + update(); + } } void SimpleTimelineWidget::slotAddKeyframe(int pos, int select) @@ -73,6 +77,8 @@ void SimpleTimelineWidget::slotAddKeyframe(int pos, int select) update(); emit keyframeAdded(pos); + if (pos == m_position) + emit atKeyframe(true); } void SimpleTimelineWidget::slotAddRemove() @@ -90,6 +96,8 @@ void SimpleTimelineWidget::slotRemoveKeyframe(int pos) m_currentKeyframe = m_currentKeyframeOriginal = -1; update(); emit keyframeRemoved(pos); + if (pos == m_position) + emit atKeyframe(false); } void SimpleTimelineWidget::setDuration(int dur) @@ -99,10 +107,14 @@ void SimpleTimelineWidget::setDuration(int dur) void SimpleTimelineWidget::slotGoToNext() { + if (m_position == m_duration) + return; + foreach (const int &keyframe, m_keyframes) { if (keyframe > m_position) { slotSetPosition(keyframe); emit positionChanged(keyframe); + emit atKeyframe(true); return; } } @@ -110,14 +122,19 @@ void SimpleTimelineWidget::slotGoToNext() // no keyframe after current position slotSetPosition(m_duration); emit positionChanged(m_duration); + emit atKeyframe(false); } void SimpleTimelineWidget::slotGoToPrev() { + if (m_position == 0) + return; + for (int i = m_keyframes.count() - 1; i >= 0; --i) { if (m_keyframes.at(i) < m_position) { slotSetPosition(m_keyframes.at(i)); emit positionChanged(m_keyframes.at(i)); + emit atKeyframe(true); return; } } @@ -125,6 +142,7 @@ void SimpleTimelineWidget::slotGoToPrev() // no keyframe before current position slotSetPosition(0); emit positionChanged(0); + emit atKeyframe(false); } void SimpleTimelineWidget::mousePressEvent(QMouseEvent* event) @@ -146,6 +164,7 @@ void SimpleTimelineWidget::mousePressEvent(QMouseEvent* event) m_currentKeyframe = m_currentKeyframeOriginal = -1; m_position = pos; emit positionChanged(pos); + emit atKeyframe(m_keyframes.contains(pos)); update(); } @@ -162,10 +181,12 @@ void SimpleTimelineWidget::mouseMoveEvent(QMouseEvent* event) m_keyframes[m_keyframes.indexOf(m_currentKeyframe)] = pos; m_currentKeyframe = pos; emit keyframeMoving(m_currentKeyframeOriginal, m_currentKeyframe); + emit atKeyframe(m_keyframes.contains(m_position)); } } else { m_position = pos; emit positionChanged(pos); + emit atKeyframe(m_keyframes.contains(pos)); } update(); return; @@ -199,16 +220,44 @@ void SimpleTimelineWidget::mouseReleaseEvent(QMouseEvent* event) } } +void SimpleTimelineWidget::mouseDoubleClickEvent(QMouseEvent* event) +{ + if (event->button() == Qt::LeftButton && event->y() < m_lineHeight) { + int pos = qBound(0, (int)(event->x() / m_scale), m_duration); + foreach(const int &keyframe, m_keyframes) { + if (qAbs(keyframe - pos) < 5) { + m_keyframes.removeAll(keyframe); + if (keyframe == m_currentKeyframe) + m_currentKeyframe = m_currentKeyframeOriginal = -1; + emit keyframeRemoved(keyframe); + if (keyframe == m_position) + emit atKeyframe(false); + return; + } + } + + // add new keyframe + m_keyframes.append(pos); + qSort(m_keyframes); + emit keyframeAdded(pos); + if (pos == m_position) + emit atKeyframe(true); + } else { + QWidget::mouseDoubleClickEvent(event); + } +} + void SimpleTimelineWidget::wheelEvent(QWheelEvent* event) { int change = event->delta() < 0 ? -1 : 1; - if (m_currentKeyframe > 0) { + /*if (m_currentKeyframe > 0) { m_currentKeyframe = qBound(0, m_currentKeyframe + change, m_duration); emit keyframeMoved(m_currentKeyframeOriginal, m_currentKeyframe); - } else { + } else { */ m_position = qBound(0, m_position + change, m_duration); emit positionChanged(m_position); - } +// } + emit atKeyframe(m_keyframes.contains(m_position)); update(); }