]> git.sesse.net Git - kdenlive/commitdiff
rotoscoping: fix keyframe insertion between two existing keyframes
authorTill Theato <root@ttill.de>
Sun, 13 Feb 2011 19:54:27 +0000 (19:54 +0000)
committerTill Theato <root@ttill.de>
Sun, 13 Feb 2011 19:54:27 +0000 (19:54 +0000)
svn path=/trunk/kdenlive/; revision=5401

src/rotoscoping/rotowidget.cpp
src/simplekeyframes/simpletimelinewidget.cpp

index b58d370f3908301d99e9f15e70c393c3997c934e..3d557007a72598425ceadff7de3e8ff5cdff68dd 100644 (file)
 #include "simplekeyframes/simplekeyframewidget.h"
 #include "kdenlivesettings.h"
 
 #include "simplekeyframes/simplekeyframewidget.h"
 #include "kdenlivesettings.h"
 
+#include <math.h>
+
 #include <qjson/parser.h>
 #include <qjson/serializer.h>
 
 #include <QVBoxLayout>
 
 #include <qjson/parser.h>
 #include <qjson/serializer.h>
 
 #include <QVBoxLayout>
 
-#include <KDebug>
-
 
 RotoWidget::RotoWidget(QString data, Monitor *monitor, int in, int out, Timecode t, QWidget* parent) :
         QWidget(parent),
 
 RotoWidget::RotoWidget(QString data, Monitor *monitor, int in, int out, Timecode t, QWidget* parent) :
         QWidget(parent),
@@ -67,6 +67,15 @@ RotoWidget::RotoWidget(QString data, Monitor *monitor, int in, int out, Timecode
             ++i;
         }
         m_keyframeWidget->setKeyframes(keyframes);
             ++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;
+            }
+        }
+        m_data = QVariant(map);
     } else {
         m_keyframeWidget->setKeyframes(QList <int>() << 0);
     }
     } else {
         m_keyframeWidget->setKeyframes(QList <int>() << 0);
     }
@@ -139,7 +148,7 @@ void RotoWidget::slotUpdateData(int pos, bool editing)
 
     if (m_data.canConvert(QVariant::Map)) {
         QMap <QString, QVariant> map = m_data.toMap();
 
     if (m_data.canConvert(QVariant::Map)) {
         QMap <QString, QVariant> map = m_data.toMap();
-        map[QString::number(pos < 0 ? m_keyframeWidget->getPosition() : pos)] = QVariant(vlist);
+        map[QString::number(pos < 0 ? m_keyframeWidget->getPosition() : pos).rightJustified(qRound(log10((double)m_out)), '0')] = QVariant(vlist);
         m_data = QVariant(map);
     } else {
         m_data = QVariant(vlist);
         m_data = QVariant(map);
     } else {
         m_data = QVariant(vlist);
@@ -218,7 +227,7 @@ QList <BPoint> RotoWidget::getPoints(int keyframe)
     QList <BPoint> points;
     QList <QVariant> data;
     if (keyframe >= 0)
     QList <BPoint> points;
     QList <QVariant> data;
     if (keyframe >= 0)
-        data = m_data.toMap()[QString::number(keyframe)].toList();
+        data = m_data.toMap()[QString::number(keyframe).rightJustified(qRound(log10((double)m_out)), '0')].toList();
     else
         data = m_data.toList();
     foreach (const QVariant &bpoint, data) {
     else
         data = m_data.toList();
     foreach (const QVariant &bpoint, data) {
@@ -237,7 +246,7 @@ void RotoWidget::slotAddKeyframe(int pos)
     if (!m_data.canConvert(QVariant::Map)) {
         QVariant data = m_data;
         QMap<QString, QVariant> map;
     if (!m_data.canConvert(QVariant::Map)) {
         QVariant data = m_data;
         QMap<QString, QVariant> map;
-        map[QString::number(m_in)] = data;
+        map[QString::number(m_in).rightJustified(qRound(log10((double)m_out)), '0')] = data;
         m_data = QVariant(map);
     }
 
         m_data = QVariant(map);
     }
 
@@ -257,7 +266,7 @@ void RotoWidget::slotRemoveKeyframe(int pos)
     if (!m_data.canConvert(QVariant::Map) || m_data.toMap().count() < 2)
         return;
 
     if (!m_data.canConvert(QVariant::Map) || m_data.toMap().count() < 2)
         return;
 
-    m_data.toMap().remove(QString::number(pos));
+    m_data.toMap().remove(QString::number(pos).rightJustified(qRound(log10((double)m_out)), '0'));
 
     if (m_data.toMap().count() == 1)
         m_data = m_data.toMap().begin().value();
 
     if (m_data.toMap().count() == 1)
         m_data = m_data.toMap().begin().value();
index f5621869744a56efc26c9be53fa3e939dde9d2a0..9838005acbcf12954bd956f6554373f17980f513 100644 (file)
@@ -40,6 +40,7 @@ SimpleTimelineWidget::SimpleTimelineWidget(QWidget* parent) :
 void SimpleTimelineWidget::setKeyframes(QList <int> keyframes)
 {
     m_keyframes = keyframes;
 void SimpleTimelineWidget::setKeyframes(QList <int> keyframes)
 {
     m_keyframes = keyframes;
+    qSort(m_keyframes);
     m_currentKeyframe = m_currentKeyframeOriginal = -1;
     update();
 }
     m_currentKeyframe = m_currentKeyframeOriginal = -1;
     update();
 }
@@ -56,6 +57,7 @@ void SimpleTimelineWidget::slotAddKeyframe(int pos, int select)
         pos = m_position;
 
     m_keyframes.append(pos);
         pos = m_position;
 
     m_keyframes.append(pos);
+    qSort(m_keyframes);
     if (select)
         m_currentKeyframe = m_currentKeyframeOriginal = pos;
     update();
     if (select)
         m_currentKeyframe = m_currentKeyframeOriginal = pos;
     update();