]> git.sesse.net Git - kdenlive/commitdiff
volume effect now works fine with keyframes
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 21 Jun 2008 08:46:36 +0000 (08:46 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 21 Jun 2008 08:46:36 +0000 (08:46 +0000)
svn path=/branches/KDE4/; revision=2257

src/abstractclipitem.cpp
src/clipitem.cpp
src/clipitem.h
src/effectslistview.cpp

index cdd197de350d030072c84038fe4450ea843001b7..31be18b6a40805a4adaa68d0b09722fe57fc7b27 100644 (file)
@@ -275,35 +275,35 @@ void AbstractClipItem::updateSelectedKeyFrame() {
 }
 
 void AbstractClipItem::updateKeyFramePos(const GenTime pos, const int value) {
-    if (m_selectedKeyframe == -1) return;
+    if (!m_keyframes.contains(m_selectedKeyframe)) return;
     QRectF br = rect();
     double maxh = br.height() / 100.0;
     double newval = (br.bottom() - value) / maxh;
     int newpos = (int) pos.frames(m_fps);
-    if (newval < -50 && m_selectedKeyframe != m_cropStart.frames(m_fps) && m_selectedKeyframe != (m_cropStart + m_cropDuration).frames(m_fps)) {
+    int start = m_cropStart.frames(m_fps);
+    int end = (m_cropStart + m_cropDuration).frames(m_fps);
+    newpos = qMax(newpos, start);
+    newpos = qMin(newpos, end);
+    if (newval < -50 && m_selectedKeyframe != start && m_selectedKeyframe != end) {
         // remove kexframe if it is dragged outside
         m_keyframes.remove(m_selectedKeyframe);
         m_selectedKeyframe = -1;
         update();
         return;
     }
-    if (newval > 150 && m_selectedKeyframe != m_cropStart.frames(m_fps) && m_selectedKeyframe != (m_cropStart + m_cropDuration).frames(m_fps)) {
+    if (newval > 150 && m_selectedKeyframe != start && m_selectedKeyframe != end) {
         // remove kexframe if it is dragged outside
         m_keyframes.remove(m_selectedKeyframe);
         m_selectedKeyframe = -1;
         update();
         return;
     }
-    if (newval < 0) newval = 0;
-    else if (newval > 100) newval = 100;
-    if (m_selectedKeyframe == m_cropStart.frames(m_fps) || m_selectedKeyframe == (m_cropStart + m_cropDuration).frames(m_fps)) {
-        // start and end keyframes should stay in place
-        m_keyframes[m_selectedKeyframe] = newval;
-    } else {
-        m_keyframes.remove(m_selectedKeyframe);
-        m_keyframes[newpos] = newval;
-        m_selectedKeyframe = newpos;
-    }
+    newval = qMax(newval, 0.0);
+    newval = qMin(newval, 100.0);
+
+    if (m_selectedKeyframe != newpos) m_keyframes.remove(m_selectedKeyframe);
+    m_keyframes[newpos] = newval;
+    m_selectedKeyframe = newpos;
     update();
 }
 
index 958af22d9d0443949fc7b479fd98a7682238e92b..634a71c299e452f2ca6995c450bb6cc68c70828f 100644 (file)
@@ -110,10 +110,10 @@ void ClipItem::setSelectedEffect(int ix) {
     m_selectedEffect = ix;
     QDomElement effect = effectAt(m_selectedEffect);
     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") == "keyframe") {
+            m_keyframes.clear();
             int max = e.attribute("max").toInt();
             int min = e.attribute("min").toInt();
             int def = e.attribute("default").toInt();
@@ -164,9 +164,6 @@ void ClipItem::updateKeyframeEffect() {
                 double y1;
                 while (i != m_keyframes.constEnd()) {
                     keyframes.append(QString::number(i.key()) + ":" + QString::number(i.value()) + ";");
-                    /*x1 = m_cropDuration.frames(m_fps) * i.key() / 100.0;
-                    y1 = (min + i.value() * (max - min) / 100.0) / factor;
-                    keyframes.append(QString::number(x1) + ":" + QString::number(y1) + ";");*/
                     ++i;
                 }
             }
@@ -688,15 +685,54 @@ void ClipItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *) {
 }
 
 void ClipItem::resizeStart(int posx, double scale) {
+    const int previous = cropStart().frames(m_fps);
     AbstractClipItem::resizeStart(posx, scale);
+    checkEffectsKeyframesPos(previous, cropStart().frames(m_fps), true);
     if (m_hasThumbs && KdenliveSettings::videothumbnails()) startThumbTimer->start(100);
 }
 
 void ClipItem::resizeEnd(int posx, double scale) {
+    const int previous = (cropStart() + duration()).frames(m_fps);
     AbstractClipItem::resizeEnd(posx, scale);
+    checkEffectsKeyframesPos(previous, (cropStart() + duration()).frames(m_fps), false);
     if (m_hasThumbs && KdenliveSettings::videothumbnails()) endThumbTimer->start(100);
 }
 
+
+void ClipItem::checkEffectsKeyframesPos(const int previous, const int current, bool fromStart) {
+    for (int i = 0; i < m_effectList.size(); i++) {
+        QDomElement effect = m_effectList.at(i);
+        QDomNodeList params = effect.elementsByTagName("parameter");
+        for (int j = 0; j < params.count(); j++) {
+            QDomElement e = params.item(i).toElement();
+            if (e.attribute("type") == "keyframe") {
+                // parse keyframes and adjust values
+                QStringList keyframes = e.attribute("keyframes").split(";", QString::SkipEmptyParts);
+                QMap <int, double> kfr;
+                foreach(QString str, keyframes) {
+                    int pos = str.section(":", 0, 0).toInt();
+                    double val = str.section(":", 1, 1).toDouble();
+                    if (pos == previous) kfr[current] = val;
+                    else {
+                        if (fromStart && pos >= current) kfr[pos] = val;
+                        else if (!fromStart && pos <= current) kfr[pos] = val;
+                    }
+                }
+                QString newkfr;
+                QMap<int, double>::const_iterator k = kfr.constBegin();
+                while (k != kfr.constEnd()) {
+                    newkfr.append(QString::number(k.key()) + ":" + QString::number(k.value()) + ";");
+                    ++k;
+                }
+                e.setAttribute("keyframes", newkfr);
+                break;
+            }
+        }
+    }
+    setSelectedEffect(m_selectedEffect);
+}
+
+
 // virtual
 /*void ClipItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event) {
 }*/
index e2e501b6c586dd7dcb8b732e3977fc2584a20ce1..51c6e44c557e19d4600449c43bc3621de337e80c 100644 (file)
@@ -129,7 +129,8 @@ private:
     bool audioThumbWasDrawn, audioThumbReady;
     double framePixelWidth;
     QMap<int, QPainterPath > channelPaths;
-
+    /** Called when clip start is resized, adjust keyframes values */
+    void checkEffectsKeyframesPos(const int previous, const int current, bool fromStart);
 private slots:
     void slotThumbReady(int frame, QPixmap pix);
     void slotFetchThumbs();
index 1f6e9247b384f0052a3203a1075f180439802993..9778fcda94109908f0dab0cef71fdf2b771e9204 100644 (file)
@@ -74,7 +74,7 @@ void EffectsListView::showInfoPanel() {
 }
 
 void EffectsListView::slotEffectSelected() {
-    QDomElement effect = m_effectsList->currentEffect();
+    QDomElement effect = m_effectsList->currentEffect().cloneNode().toElement();
     if (!effect.isNull()) emit addEffect(effect);
 }