]> git.sesse.net Git - kdenlive/commitdiff
When resizing transition, update keyframes:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Fri, 25 Feb 2011 15:41:19 +0000 (15:41 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Fri, 25 Feb 2011 15:41:19 +0000 (15:41 +0000)
http://kdenlive.org/mantis/view.php?id=2035

svn path=/trunk/kdenlive/; revision=5460

src/customtrackview.cpp
src/transition.cpp
src/transition.h

index ad824c2382f40192dd1bd46b345e4dd8a882c484..a565702b0bf08be6661c0b7971527c910b2fcf5f 100644 (file)
@@ -4593,7 +4593,6 @@ void CustomTrackView::prepareResizeClipEnd(AbstractClipItem* item, ItemInfo oldI
         hasParentCommand = true;
     } else {
         command = new QUndoCommand();
-        command->setText(i18n("Resize clip end"));
     }
 
     // do this here, too, because otherwise undo won't update the group
@@ -4602,6 +4601,7 @@ void CustomTrackView::prepareResizeClipEnd(AbstractClipItem* item, ItemInfo oldI
 
     ItemInfo info = item->info();
     if (item->type() == AVWIDGET) {
+        if (!hasParentCommand) command->setText(i18n("Resize clip end"));
         ItemInfo resizeinfo = info;
         resizeinfo.track = m_document->tracksCount() - resizeinfo.track;
         bool success = m_document->renderer()->mltResizeClipEnd(resizeinfo, resizeinfo.cropDuration);
@@ -4670,6 +4670,7 @@ void CustomTrackView::prepareResizeClipEnd(AbstractClipItem* item, ItemInfo oldI
             emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
         }
     } else if (item->type() == TRANSITIONWIDGET) {
+        if (!hasParentCommand) command->setText(i18n("Resize transition end"));
         Transition *transition = static_cast <Transition *>(item);
         if (!m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - oldInfo.track), (int)(m_document->tracksCount() - oldInfo.track), transition->transitionEndTrack(), oldInfo.startPos, oldInfo.endPos, info.startPos, info.endPos)) {
             // Cannot resize transition
@@ -4678,9 +4679,14 @@ void CustomTrackView::prepareResizeClipEnd(AbstractClipItem* item, ItemInfo oldI
             KdenliveSettings::setSnaptopoints(true);
             emit displayMessage(i18n("Cannot resize transition"), ErrorMessage);
         } else {
-            MoveTransitionCommand *moveCommand = new MoveTransitionCommand(this, oldInfo, info, false, command);
-            if (command == NULL)
-                m_commandStack->push(moveCommand);
+            // Check transition keyframes
+            QDomElement old = transition->toXML();
+            if (transition->updateKeyframes()) {
+                QDomElement xml = transition->toXML();
+                m_document->renderer()->mltUpdateTransition(xml.attribute("tag"), xml.attribute("tag"), xml.attribute("transition_btrack").toInt(), m_document->tracksCount() - xml.attribute("transition_atrack").toInt(), transition->startPos(), transition->endPos(), xml);
+                new EditTransitionCommand(this, transition->track(), transition->startPos(), old, xml, false, command);
+            }
+            new MoveTransitionCommand(this, oldInfo, info, false, command);
         }
     }
     if (item->parentItem() && item->parentItem() != m_selectionGroup)
index f713709477461d796d6edb66b07290e2147865e9..759f8b064a18d6eb618b662200792c13f28387ba 100644 (file)
@@ -346,3 +346,64 @@ int Transition::defaultZValue() const
     return 3;
 }
 
+bool Transition::updateKeyframes()
+{
+    QString keyframes;
+    QDomElement pa;
+    bool modified = false;
+    QDomNodeList namenode = m_parameters.elementsByTagName("parameter");
+    for (int i = 0; i < namenode.count() ; i++) {
+        pa = namenode.item(i).toElement();
+        if (pa.attribute("type") == "geometry") {
+            keyframes = pa.attribute("value");
+            break;
+        }
+    }
+    if (keyframes.isEmpty()) return false;
+    int duration = cropDuration().frames(m_fps) - 1;
+    QStringList values = keyframes.split(";");
+    int frame;
+    int i = 0;
+    foreach(const QString &pos, values) {
+        if (!pos.contains('=')) {
+            i++;
+            continue;
+        }
+        frame = pos.section('=', 0, 0).toInt();
+        if (frame > duration) {
+            modified = true;
+            break;
+        }
+        i++;
+    }
+    if (modified) {
+        if (i > 0) {
+            // Check if there is a keyframe at transition end
+            QString prev = values.at(i-1);
+            bool done = false;
+            if (prev.contains('=')) {
+                int previousKeyframe = prev.section('=', 0, 0).toInt();
+                if (previousKeyframe == duration) {
+                    // Remove the last keyframes
+                    while (values.count() > i) {
+                        values.removeLast();
+                    }
+                    done = true;
+                }
+            }
+            if (!done) {
+                // Add new keyframe at end and remove last keyframes
+                QString last = values.at(i);
+                last = QString::number(duration) + '=' + last.section('=', 1);
+                values[i] = last;
+                while (values.count() > (i + 1)) {
+                    values.removeLast();
+                }
+            }
+        }
+        pa.setAttribute("value", values.join(";"));
+    }
+    
+    return true;
+}
+
index cf5ad84b6649ae5cb660c2002dffdc704dcb759d..c70405fe87bc150deaf1f5381bac4b105f45487e 100644 (file)
@@ -78,6 +78,8 @@ public:
     void setAutomatic(bool automatic);
     bool hasGeometry();
     int defaultZValue() const;
+    /** @brief When a transition is resized, check if keyframes are out of the transition and fix if necessary. */
+    bool updateKeyframes();
 
 protected:
     virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);