]> git.sesse.net Git - kdenlive/blobdiff - src/rotoscoping/rotowidget.cpp
rotoscoping:
[kdenlive] / src / rotoscoping / rotowidget.cpp
index 44cbfe6045f6412f28031ac97e53bb3b86c60f16..3d120c38f14b580af4f863f662dc094daa8acca6 100644 (file)
@@ -88,6 +88,7 @@ RotoWidget::RotoWidget(QString data, Monitor *monitor, int in, int out, Timecode
     connect(m_keyframeWidget, SIGNAL(positionChanged(int)), this, SLOT(slotPositionChanged(int)));
     connect(m_keyframeWidget, SIGNAL(keyframeAdded(int)), this, SLOT(slotAddKeyframe(int)));
     connect(m_keyframeWidget, SIGNAL(keyframeRemoved(int)), this, SLOT(slotRemoveKeyframe(int)));
+    connect(m_keyframeWidget, SIGNAL(keyframeMoved(int,int)), this, SLOT(slotMoveKeyframe(int,int)));
     connect(m_scene, SIGNAL(addKeyframe()), this, SLOT(slotAddKeyframe()));
 
     slotPositionChanged(0, false);
@@ -193,7 +194,8 @@ void RotoWidget::slotPositionChanged(int pos, bool seek)
             QList <BPoint> p;
             qreal relPos = (pos - keyframe1) / (qreal)(keyframe2 - keyframe1 + 1);
 
-            for (int i = 0; i < p1.count(); ++i) {
+            int count = qMin(p1.count(), p2.count());
+            for (int i = 0; i < count; ++i) {
                 BPoint bp;
                 for (int j = 0; j < 3; ++j) {
                     if (p1.at(i)[j] != p2.at(i)[j])
@@ -276,4 +278,16 @@ void RotoWidget::slotRemoveKeyframe(int pos)
     slotPositionChanged(m_keyframeWidget->getPosition(), false);
 }
 
+void RotoWidget::slotMoveKeyframe(int oldPos, int newPos)
+{
+    if (m_data.canConvert(QVariant::Map)) {
+        QMap<QString, QVariant> map = m_data.toMap();
+        map[QString::number(newPos + m_in).rightJustified(qRound(log10((double)m_out)), '0')] = map.take(QString::number(oldPos + m_in).rightJustified(qRound(log10((double)m_out)), '0'));
+        m_data = QVariant(map);
+    }
+
+    slotPositionChanged(m_keyframeWidget->getPosition(), false);
+    emit valueChanged();
+}
+
 #include "rotowidget.moc"