]> git.sesse.net Git - kdenlive/commitdiff
first step in fixing keyframe issue
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 25 Jan 2010 21:22:36 +0000 (21:22 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 25 Jan 2010 21:22:36 +0000 (21:22 +0000)
svn path=/trunk/kdenlive/; revision=4248

src/abstractclipitem.cpp
src/abstractclipitem.h
src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp

index 6584428fb56d3526ae3f44886226740092981904..c9da1c326921faa3216b82911e3ef658ffcbbdc9 100644 (file)
@@ -381,7 +381,7 @@ double AbstractClipItem::keyFrameFactor() const
     return m_keyframeFactor;
 }
 
-void AbstractClipItem::addKeyFrame(const GenTime pos, const double value)
+int AbstractClipItem::addKeyFrame(const GenTime pos, const double value)
 {
     QRectF br = sceneBoundingRect();
     double maxh = 100.0 / br.height() / m_keyframeFactor;
@@ -391,6 +391,7 @@ void AbstractClipItem::addKeyFrame(const GenTime pos, const double value)
     m_keyframes[newpos] = newval;
     m_selectedKeyframe = newpos;
     update();
+    return newval;
 }
 
 bool AbstractClipItem::hasKeyFrames() const
index e49d0db7e456b95087479611761ec5e2748a2e47..fdc914381809617c23b94ae1f1b51eabc8858f1c 100644 (file)
@@ -46,7 +46,7 @@ public:
     virtual ~ AbstractClipItem();
     void updateSelectedKeyFrame();
     void updateKeyFramePos(const GenTime pos, const double value);
-    void addKeyFrame(const GenTime pos, const double value);
+    int addKeyFrame(const GenTime pos, const double value);
     bool hasKeyFrames() const;
     int selectedKeyFramePos() const;
     double selectedKeyFrameValue() const;
index 1aa2b203dcbd674b8ffb9a69edc65ad7d9c08e57..7c6cac2b976c476bb55a54a4c29843b530ff78fe 100644 (file)
@@ -190,7 +190,7 @@ void ClipItem::initEffect(QDomElement effect, int diff)
             // Effect has a keyframe type parameter, we need to set the values
             if (e.attribute("keyframes").isEmpty()) {
                 e.setAttribute("keyframes", QString::number(cropStart().frames(m_fps)) + ':' + def + ';' + QString::number((cropStart() + cropDuration()).frames(m_fps) - 1) + ':' + def);
-                //kDebug() << "///// EFFECT KEYFRAMES INITED: " << e.attribute("keyframes");
+                kDebug() << "///// EFFECT KEYFRAMES INITED: " << e.attribute("keyframes");
                 //break;
             }
         }
@@ -1628,5 +1628,32 @@ bool ClipItem::isVideoOnly() const
     return m_videoOnly;
 }
 
+void ClipItem::insertKeyframe(QDomElement effect, const int pos, const int val)
+{
+    if (effect.attribute("disabled") == "1") return;
+    QDomNodeList params = effect.elementsByTagName("parameter");
+    for (int i = 0; i < params.count(); i++) {
+        QDomElement e = params.item(i).toElement();
+        QString kfr = e.attribute("keyframes");
+        const QStringList keyframes = kfr.split(';', QString::SkipEmptyParts);
+        QStringList newkfr;
+        bool added = false;
+        foreach(const QString &str, keyframes) {
+            int kpos = str.section(':', 0, 0).toInt();
+            double newval = str.section(':', 1, 1).toDouble();
+            if (kpos < pos) {
+                newkfr.append(str);
+            } else if (!added) {
+                if (i == 0) newkfr.append(QString::number(pos) + ":" + QString::number(val));
+                else newkfr.append(QString::number(pos) + ":" + QString::number(newval));
+                if (kpos > pos) newkfr.append(str);
+                added = true;
+            } else newkfr.append(str);
+        }
+        if (!added) newkfr.append(QString::number(pos) + ":" + QString::number(val));
+        e.setAttribute("keyframes", newkfr.join(";"));
+        kDebug() << "insert kfr: " << newkfr.join(";");
+    }
+}
 
 #include "clipitem.moc"
index 0998eccb71b632c0290031f9995ccee00102546f..d55c659d95dfeade51837e9b065da6350006dff9 100644 (file)
@@ -116,6 +116,7 @@ public:
     bool isAudioOnly() const;
     /** Called when clip start is resized, adjust keyframes values */
     bool checkEffectsKeyframesPos(const int previous, const int current, bool fromStart);
+    void insertKeyframe(QDomElement effect, const int pos, const int val);
 
 protected:
     //virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * event);
index 607f1a75e87343c111443ffcd3268a609d4b77b6..07965765e02d8040a1f6f6f8c2f8150abad7e58e 100644 (file)
@@ -1171,6 +1171,7 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event)
     if (m_dragItem && m_dragItem->hasKeyFrames()) {
         if (m_moveOpMode == KEYFRAME) {
             // user double clicked on a keyframe, open edit dialog
+            //TODO: update for effects with several values per keyframe
             QDialog d(parentWidget());
             Ui::KeyFrameDialog_UI view;
             view.setupUi(&d);
@@ -1193,10 +1194,11 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event)
         } else  {
             // add keyframe
             GenTime keyFramePos = GenTime((int)(mapToScene(event->pos()).x()), m_document->fps()) - m_dragItem->startPos() + m_dragItem->cropStart();
-            m_dragItem->addKeyFrame(keyFramePos, mapToScene(event->pos()).toPoint().y());
+            int val = m_dragItem->addKeyFrame(keyFramePos, mapToScene(event->pos()).toPoint().y());
             ClipItem * item = static_cast <ClipItem *>(m_dragItem);
             QString previous = item->keyframes(item->selectedEffectIndex());
-            item->updateKeyframeEffect();
+            item->insertKeyframe(item->getEffectAt(item->selectedEffectIndex()), keyFramePos.frames(m_document->fps()), val);
+            //item->updateKeyframeEffect();
             QString next = item->keyframes(item->selectedEffectIndex());
             EditKeyFrameCommand *command = new EditKeyFrameCommand(this, m_dragItem->track(), m_dragItem->startPos(), item->selectedEffectIndex(), previous, next, false);
             m_commandStack->push(command);