]> git.sesse.net Git - kdenlive/blobdiff - src/rotoscoping/rotowidget.cpp
rotoscoping:
[kdenlive] / src / rotoscoping / rotowidget.cpp
index 3d557007a72598425ceadff7de3e8ff5cdff68dd..3d120c38f14b580af4f863f662dc094daa8acca6 100644 (file)
@@ -43,7 +43,7 @@ RotoWidget::RotoWidget(QString data, Monitor *monitor, int in, int out, Timecode
         m_pos(0)
 {
     QVBoxLayout *l = new QVBoxLayout(this);
-    m_keyframeWidget = new SimpleKeyframeWidget(t, in, out, this);
+    m_keyframeWidget = new SimpleKeyframeWidget(t, m_out - m_in - 1, this);
     l->addWidget(m_keyframeWidget);
 
     MonitorEditWidget *edit = monitor->getEffectEdit();
@@ -63,16 +63,16 @@ RotoWidget::RotoWidget(QString data, Monitor *monitor, int in, int out, Timecode
         QMap <QString, QVariant> map = m_data.toMap();
         QMap <QString, QVariant>::const_iterator i = map.constBegin();
         while (i != map.constEnd()) {
-            keyframes.append(i.key().toInt());
+            keyframes.append(i.key().toInt() - m_in);
             ++i;
         }
         m_keyframeWidget->setKeyframes(keyframes);
 
         for (int j = 0; j < keyframes.count(); ++j) {
             // key might already be justified
-            if (map.contains(QString::number(keyframes.at(j)))) {
-                QVariant value = map.take(QString::number(keyframes.at(j)));
-                map[QString::number(keyframes.at(j)).rightJustified(qRound(log10((double)m_out)), '0')] = value;
+            if (map.contains(QString::number(keyframes.at(j) + m_in))) {
+                QVariant value = map.take(QString::number(keyframes.at(j) + m_in));
+                map[QString::number(keyframes.at(j) + m_in).rightJustified(qRound(log10((double)m_out)), '0')] = value;
             }
         }
         m_data = QVariant(map);
@@ -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);
@@ -148,7 +149,7 @@ void RotoWidget::slotUpdateData(int pos, bool editing)
 
     if (m_data.canConvert(QVariant::Map)) {
         QMap <QString, QVariant> map = m_data.toMap();
-        map[QString::number(pos < 0 ? m_keyframeWidget->getPosition() : pos).rightJustified(qRound(log10((double)m_out)), '0')] = QVariant(vlist);
+        map[QString::number((pos < 0 ? m_keyframeWidget->getPosition() : pos) + m_in).rightJustified(qRound(log10((double)m_out)), '0')] = QVariant(vlist);
         m_data = QVariant(map);
     } else {
         m_data = QVariant(vlist);
@@ -175,6 +176,8 @@ void RotoWidget::slotPositionChanged(int pos, bool seek)
 
     m_keyframeWidget->slotSetPosition(pos, false);
 
+    pos += m_in;
+
     if (m_data.canConvert(QVariant::Map)) {
         QMap <QString, QVariant> map = m_data.toMap();
         QMap <QString, QVariant>::const_iterator i = map.constBegin();
@@ -191,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])
@@ -217,7 +221,7 @@ void RotoWidget::slotPositionChanged(int pos, bool seek)
     }
 
     if (seek)
-        emit seekToPos(pos);
+        emit seekToPos(pos - m_in);
 }
 
 QList <BPoint> RotoWidget::getPoints(int keyframe)
@@ -266,7 +270,7 @@ void RotoWidget::slotRemoveKeyframe(int pos)
     if (!m_data.canConvert(QVariant::Map) || m_data.toMap().count() < 2)
         return;
 
-    m_data.toMap().remove(QString::number(pos).rightJustified(qRound(log10((double)m_out)), '0'));
+    m_data.toMap().remove(QString::number(pos - m_in).rightJustified(qRound(log10((double)m_out)), '0'));
 
     if (m_data.toMap().count() == 1)
         m_data = m_data.toMap().begin().value();
@@ -274,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"