]> git.sesse.net Git - kdenlive/blobdiff - src/clipitem.cpp
Fix LADSPA effects, should work now:
[kdenlive] / src / clipitem.cpp
index bbd0c45d195f8d52c5f63f27e5e31ec33da65808..1b493385ae4661d36d449d56581480c230129950 100644 (file)
@@ -42,8 +42,9 @@
 
 ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, bool generateThumbs)
         : AbstractClipItem(info, QRectF(), fps), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_startThumbRequested(false), m_endThumbRequested(false), m_startFade(0), m_endFade(0), m_hover(false), m_selectedEffect(-1), m_speed(1.0), framePixelWidth(0), m_startPix(QPixmap()), m_endPix(QPixmap()) {
-    setRect(0, 0, (info.endPos - info.startPos).frames(fps) - 0.02, (qreal)(KdenliveSettings::trackheight() - 2));
-    setPos((qreal) info.startPos.frames(fps), (qreal)(info.track * KdenliveSettings::trackheight()) + 1);
+    setZValue(1);
+    setRect(0, 0, (info.endPos - info.startPos).frames(fps) - 0.02, (double)(KdenliveSettings::trackheight() - 2));
+    setPos(info.startPos.frames(fps), (double)(info.track * KdenliveSettings::trackheight()) + 1);
 
     m_clipName = clip->name();
     m_producer = clip->getId();
@@ -138,6 +139,7 @@ void ClipItem::initEffect(QDomElement effect) {
     QDomNodeList params = effect.elementsByTagName("parameter");
     for (int i = 0; i < params.count(); i++) {
         QDomElement e = params.item(i).toElement();
+        kDebug() << "// inint eff: " << e.attribute("name");
         if (!e.isNull() && e.attribute("type") == "keyframe") {
             QString def = e.attribute("default");
             // Effect has a keyframe type parameter, we need to set the values
@@ -148,6 +150,20 @@ void ClipItem::initEffect(QDomElement effect) {
             }
         }
     }
+
+    if (effect.attribute("tag") == "volume") {
+        if (effect.attribute("id") == "fadeout") {
+            int end = (duration() + cropStart()).frames(m_fps);
+            int start = end - EffectsList::parameter(effect, "in").toInt();
+            EffectsList::setParameter(effect, "in", QString::number(start));
+            EffectsList::setParameter(effect, "out", QString::number(end));
+        } else if (effect.attribute("id") == "fadein") {
+            int start = cropStart().frames(m_fps);
+            int end = start + EffectsList::parameter(effect, "out").toInt();
+            EffectsList::setParameter(effect, "in", QString::number(start));
+            EffectsList::setParameter(effect, "out", QString::number(end));
+        }
+    }
 }
 
 bool ClipItem::checkKeyFrames() {
@@ -412,14 +428,22 @@ void ClipItem::slotThumbReady(int frame, QPixmap pix) {
     }
 }
 
-void ClipItem::slotSetStartThumb(QPixmap pix) {
+void ClipItem::slotSetStartThumb(const QPixmap pix) {
     m_startPix = pix;
 }
 
-void ClipItem::slotSetEndThumb(QPixmap pix) {
+void ClipItem::slotSetEndThumb(const QPixmap pix) {
     m_endPix = pix;
 }
 
+QPixmap ClipItem::startThumb() const {
+    return m_startPix;
+}
+
+QPixmap ClipItem::endThumb() const {
+    return m_endPix;
+}
+
 void ClipItem::slotGotAudioData() {
     audioThumbReady = true;
     if (m_clipType == AV) {
@@ -472,7 +496,9 @@ void ClipItem::animate(qreal value) {
 void ClipItem::paint(QPainter *painter,
                      const QStyleOptionGraphicsItem *option,
                      QWidget *) {
-    painter->setOpacity(m_opacity);
+    /*if (parentItem()) m_opacity = 0.5;
+    else m_opacity = 1.0;
+    painter->setOpacity(m_opacity);*/
     QBrush paintColor = brush();
     if (isSelected()) paintColor = QBrush(QColor(79, 93, 121));
     QRectF br = rect();
@@ -492,7 +518,7 @@ void ClipItem::paint(QPainter *painter,
     //build path around clip
     //QPainterPath resultClipPath = roundRectPathUpper.united(roundRectPathLower);
     //painter->fillPath(resultClipPath, paintColor);
-    painter->fillRect(br, paintColor);
+    painter->fillRect(exposed, paintColor);
 
     //painter->setClipPath(resultClipPath, Qt::IntersectClip);
 
@@ -864,21 +890,23 @@ uint ClipItem::fadeOut() const {
 
 
 void ClipItem::setFadeIn(int pos) {
+    if (pos == m_startFade) return;
     int oldIn = m_startFade;
     if (pos < 0) pos = 0;
-    if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps) / 2);
+    if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps));
     m_startFade = pos;
     QRectF rect = boundingRect();
     update(rect.x(), rect.y(), qMax(oldIn, pos), rect.height());
 }
 
 void ClipItem::setFadeOut(int pos) {
+    if (pos == m_endFade) return;
     int oldOut = m_endFade;
     if (pos < 0) pos = 0;
-    if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps) / 2);
+    if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps));
     m_endFade = pos;
     QRectF rect = boundingRect();
-    update(rect.x() + rect.width() - qMax(oldOut, pos), rect.y(), pos, rect.height());
+    update(rect.x() + rect.width() - qMax(oldOut, pos), rect.y(), qMax(oldOut, pos), rect.height());
 
 }
 
@@ -938,7 +966,7 @@ void ClipItem::resizeEnd(int posx, double speed, bool updateKeyFrames) {
     const int max = (startPos() - cropStart() + maxDuration()).frames(m_fps) + 1;
     if (posx > max) posx = max;
     if (posx == endPos().frames(m_fps)) return;
-    kDebug() << "// NEW POS: " << posx << ", OLD END: " << endPos().frames(m_fps);
+    //kDebug() << "// NEW POS: " << posx << ", OLD END: " << endPos().frames(m_fps);
     const int previous = (cropStart() + duration()).frames(m_fps);
     AbstractClipItem::resizeEnd(posx, m_speed);
     if (updateKeyFrames) checkEffectsKeyframesPos(previous, (cropStart() + duration()).frames(m_fps), false);
@@ -984,18 +1012,17 @@ void ClipItem::checkEffectsKeyframesPos(const int previous, const int current, b
     if (m_selectedEffect >= 0) setSelectedEffect(m_selectedEffect);
 }
 
-
 //virtual
 QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value) {
     if (change == ItemPositionChange && scene()) {
         // calculate new position.
-        if (group() != 0) return pos();
+        if (parentItem()) return pos();
         QPointF newPos = value.toPointF();
-        //kDebug() << "/// MOVING CLIP ITEM.------------";
+        //kDebug() << "/// MOVING CLIP ITEM.------------\n++++++++++";
         int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints());
         xpos = qMax(xpos, 0);
         newPos.setX(xpos);
-        int newTrack = (newPos.y() + KdenliveSettings::trackheight() / 2) / KdenliveSettings::trackheight();
+        int newTrack = newPos.y() / KdenliveSettings::trackheight();
         newTrack = qMin(newTrack, projectScene()->tracksCount() - 1);
         newTrack = qMax(newTrack, 0);
         newPos.setY((int)(newTrack  * KdenliveSettings::trackheight() + 1));
@@ -1004,38 +1031,37 @@ QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value)
         sceneShape.translate(newPos);
         QList<QGraphicsItem*> items = scene()->items(sceneShape, Qt::IntersectsItemShape);
         items.removeAll(this);
-
+        bool forwardMove = newPos.x() > pos().x();
+        int offset = 0;
         if (!items.isEmpty()) {
             for (int i = 0; i < items.count(); i++) {
                 if (items.at(i)->type() == type()) {
                     // Collision!
                     QPointF otherPos = items.at(i)->pos();
-                    if ((int) otherPos.y() != (int) pos().y()) return pos();
-                    if (pos().x() < otherPos.x()) {
-                        // move clip just before colliding clip
-                        int npos = (static_cast < AbstractClipItem* >(items.at(i))->startPos() - m_cropDuration).frames(m_fps);
-                        // check we don't run into another clip
-                        newPos.setX(npos);
-                        sceneShape = rect();
-                        sceneShape.translate(newPos);
-                        QList<QGraphicsItem*> subitems = scene()->items(sceneShape, Qt::IntersectsItemShape);
-                        items.removeAll(this);
-                        for (int j = 0; j < subitems.count(); j++) {
-                            if (subitems.at(j)->type() == type()) return pos();
-                        }
+                    if ((int) otherPos.y() != (int) pos().y()) {
+                        return pos();
+                    }
+                    if (forwardMove) {
+                        offset = qMax(offset, (int)(newPos.x() - (static_cast < AbstractClipItem* >(items.at(i))->startPos() - m_cropDuration).frames(m_fps)));
                     } else {
-                        // get pos just after colliding clip
-                        int npos = static_cast < AbstractClipItem* >(items.at(i))->endPos().frames(m_fps);
-                        // check we don't run into another clip
-                        newPos.setX(npos);
-                        sceneShape = rect();
-                        sceneShape.translate(newPos);
+                        offset = qMax(offset, (int)((static_cast < AbstractClipItem* >(items.at(i))->endPos().frames(m_fps)) - newPos.x()));
+                    }
+
+                    if (offset > 0) {
+                        if (forwardMove) {
+                            sceneShape.translate(QPointF(-offset, 0));
+                            newPos.setX(newPos.x() - offset);
+                        } else {
+                            sceneShape.translate(QPointF(offset, 0));
+                            newPos.setX(newPos.x() + offset);
+                        }
                         QList<QGraphicsItem*> subitems = scene()->items(sceneShape, Qt::IntersectsItemShape);
-                        items.removeAll(this);
+                        subitems.removeAll(this);
                         for (int j = 0; j < subitems.count(); j++) {
                             if (subitems.at(j)->type() == type()) return pos();
                         }
                     }
+
                     m_track = newTrack;
                     m_startPos = GenTime((int) newPos.x(), m_fps);
                     return newPos;
@@ -1089,38 +1115,47 @@ void ClipItem::setEffectAt(int ix, QDomElement effect) {
     }
 }
 
-QHash <QString, QString> ClipItem::addEffect(QDomElement effect, bool animate) {
-    QHash <QString, QString> effectParams;
+EffectsParameterList ClipItem::addEffect(QDomElement effect, bool animate) {
+
     bool needRepaint = false;
     /*QDomDocument doc;
     doc.appendChild(doc.importNode(effect, true));
     kDebug() << "///////  CLIP ADD EFFECT: " << doc.toString();*/
     m_effectList.append(effect);
-    effectParams["tag"] = effect.attribute("tag");
+
+    EffectsParameterList parameters;
+    parameters.addParam("tag", effect.attribute("tag"));
+    parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
+    if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src"));
+
+    QString state = effect.attribute("disabled");
+    if (!state.isEmpty()) {
+        parameters.addParam("disabled", state);
+    }
+
     QString effectId = effect.attribute("id");
     if (effectId.isEmpty()) effectId = effect.attribute("tag");
-    effectParams["id"] = effectId;
-    effectParams["kdenlive_ix"] = effect.attribute("kdenlive_ix");
-    QString state = effect.attribute("disabled");
-    if (!state.isEmpty()) effectParams["disabled"] = state;
+    parameters.addParam("id", effectId);
+
     QDomNodeList params = effect.elementsByTagName("parameter");
     int fade = 0;
     for (int i = 0; i < params.count(); i++) {
         QDomElement e = params.item(i).toElement();
         if (!e.isNull()) {
             if (e.attribute("type") == "keyframe") {
-                effectParams["keyframes"] = e.attribute("keyframes");
-                effectParams["min"] = e.attribute("min");
-                effectParams["max"] = e.attribute("max");
-                effectParams["factor"] = e.attribute("factor", "1");
-                effectParams["starttag"] = e.attribute("starttag", "start");
-                effectParams["endtag"] = e.attribute("endtag", "end");
+                parameters.addParam("keyframes", e.attribute("keyframes"));
+                parameters.addParam("max", e.attribute("max"));
+                parameters.addParam("min", e.attribute("min"));
+                parameters.addParam("factor", e.attribute("factor", "1"));
+                parameters.addParam("starttag", e.attribute("starttag", "start"));
+                parameters.addParam("endtag", e.attribute("endtag", "end"));
             }
 
             double f = e.attribute("factor", "1").toDouble();
 
             if (f == 1) {
-                effectParams[e.attribute("name")] = e.attribute("value");
+                parameters.addParam(e.attribute("name"), e.attribute("value"));
+
                 // check if it is a fade effect
                 if (effectId == "fadein") {
                     needRepaint = true;
@@ -1132,7 +1167,7 @@ QHash <QString, QString> ClipItem::addEffect(QDomElement effect, bool animate) {
                     else if (e.attribute("name") == "in") fade += e.attribute("value").toInt();
                 }
             } else {
-                effectParams[e.attribute("name")] =  QString::number(e.attribute("value").toDouble() / f);
+                parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / f));
             }
         }
     }
@@ -1151,28 +1186,32 @@ QHash <QString, QString> ClipItem::addEffect(QDomElement effect, bool animate) {
         m_selectedEffect = 0;
         setSelectedEffect(m_selectedEffect);
     }
-    return effectParams;
+    return parameters;
 }
 
-QHash <QString, QString> ClipItem::getEffectArgs(QDomElement effect) {
-    QHash <QString, QString> effectParams;
-    effectParams["tag"] = effect.attribute("tag");
-    effectParams["kdenlive_ix"] = effect.attribute("kdenlive_ix");
-    effectParams["id"] = effect.attribute("id");
+EffectsParameterList ClipItem::getEffectArgs(QDomElement effect) {
+    EffectsParameterList parameters;
+    parameters.addParam("tag", effect.attribute("tag"));
+    parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
+    parameters.addParam("id", effect.attribute("id"));
+    if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src"));
     QString state = effect.attribute("disabled");
-    if (!state.isEmpty()) effectParams["disabled"] = state;
+    if (!state.isEmpty()) {
+        parameters.addParam("disabled", state);
+    }
+
     QDomNodeList params = effect.elementsByTagName("parameter");
     for (int i = 0; i < params.count(); i++) {
         QDomElement e = params.item(i).toElement();
         //kDebug() << "/ / / /SENDING EFFECT PARAM: " << e.attribute("type") << ", NAME_ " << e.attribute("tag");
         if (e.attribute("type") == "keyframe") {
             kDebug() << "/ / / /SENDING KEYFR EFFECT TYPE";
-            effectParams["keyframes"] = e.attribute("keyframes");
-            effectParams["max"] = e.attribute("max");
-            effectParams["min"] = e.attribute("min");
-            effectParams["factor"] = e.attribute("factor", "1");
-            effectParams["starttag"] = e.attribute("starttag", "start");
-            effectParams["endtag"] = e.attribute("endtag", "end");
+            parameters.addParam("keyframes", e.attribute("keyframes"));
+            parameters.addParam("max", e.attribute("max"));
+            parameters.addParam("min", e.attribute("min"));
+            parameters.addParam("factor", e.attribute("factor", "1"));
+            parameters.addParam("starttag", e.attribute("starttag", "start"));
+            parameters.addParam("endtag", e.attribute("endtag", "end"));
         } else if (e.attribute("namedesc").contains(";")) {
             QString format = e.attribute("format");
             QStringList separators = format.split("%d", QString::SkipEmptyParts);
@@ -1185,14 +1224,16 @@ QHash <QString, QString> ClipItem::getEffectArgs(QDomElement effect) {
                 txtNeu << separators[i];
                 txtNeu << (int)(values[i+1].toDouble());
             }
-            effectParams["start"] = neu;
+            parameters.addParam("start", neu);
         } else {
-            if (e.attribute("factor", "1") != "1")
-                effectParams[e.attribute("name")] =  QString::number(e.attribute("value").toDouble() / e.attribute("factor").toDouble());
-            else effectParams[e.attribute("name")] = e.attribute("value");
+            if (e.attribute("factor", "1") != "1") {
+                parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / e.attribute("factor").toDouble()));
+            } else {
+                parameters.addParam(e.attribute("name"), e.attribute("value"));
+            }
         }
     }
-    return effectParams;
+    return parameters;
 }
 
 void ClipItem::deleteEffect(QString index) {