]> git.sesse.net Git - kdenlive/commitdiff
rotoscoping: Fix keyframes with crop from start > 0
authorTill Theato <root@ttill.de>
Fri, 18 Feb 2011 20:08:06 +0000 (20:08 +0000)
committerTill Theato <root@ttill.de>
Fri, 18 Feb 2011 20:08:06 +0000 (20:08 +0000)
svn path=/trunk/kdenlive/; revision=5424

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

index 3d557007a72598425ceadff7de3e8ff5cdff68dd..44cbfe6045f6412f28031ac97e53bb3b86c60f16 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);
@@ -148,7 +148,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 +175,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();
@@ -217,7 +219,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 +268,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();
index 47ad20e8ba14a77667901bd28a38efd81d282298..9221549ad5c4c81ffb3d8a6885d047a81759290d 100644 (file)
@@ -26,7 +26,7 @@
 #include <KIcon>
 #include <KLocale>
 
-SimpleKeyframeWidget::SimpleKeyframeWidget(Timecode t, int in, int out, QWidget *parent) :
+SimpleKeyframeWidget::SimpleKeyframeWidget(Timecode t, int duration, QWidget *parent) :
         QWidget(parent)
 {
     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
@@ -34,7 +34,7 @@ SimpleKeyframeWidget::SimpleKeyframeWidget(Timecode t, int in, int out, QWidget
     QGridLayout *l = new QGridLayout(this);
 
     m_timeline = new SimpleTimelineWidget(this);
-    m_timeline->setRange(in ,out);
+    m_timeline->setDuration(duration);
 
     m_buttonAddDelete = new QToolButton(this);
     m_buttonAddDelete->setAutoRaise(true);
@@ -52,7 +52,7 @@ SimpleKeyframeWidget::SimpleKeyframeWidget(Timecode t, int in, int out, QWidget
     m_buttonNext->setToolTip(i18n("Go to next keyframe"));
 
     m_time = new TimecodeDisplay(t, this);
-    m_time->setRange(in, out);
+    m_time->setRange(0, duration);
 
     l->addWidget(m_timeline, 0, 0, 1, -1);
     l->addWidget(m_buttonPrevious, 1, 0);
index f4c45bb8cbad6d6c475c2c0e60e79989ffb858d4..fb1d500d395e790ebb064b727aa2b4d2e055ffc7 100644 (file)
@@ -34,7 +34,7 @@ class SimpleKeyframeWidget : public QWidget
     Q_OBJECT
 
 public:
-    SimpleKeyframeWidget(Timecode t, int in, int out, QWidget* parent = 0);
+    SimpleKeyframeWidget(Timecode t, int duration, QWidget* parent = 0);
     virtual ~SimpleKeyframeWidget();
 
     int getPosition();
index 9838005acbcf12954bd956f6554373f17980f513..fd8b85f38274d37021ed2ede3fac55f0d41b828f 100644 (file)
@@ -24,8 +24,7 @@
 
 SimpleTimelineWidget::SimpleTimelineWidget(QWidget* parent) :
         QWidget(parent),
-        m_min(0),
-        m_max(1),
+        m_duration(1),
         m_position(0),
         m_currentKeyframe(-1),
         m_currentKeyframeOriginal(-1),
@@ -82,10 +81,9 @@ void SimpleTimelineWidget::slotRemoveKeyframe(int pos)
     emit keyframeRemoved(pos);
 }
 
-void SimpleTimelineWidget::setRange(int min, int max)
+void SimpleTimelineWidget::setDuration(int dur)
 {
-    m_min = min;
-    m_max = max;
+    m_duration = dur;
 }
 
 void SimpleTimelineWidget::slotGoToNext()
@@ -99,8 +97,8 @@ void SimpleTimelineWidget::slotGoToNext()
     }
 
     // no keyframe after current position
-    slotSetPosition(m_max);
-    emit positionChanged(m_max);
+    slotSetPosition(m_duration);
+    emit positionChanged(m_duration);
 }
 
 void SimpleTimelineWidget::slotGoToPrev()
@@ -114,14 +112,14 @@ void SimpleTimelineWidget::slotGoToPrev()
     }
 
     // no keyframe before current position
-    slotSetPosition(m_min);
-    emit positionChanged(m_min);
+    slotSetPosition(0);
+    emit positionChanged(0);
 }
 
 void SimpleTimelineWidget::mousePressEvent(QMouseEvent* event)
 {
+    int pos = (event->x() - 5) / m_scale;
     if (qAbs(event->y() - m_lineHeight) < m_lineHeight / 5. && event->button() == Qt::LeftButton)  {
-        int pos = (event->x() - 5) / m_scale;
         foreach(const int &keyframe, m_keyframes) {
             if (qAbs(keyframe - pos) < 5) {
                 m_currentKeyframeOriginal = keyframe;
@@ -134,15 +132,15 @@ void SimpleTimelineWidget::mousePressEvent(QMouseEvent* event)
 
     // no keyframe next to mouse
     m_currentKeyframe = m_currentKeyframeOriginal = -1;
-    m_position = (event->x() - 5) / m_scale;
-    emit positionChanged(m_position);
+    m_position = pos;
+    emit positionChanged(pos);
     update();
 }
 
 void SimpleTimelineWidget::mouseMoveEvent(QMouseEvent* event)
 {
     if (event->buttons() & Qt::LeftButton) {
-        int pos = qBound(m_min, (int)((event->x() - 5) / m_scale), m_max);
+        int pos = qBound(0, (int)((event->x() - 5) / m_scale), m_duration);
         if (m_currentKeyframe >= 0) {
             m_currentKeyframe = pos;
             emit keyframeMoving(m_currentKeyframeOriginal, m_currentKeyframe);
@@ -168,10 +166,10 @@ void SimpleTimelineWidget::wheelEvent(QWheelEvent* event)
 {
     int change = event->delta() < 0 ? -1 : 1;
     if (m_currentKeyframe > 0) {
-        m_currentKeyframe = qBound(m_min, m_currentKeyframe + change, m_max);
+        m_currentKeyframe = qBound(0, m_currentKeyframe + change, m_duration);
         emit keyframeMoved(m_currentKeyframeOriginal, m_currentKeyframe);
     } else {
-        m_position = qBound(m_min, m_position + change, m_max);
+        m_position = qBound(0, m_position + change, m_duration);
         emit positionChanged(m_position);
     }
     update();
@@ -182,7 +180,7 @@ void SimpleTimelineWidget::paintEvent(QPaintEvent* event)
     QPainter p(this);
     int min = 5;
     int max = width() - 6;
-    m_scale = (max - min) / (double)(m_max - m_min);
+    m_scale = (max - min) / (double)(m_duration);
     p.translate(min, m_lineHeight);
 
     p.setPen(QPen(palette().foreground().color(), 1, Qt::SolidLine));
index 864b028358f4d18c0887ea02ed568b9425477eb4..d13641e28257f4064bbdd231476dea2aae7ea139 100644 (file)
@@ -29,7 +29,7 @@ class SimpleTimelineWidget : public QWidget
 public:
     SimpleTimelineWidget(QWidget* parent = 0);
     void setKeyframes(QList <int> keyframes);
-    void setRange(int min, int max);
+    void setDuration(int dur);
 
 public slots:
     void slotSetPosition(int pos);
@@ -47,8 +47,7 @@ protected:
     void wheelEvent(QWheelEvent *event);
 
 private:
-    int m_min;
-    int m_max;
+    int m_duration;
     int m_position;
     int m_currentKeyframe;
     int m_currentKeyframeOriginal;