]> git.sesse.net Git - kdenlive/blobdiff - src/clipitem.cpp
Update for new titler module, turn clip speed into an effect, mem leaks and more
[kdenlive] / src / clipitem.cpp
index fc41fcae3fd788c4a8b81bbb107290a822e3a817..c03356452ac27db01501bf9ef9228a703d4eec56 100644 (file)
@@ -26,6 +26,7 @@
 #include "transition.h"
 #include "kdenlivesettings.h"
 #include "kthumb.h"
+#include "profilesdialog.h"
 
 #include <KDebug>
 #include <KIcon>
 #include <QGraphicsScene>
 #include <QMimeData>
 
-ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, bool generateThumbs) :
+ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, int strobe, bool generateThumbs) :
         AbstractClipItem(info, QRectF(), fps),
         m_clip(clip),
-        m_resizeMode(NONE),
         m_startFade(0),
         m_endFade(0),
         m_audioOnly(false),
@@ -47,14 +47,13 @@ ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, b
         m_startPix(QPixmap()),
         m_endPix(QPixmap()),
         m_hasThumbs(false),
-        m_startThumbTimer(NULL),
-        m_endThumbTimer(NULL),
         m_selectedEffect(-1),
         m_timeLine(0),
         m_startThumbRequested(false),
         m_endThumbRequested(false),
         //m_hover(false),
         m_speed(speed),
+        m_strobe(strobe),
         m_framePixelWidth(0)
 {
     setZValue(2);
@@ -83,12 +82,10 @@ ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, b
     if (m_clipType == VIDEO || m_clipType == AV || m_clipType == SLIDESHOW || m_clipType == PLAYLIST) {
         setBrush(QColor(141, 166, 215));
         m_hasThumbs = true;
-        m_startThumbTimer = new QTimer(this);
-        m_startThumbTimer->setSingleShot(true);
-        connect(m_startThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetStartThumb()));
-        m_endThumbTimer = new QTimer(this);
-        m_endThumbTimer->setSingleShot(true);
-        connect(m_endThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetEndThumb()));
+        m_startThumbTimer.setSingleShot(true);
+        connect(&m_startThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetStartThumb()));
+        m_endThumbTimer.setSingleShot(true);
+        connect(&m_endThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetEndThumb()));
 
         connect(this, SIGNAL(getThumb(int, int)), clip->thumbProducer(), SLOT(extractImage(int, int)));
         //connect(this, SIGNAL(getThumb(int, int)), clip->thumbProducer(), SLOT(getVideoThumbs(int, int)));
@@ -122,14 +119,12 @@ ClipItem::~ClipItem()
         disconnect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
         disconnect(m_clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData()));
     }
-    delete m_startThumbTimer;
-    delete m_endThumbTimer;
     delete m_timeLine;
 }
 
 ClipItem *ClipItem::clone(ItemInfo info) const
 {
-    ClipItem *duplicate = new ClipItem(m_clip, info, m_fps, m_speed);
+    ClipItem *duplicate = new ClipItem(m_clip, info, m_fps, m_speed, m_strobe);
     if (m_clipType == IMAGE || m_clipType == TEXT) duplicate->slotSetStartThumb(m_startPix);
     else {
         if (info.cropStart == m_cropStart) duplicate->slotSetStartThumb(m_startPix);
@@ -147,6 +142,7 @@ void ClipItem::setEffectList(const EffectsList effectList)
 {
     m_effectList = effectList;
     m_effectNames = m_effectList.effectNames().join(" / ");
+    if (!m_effectList.isEmpty()) setSelectedEffect(0);
 }
 
 const EffectsList ClipItem::effectList()
@@ -170,6 +166,16 @@ void ClipItem::initEffect(QDomElement effect)
     for (int i = 0; i < params.count(); i++) {
         QDomElement e = params.item(i).toElement();
         kDebug() << "// init eff: " << e.attribute("name");
+
+        // Check if this effect has a variable parameter
+        if (e.attribute("default").startsWith('%')) {
+            double evaluatedValue = ProfilesDialog::getStringEval(projectScene()->profile(), e.attribute("default"));
+            e.setAttribute("default", evaluatedValue);
+            if (e.hasAttribute("value") && e.attribute("value").startsWith('%')) {
+                e.setAttribute("value", evaluatedValue);
+            }
+        }
+
         if (!e.isNull() && e.attribute("type") == "keyframe") {
             QString def = e.attribute("default");
             // Effect has a keyframe type parameter, we need to set the values
@@ -388,7 +394,7 @@ void ClipItem::updateKeyframeEffect()
         if (!e.isNull() && e.attribute("type") == "keyframe") {
             QString keyframes;
             if (m_keyframes.count() > 1) {
-                QMap<int, double>::const_iterator i = m_keyframes.constBegin();
+                QMap<int, int>::const_iterator i = m_keyframes.constBegin();
                 while (i != m_keyframes.constEnd()) {
                     keyframes.append(QString::number(i.key()) + ':' + QString::number(i.value()) + ';');
                     ++i;
@@ -580,6 +586,7 @@ QDomElement ClipItem::xml() const
 {
     QDomElement xml = m_clip->toXML();
     if (m_speed != 1.0) xml.setAttribute("speed", m_speed);
+    if (m_strobe > 1) xml.setAttribute("strobe", m_strobe);
     if (m_audioOnly) xml.setAttribute("audio_only", 1);
     else if (m_videoOnly) xml.setAttribute("video_only", 1);
     return xml;
@@ -1071,24 +1078,6 @@ void ClipItem::setFadeOut(int pos)
 
 }
 
-// virtual
-void ClipItem::mousePressEvent(QGraphicsSceneMouseEvent * event)
-{
-    /*m_resizeMode = operationMode(event->pos());
-    if (m_resizeMode == MOVE) {
-      m_maxTrack = scene()->sceneRect().height();
-      m_grabPoint = (int) (event->pos().x() - rect().x());
-    }*/
-    QGraphicsRectItem::mousePressEvent(event);
-}
-
-// virtual
-void ClipItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * event)
-{
-    m_resizeMode = NONE;
-    QGraphicsRectItem::mouseReleaseEvent(event);
-}
-
 /*
 //virtual
 void ClipItem::hoverEnterEvent(QGraphicsSceneHoverEvent *e)
@@ -1130,7 +1119,7 @@ void ClipItem::resizeStart(int posx, double /*speed*/)
         checkEffectsKeyframesPos(previous, cropStart().frames(m_fps), true);
         if (m_hasThumbs && KdenliveSettings::videothumbnails()) {
             /*connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));*/
-            m_startThumbTimer->start(150);
+            m_startThumbTimer.start(150);
         }
     }
 }
@@ -1147,7 +1136,7 @@ void ClipItem::resizeEnd(int posx, double /*speed*/, bool updateKeyFrames)
         if (updateKeyFrames) checkEffectsKeyframesPos(previous, (cropStart() + cropDuration()).frames(m_fps), false);
         if (m_hasThumbs && KdenliveSettings::videothumbnails()) {
             /*connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));*/
-            m_endThumbTimer->start(150);
+            m_endThumbTimer.start(150);
         }
     }
 }
@@ -1293,14 +1282,14 @@ void ClipItem::setEffectAt(int ix, QDomElement effect)
         kDebug() << "Invalid effect index: " << ix;
         return;
     }
-    kDebug() << "CHange EFFECT AT: " << ix << ", CURR: " << m_effectList.at(ix).attribute("tag") << ", NEW: " << effect.attribute("tag");
+    //kDebug() << "CHange EFFECT AT: " << ix << ", CURR: " << m_effectList.at(ix).attribute("tag") << ", NEW: " << effect.attribute("tag");
     effect.setAttribute("kdenlive_ix", ix + 1);
     m_effectList.insert(ix, effect);
     m_effectList.removeAt(ix + 1);
     m_effectNames = m_effectList.effectNames().join(" / ");
     QString id = effect.attribute("id");
     if (id == "fadein" || id == "fadeout" || id == "fade_from_black" || id == "fade_to_black")
-        update(boundingRect());
+        update();
     else {
         QRectF r = boundingRect();
         r.setHeight(20);
@@ -1345,9 +1334,7 @@ EffectsParameterList ClipItem::addEffect(QDomElement effect, bool animate)
                 parameters.addParam("endtag", e.attribute("endtag", "end"));
             }
 
-            double f = e.attribute("factor", "1").toDouble();
-
-            if (f == 1) {
+            if (e.attribute("factor", "1") == "1") {
                 parameters.addParam(e.attribute("name"), e.attribute("value"));
 
                 // check if it is a fade effect
@@ -1393,7 +1380,11 @@ EffectsParameterList ClipItem::addEffect(QDomElement effect, bool animate)
                     }
                 }
             } else {
-                parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / f));
+                double fact;
+                if (e.attribute("factor").startsWith('%')) {
+                    fact = ProfilesDialog::getStringEval(projectScene()->profile(), e.attribute("factor"));
+                } else fact = e.attribute("factor", "1").toDouble();
+                parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / fact));
             }
         }
     }
@@ -1453,7 +1444,11 @@ EffectsParameterList ClipItem::getEffectArgs(QDomElement effect)
             parameters.addParam("start", neu);
         } else {
             if (e.attribute("factor", "1") != "1") {
-                parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / e.attribute("factor").toDouble()));
+                double fact;
+                if (e.attribute("factor").startsWith('%')) {
+                    fact = ProfilesDialog::getStringEval(projectScene()->profile(), e.attribute("factor"));
+                } else fact = e.attribute("factor", "1").toDouble();
+                parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / fact));
             } else {
                 parameters.addParam(e.attribute("name"), e.attribute("value"));
             }
@@ -1502,9 +1497,15 @@ double ClipItem::speed() const
     return m_speed;
 }
 
-void ClipItem::setSpeed(const double speed)
+int ClipItem::strobe() const
+{
+    return m_strobe;
+}
+
+void ClipItem::setSpeed(const double speed, const int strobe)
 {
     m_speed = speed;
+    m_strobe = strobe;
     if (m_speed == 1.0) m_clipName = baseClip()->name();
     else m_clipName = baseClip()->name() + " - " + QString::number(speed * 100, 'f', 0) + '%';
     //update();