]> git.sesse.net Git - kdenlive/blobdiff - src/simplekeyframes/simpletimelinewidget.cpp
Const'ref
[kdenlive] / src / simplekeyframes / simpletimelinewidget.cpp
index 25dc36931db5f4d26063cedc95038984468ff716..8b9843c72d5ef6339facaf65a19700d193732e60 100644 (file)
@@ -47,18 +47,22 @@ SimpleTimelineWidget::SimpleTimelineWidget(QWidget* parent) :
     m_colKeyframeBg = scheme.shade(KColorScheme::MidShade);
 }
 
-void SimpleTimelineWidget::setKeyframes(QList <int> keyframes)
+void SimpleTimelineWidget::setKeyframes(const QList<int> &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();
 }