]> git.sesse.net Git - kdenlive/blobdiff - src/clipitem.cpp
* Set document as modified when changing project metadata: http://kdenlive.org/mantis...
[kdenlive] / src / clipitem.cpp
index 8623adc36e977d7fb3aeb38ec5ebbdeab06bc4a5..83b387bedd6732791239b3c02ac2bd2ec592bb70 100644 (file)
@@ -212,7 +212,7 @@ void ClipItem::setEffectList(const EffectsList effectList)
             else if (fade < 0)
                 m_endFade = -fade;
         }
-        setSelectedEffect(0);
+        setSelectedEffect(1);
     }
 }
 
@@ -261,7 +261,7 @@ void ClipItem::initEffect(QDomElement effect, int diff, int offset)
         if (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe") {
            if (e.attribute("keyframes").isEmpty()) {
                // Effect has a keyframe type parameter, we need to set the values
-               e.setAttribute("keyframes", QString::number(cropStart().frames(m_fps)) + ':' + e.attribute("default"));
+               e.setAttribute("keyframes", QString::number((int) cropStart().frames(m_fps)) + ':' + e.attribute("default"));
            }
            else if (offset != 0) {
                // adjust keyframes to this clip
@@ -272,8 +272,8 @@ void ClipItem::initEffect(QDomElement effect, int diff, int offset)
 
         if (e.attribute("type") == "geometry" && !e.hasAttribute("fixed")) {
             // Effects with a geometry parameter need to sync in / out with parent clip
-           effect.setAttribute("in", QString::number(cropStart().frames(m_fps)));
-           effect.setAttribute("out", QString::number((cropStart() + cropDuration()).frames(m_fps) - 1));
+           effect.setAttribute("in", QString::number((int) cropStart().frames(m_fps)));
+           effect.setAttribute("out", QString::number((int) (cropStart() + cropDuration()).frames(m_fps) - 1));
            effect.setAttribute("_sync_in_out", "1");
        }
     }
@@ -349,12 +349,16 @@ const QString ClipItem::adjustKeyframes(QString keyframes, int offset)
     return result.join(";");
 }
 
-bool ClipItem::checkKeyFrames()
+bool ClipItem::checkKeyFrames(int width, int height, int previousDuration, int cutPos)
 {
     bool clipEffectsModified = false;
     QLocale locale;
     // go through all effects this clip has
     for (int ix = 0; ix < m_effectList.count(); ++ix) {
+       // Check geometry params
+       resizeGeometries(ix, width, height, previousDuration, cutPos == -1 ? 0 : cutPos, cropDuration().frames(m_fps) - 1);
+
+       // Check keyframe params
         QStringList keyframeParams = keyframes(ix);
         QStringList newKeyFrameParams;
         bool effModified = false;
@@ -368,7 +372,7 @@ bool ClipItem::checkKeyFrames()
             int lastPos = -1;
             double lastValue = -1;
             int start = cropStart().frames(m_fps);
-            int end = (cropStart() + cropDuration()).frames(m_fps);
+            int end = (cropStart() + cropDuration()).frames(m_fps) - 1;
 
             // go through all keyframes for one param
             foreach(const QString &str, keyframes) {
@@ -382,8 +386,8 @@ bool ClipItem::checkKeyFrames()
                     if (pos > start) {
                         int diff = pos - lastPos;
                         double ratio = (double)(start - lastPos) / diff;
-                        double newValue = lastValue + (val - lastValue) * ratio;
-                        newKeyFrames.append(QString::number(start) + ':' + locale.toString(newValue));
+                        int newValue = lastValue + (val - lastValue) * ratio;
+                        newKeyFrames.append(QString::number(start) + ':' + QString::number(newValue));
                         modified = true;
                     }
                     cutKeyFrame = false;
@@ -394,13 +398,13 @@ bool ClipItem::checkKeyFrames()
                         int diff = pos - lastPos;
                         if (diff != 0) {
                             double ratio = (double)(end - lastPos) / diff;
-                            double newValue = lastValue + (val - lastValue) * ratio;
-                            newKeyFrames.append(QString::number(end) + ':' + locale.toString(newValue));
+                            int newValue = lastValue + (val - lastValue) * ratio;
+                            newKeyFrames.append(QString::number(end) + ':' + QString::number(newValue));
                             modified = true;
                         }
                         break;
                     } else {
-                        newKeyFrames.append(QString::number(pos) + ':' + locale.toString(val));
+                        newKeyFrames.append(QString::number(pos) + ':' + QString::number(val));
                     }
                 }
                 lastPos = pos;
@@ -430,9 +434,9 @@ void ClipItem::setKeyframes(const int ix, const QStringList keyframes)
     int keyframeParams = 0;
     for (int i = 0; i < params.count(); i++) {
         QDomElement e = params.item(i).toElement();
-        if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe") && e.attribute("intimeline") == "1") {
+        if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe") && (!e.hasAttribute("intimeline") || e.attribute("intimeline") == "1")) {
             e.setAttribute("keyframes", keyframes.at(keyframeParams));
-            if (ix == m_selectedEffect && keyframeParams == 0) {
+            if (ix + 1 == m_selectedEffect && keyframeParams == 0) {
                 m_keyframes.clear();
                 m_visibleParam = i;
                 double max = locale.toDouble(e.attribute("max"));
@@ -499,6 +503,22 @@ void ClipItem::setSelectedEffect(const int ix)
     }
 }
 
+void ClipItem::resizeGeometries(const int index, int width, int height, int previousDuration, int start, int duration)
+{
+    QString geom;
+    QDomElement effect = m_effectList.at(index);
+    QDomNodeList params = effect.elementsByTagName("parameter");
+
+    for (int i = 0; i < params.count(); i++) {
+        QDomElement e = params.item(i).toElement();
+        if (!e.isNull() && e.attribute("type") == "geometry") {
+            geom = e.attribute("value");
+           Mlt::Geometry geometry(geom.toUtf8().data(), previousDuration, width, height);
+           e.setAttribute("value", geometry.serialise(start, start + duration));
+       }
+    }
+}
+
 QStringList ClipItem::keyframes(const int index)
 {
     QStringList result;
@@ -1659,8 +1679,8 @@ EffectsParameterList ClipItem::addEffect(QDomElement effect, bool /*animate*/)
         }
     }
     if (needInOutSync) {
-        parameters.addParam("in", QString::number(cropStart().frames(m_fps)));
-        parameters.addParam("out", QString::number((cropStart() + cropDuration()).frames(m_fps) - 1));
+        parameters.addParam("in", QString::number((int) cropStart().frames(m_fps)));
+        parameters.addParam("out", QString::number((int) (cropStart() + cropDuration()).frames(m_fps) - 1));
         parameters.addParam("_sync_in_out", "1");
     }
     m_effectNames = m_effectList.effectNames().join(" / ");
@@ -1668,7 +1688,7 @@ EffectsParameterList ClipItem::addEffect(QDomElement effect, bool /*animate*/)
     else if (fade < 0) m_endFade = -fade;
 
     if (m_selectedEffect == -1) {
-        setSelectedEffect(0);
+        setSelectedEffect(1);
     } else if (m_selectedEffect == ix - 1) setSelectedEffect(m_selectedEffect);
     if (needRepaint) update(boundingRect());
     /*if (animate) {
@@ -1800,7 +1820,7 @@ void ClipItem::dropEvent(QGraphicsSceneDragDropEvent * event)
            e.removeAttribute("kdenlive_ix");
        }
         CustomTrackView *view = (CustomTrackView *) scene()->views()[0];
-        if (view) view->slotAddEffect(e, m_info.startPos, track());
+        if (view) view->slotDropEffect(this, e, m_info.startPos, track());
     }
     else return;
 }
@@ -2002,7 +2022,7 @@ QMap<int, QDomElement> ClipItem::adjustEffectsToDuration(int width, int height,
                 if (in < cropStart().frames(m_fps)) {
                     if (!effects.contains(i))
                         effects[i] = effect.cloneNode().toElement();
-                    EffectsList::setParameter(effect, "in", QString::number(cropStart().frames(m_fps)));
+                    EffectsList::setParameter(effect, "in", QString::number((int) cropStart().frames(m_fps)));
                 }
                 if (effects.contains(i))
                     setFadeOut(out - in);