]> git.sesse.net Git - kdenlive/blobdiff - src/clipitem.cpp
Prepare checking of removed / deleted files in a project:
[kdenlive] / src / clipitem.cpp
index 1aa2b203dcbd674b8ffb9a69edc65ad7d9c08e57..3d43267d5f480b665f44ef203122d109ad31f143 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;
             }
         }
@@ -314,7 +314,7 @@ bool ClipItem::checkKeyFrames()
 void ClipItem::setKeyframes(const int ix, const QString keyframes)
 {
     QDomElement effect = getEffectAt(ix);
-    if (effect.attribute("disabled") == "1") return;
+    if (effect.attribute("disable") == "1") return;
     QDomNodeList params = effect.elementsByTagName("parameter");
     for (int i = 0; i < params.count(); i++) {
         QDomElement e = params.item(i).toElement();
@@ -327,7 +327,6 @@ void ClipItem::setKeyframes(const int ix, const QString keyframes)
                 m_keyframeFactor = 100.0 / (max - min);
                 m_keyframeDefault = e.attribute("default").toDouble();
                 m_selectedKeyframe = 0;
-                m_editedKeyframe = -1;
                 // parse keyframes
                 const QStringList keyframes = e.attribute("keyframes").split(';', QString::SkipEmptyParts);
                 foreach(const QString &str, keyframes) {
@@ -335,6 +334,8 @@ void ClipItem::setKeyframes(const int ix, const QString keyframes)
                     double val = str.section(':', 1, 1).toDouble();
                     m_keyframes[pos] = val;
                 }
+                if (m_keyframes.find(m_editedKeyframe) == m_keyframes.end()) m_editedKeyframe = -1;
+                if (m_keyframes.find(m_editedKeyframe) == m_keyframes.end()) m_editedKeyframe = -1;
                 update();
                 return;
             }
@@ -350,7 +351,7 @@ void ClipItem::setSelectedEffect(const int ix)
     QDomElement effect = effectAt(m_selectedEffect);
     if (effect.isNull() == false) {
         QDomNodeList params = effect.elementsByTagName("parameter");
-        if (effect.attribute("disabled") != "1")
+        if (effect.attribute("disable") != "1")
             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")) {
@@ -360,7 +361,7 @@ void ClipItem::setSelectedEffect(const int ix)
                     m_keyframeFactor = 100.0 / (max - min);
                     m_keyframeDefault = e.attribute("default").toDouble();
                     m_selectedKeyframe = 0;
-                    m_editedKeyframe = -1;
+
                     // parse keyframes
                     const QStringList keyframes = e.attribute("keyframes").split(';', QString::SkipEmptyParts);
                     foreach(const QString &str, keyframes) {
@@ -368,6 +369,7 @@ void ClipItem::setSelectedEffect(const int ix)
                         double val = str.section(':', 1, 1).toDouble();
                         m_keyframes[pos] = val;
                     }
+                    if (m_keyframes.find(m_editedKeyframe) == m_keyframes.end()) m_editedKeyframe = -1;
                     update();
                     return;
                 }
@@ -399,7 +401,7 @@ void ClipItem::updateKeyframeEffect()
 {
     // regenerate xml parameter from the clip keyframes
     QDomElement effect = getEffectAt(m_selectedEffect);
-    if (effect.attribute("disabled") == "1") return;
+    if (effect.attribute("disable") == "1") return;
     QDomNodeList params = effect.elementsByTagName("parameter");
 
     for (int i = 0; i < params.count(); i++) {
@@ -657,7 +659,6 @@ void ClipItem::paint(QPainter *painter,
     if (KdenliveSettings::videothumbnails() && !isAudioOnly()) {
         QPen pen = painter->pen();
         pen.setColor(QColor(255, 255, 255, 150));
-        const QRectF source(0.0, 0.0, (double) m_startPix.width(), (double) m_startPix.height());
         painter->setPen(pen);
         if ((m_clipType == IMAGE || m_clipType == TEXT) && !m_startPix.isNull()) {
             const QPointF top = mapped.topRight() - QPointF(m_startPix.width() - 1, 0);
@@ -697,7 +698,8 @@ void ClipItem::paint(QPainter *painter,
         } else mappedRect = mapped;
 
         double scale = painter->matrix().m11();
-        int channels = baseClip()->getProperty("channels").toInt();
+        int channels = 0;
+        if (isEnabled() && m_clip) channels = m_clip->getProperty("channels").toInt();
         if (scale != m_framePixelWidth)
             m_audioThumbCachePic.clear();
         double cropLeft = m_info.cropStart.frames(m_fps);
@@ -852,8 +854,11 @@ OPERATIONTYPE ClipItem::operationMode(QPointF pos)
     const double scale = projectScene()->scale().x();
     double maximumOffset = 6 / scale;
     if (isSelected() || (parentItem() && parentItem()->isSelected())) {
-        m_editedKeyframe = mouseOverKeyFrames(pos, maximumOffset);
-        if (m_editedKeyframe != -1) return KEYFRAME;
+        int kf = mouseOverKeyFrames(pos, maximumOffset);
+        if (kf != -1) {
+            m_editedKeyframe = kf;
+            return KEYFRAME;
+        }
     }
     QRectF rect = sceneBoundingRect();
     int addtransitionOffset = 10;
@@ -1310,7 +1315,7 @@ EffectsParameterList ClipItem::addEffect(const QDomElement effect, bool /*animat
     parameters.addParam("tag", effect.attribute("tag"));
     parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
     if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src"));
-    if (effect.hasAttribute("disabled")) parameters.addParam("disabled", effect.attribute("disabled"));
+    if (effect.hasAttribute("disable")) parameters.addParam("disable", effect.attribute("disable"));
 
 
     QString effectId = effect.attribute("id");
@@ -1423,7 +1428,7 @@ EffectsParameterList ClipItem::getEffectArgs(const QDomElement effect)
     parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
     parameters.addParam("id", effect.attribute("id"));
     if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src"));
-    if (effect.hasAttribute("disabled")) parameters.addParam("disabled", effect.attribute("disabled"));
+    if (effect.hasAttribute("disable")) parameters.addParam("disable", effect.attribute("disable"));
 
     QDomNodeList params = effect.elementsByTagName("parameter");
     for (int i = 0; i < params.count(); i++) {
@@ -1628,5 +1633,76 @@ bool ClipItem::isVideoOnly() const
     return m_videoOnly;
 }
 
+void ClipItem::insertKeyframe(QDomElement effect, int pos, int val)
+{
+    if (effect.attribute("disable") == "1") return;
+    effect.setAttribute("active_keyframe", pos);
+    m_editedKeyframe = pos;
+    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(";"));
+    }
+}
 
+void ClipItem::movedKeyframe(QDomElement effect, int oldpos, int newpos, double value)
+{
+    if (effect.attribute("disable") == "1") return;
+    effect.setAttribute("active_keyframe", newpos);
+    QDomNodeList params = effect.elementsByTagName("parameter");
+    int start = cropStart().frames(m_fps);
+    int end = (cropStart() + cropDuration()).frames(m_fps) - 1;
+    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;
+        foreach(const QString &str, keyframes) {
+            if (str.section(':', 0, 0).toInt() != oldpos) {
+                newkfr.append(str);
+            } else if (newpos != -1) {
+                newpos = qMax(newpos, start);
+                newpos = qMin(newpos, end);
+                if (i == 0) newkfr.append(QString::number(newpos) + ":" + QString::number(value));
+                else newkfr.append(QString::number(newpos) + ":" + str.section(':', 1, 1));
+            }
+        }
+        e.setAttribute("keyframes", newkfr.join(";"));
+    }
+
+    updateKeyframes(effect);
+    update();
+}
+
+void ClipItem::updateKeyframes(QDomElement effect)
+{
+    m_keyframes.clear();
+    // parse keyframes
+    QDomNodeList params = effect.elementsByTagName("parameter");
+    QDomElement e = params.item(0).toElement();
+    const QStringList keyframes = e.attribute("keyframes").split(';', QString::SkipEmptyParts);
+    foreach(const QString &str, keyframes) {
+        int pos = str.section(':', 0, 0).toInt();
+        double val = str.section(':', 1, 1).toDouble();
+        m_keyframes[pos] = val;
+    }
+    if (!m_keyframes.contains(m_selectedKeyframe)) m_selectedKeyframe = -1;
+}
 #include "clipitem.moc"