]> git.sesse.net Git - kdenlive/blobdiff - src/clipitem.cpp
Fix painting issues (disappearing cursor, clip borders)
[kdenlive] / src / clipitem.cpp
index c03356452ac27db01501bf9ef9228a703d4eec56..31e89f224430cc0ca0d4f151237237519180da37 100644 (file)
@@ -104,6 +104,10 @@ ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, i
         setBrush(QColor(colour.left(7)));
     } else if (m_clipType == IMAGE || m_clipType == TEXT) {
         setBrush(QColor(141, 166, 215));
+        if (m_clipType == TEXT) {
+            connect(this, SIGNAL(getThumb(int, int)), clip->thumbProducer(), SLOT(extractImage(int, int)));
+            connect(clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));
+        }
         //m_startPix = KThumb::getImage(KUrl(clip->getProperty("resource")), (int)(KdenliveSettings::trackheight() * KdenliveSettings::project_display_ratio()), KdenliveSettings::trackheight());
     } else if (m_clipType == AUDIO) {
         setBrush(QColor(141, 215, 166));
@@ -131,7 +135,7 @@ ClipItem *ClipItem::clone(ItemInfo info) const
         if (info.cropStart + (info.endPos - info.startPos) == m_cropStart + m_cropDuration) duplicate->slotSetEndThumb(m_endPix);
     }
     //kDebug() << "// CLoning clip: " << (info.cropStart + (info.endPos - info.startPos)).frames(m_fps) << ", CURRENT end: " << (cropStart() + duration()).frames(m_fps);
-    duplicate->setEffectList(m_effectList.clone());
+    duplicate->setEffectList(m_effectList);
     duplicate->setVideoOnly(m_videoOnly);
     duplicate->setAudioOnly(m_audioOnly);
     //duplicate->setSpeed(m_speed);
@@ -140,12 +144,12 @@ ClipItem *ClipItem::clone(ItemInfo info) const
 
 void ClipItem::setEffectList(const EffectsList effectList)
 {
-    m_effectList = effectList;
+    m_effectList.clone(effectList);
     m_effectNames = m_effectList.effectNames().join(" / ");
     if (!m_effectList.isEmpty()) setSelectedEffect(0);
 }
 
-const EffectsList ClipItem::effectList()
+const EffectsList ClipItem::effectList() const
 {
     return m_effectList;
 }
@@ -452,7 +456,7 @@ void ClipItem::refreshClip(bool checkDuration)
 
 void ClipItem::slotFetchThumbs()
 {
-    if (m_clipType == IMAGE || m_clipType == TEXT) {
+    if (m_clipType == IMAGE) {
         if (m_startPix.isNull()) {
             m_startPix = KThumb::getImage(KUrl(m_clip->getProperty("resource")), (int)(KdenliveSettings::trackheight() * KdenliveSettings::project_display_ratio()), KdenliveSettings::trackheight());
             update();
@@ -460,6 +464,11 @@ void ClipItem::slotFetchThumbs()
         return;
     }
 
+    if (m_clipType == TEXT) {
+        if (m_startPix.isNull()) slotGetStartThumb();
+        return;
+    }
+
     if (m_endPix.isNull() && m_startPix.isNull()) {
         m_startThumbRequested = true;
         m_endThumbRequested = true;
@@ -634,9 +643,6 @@ void ClipItem::paint(QPainter *painter,
                      const QStyleOptionGraphicsItem *option,
                      QWidget *)
 {
-    /*if (parentItem()) m_opacity = 0.5;
-    else m_opacity = 1.0;
-    painter->setOpacity(m_opacity);*/
     QColor paintColor;
     if (parentItem()) paintColor = QColor(255, 248, 149);
     else paintColor = brush().color();
@@ -668,26 +674,24 @@ 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()) {
             double left = itemWidth - m_startPix.width() * vscale / scale;
-            QRectF pixrect(left, 0.0, m_startPix.width() * vscale / scale, m_startPix.height());
-            QRectF source(0.0, 0.0, (double) m_startPix.width(), (double) m_startPix.height());
+            const QRectF pixrect(left, 0.0, m_startPix.width() * vscale / scale, m_startPix.height());
             painter->drawPixmap(pixrect, m_startPix, source);
             QLineF l2(left, 0, left, m_startPix.height());
             painter->drawLine(l2);
         } else if (!m_endPix.isNull()) {
             double left = itemWidth - m_endPix.width() * vscale / scale;
-            QRectF pixrect(left, 0.0, m_endPix.width() * vscale / scale, m_endPix.height());
-            QRectF source(0.0, 0.0, (double) m_endPix.width(), (double) m_endPix.height());
+            const QRectF pixrect(left, 0.0, m_endPix.width() * vscale / scale, m_endPix.height());
             painter->drawPixmap(pixrect, m_endPix, source);
             QLineF l2(left, 0, left, m_startPix.height());
             painter->drawLine(l2);
         }
         if (!m_startPix.isNull()) {
             double right = m_startPix.width() * vscale / scale;
-            QRectF pixrect(0.0, 0.0, right, m_startPix.height());
-            QRectF source(0.0, 0.0, (double) m_startPix.width(), (double) m_startPix.height());
+            const QRectF pixrect(0.0, 0.0, right, m_startPix.height());
             painter->drawPixmap(pixrect, m_startPix, source);
             QLineF l2(right, 0, right, m_startPix.height());
             painter->drawLine(l2);
@@ -739,8 +743,7 @@ void ClipItem::paint(QPainter *painter,
     QList < CommentedTime >::Iterator it = markers.begin();
     GenTime pos;
     double framepos;
-    QBrush markerBrush;
-    markerBrush = QBrush(QColor(120, 120, 0, 140));
+    QBrush markerBrush(QColor(120, 120, 0, 140));
     QPen pen = painter->pen();
     pen.setColor(QColor(255, 255, 255, 200));
     pen.setStyle(Qt::DotLine);
@@ -768,9 +771,7 @@ void ClipItem::paint(QPainter *painter,
             //painter->fillRect(QRect(br.x() + framepos, br.y(), 10, br.height()), QBrush(QColor(0, 0, 0, 150)));
         }
     }
-    pen.setColor(Qt::black);
-    pen.setStyle(Qt::SolidLine);
-    painter->setPen(pen);
+    painter->setPen(QPen());
 
     // draw start / end fades
     QBrush fades;
@@ -861,12 +862,16 @@ void ClipItem::paint(QPainter *painter,
 
     // draw clip border
     // expand clip rect to allow correct painting of clip border
+    QPen pen1(frameColor);
+    pen1.setWidthF(1.0);
+    pen1.setCosmetic(true);
+    painter->setPen(pen1);
 
-    exposed.setRight(exposed.right() + xoffset + 0.5);
+    /*exposed.setRight(exposed.right() + xoffset + 0.5);
     exposed.setBottom(exposed.bottom() + 1);
-    painter->setClipRect(exposed);
-
-    frameColor.setAlpha(alphaBase);
+    painter->setClipRect(exposed);*/
+    painter->setClipping(false);
+    /*frameColor.setAlpha(alphaBase);
     painter->setPen(frameColor);
     QLineF line(br.left() + xoffset, br.top(), br.right() - xoffset, br.top());
     painter->drawLine(line);
@@ -882,8 +887,8 @@ void ClipItem::paint(QPainter *painter,
 
     painter->setPen(QColor(255, 255, 255, 60));
     line.setLine(br.right() - xoffset, br.bottom() - 1.0, br.left() + xoffset, br.bottom() - 1.0);
-    painter->drawLine(line);
-    //painter->drawRect(br);
+    painter->drawLine(line);*/
+    painter->drawRect(br);
 }
 
 
@@ -1144,7 +1149,7 @@ void ClipItem::resizeEnd(int posx, double /*speed*/, bool updateKeyFrames)
 
 void ClipItem::checkEffectsKeyframesPos(const int previous, const int current, bool fromStart)
 {
-    for (int i = 0; i < m_effectList.size(); i++) {
+    for (int i = 0; i < m_effectList.count(); i++) {
         QDomElement effect = m_effectList.at(i);
         QDomNodeList params = effect.elementsByTagName("parameter");
         for (int j = 0; j < params.count(); j++) {
@@ -1257,7 +1262,7 @@ int ClipItem::effectsCounter()
 
 int ClipItem::effectsCount()
 {
-    return m_effectList.size();
+    return m_effectList.count();
 }
 
 int ClipItem::hasEffect(const QString &tag, const QString &id) const
@@ -1270,10 +1275,10 @@ QStringList ClipItem::effectNames()
     return m_effectList.effectNames();
 }
 
-QDomElement ClipItem::effectAt(int ix)
+QDomElement ClipItem::effectAt(int ix) const
 {
-    if (ix > m_effectList.count() - 1 || ix < 0) return QDomElement();
-    return m_effectList.at(ix);
+    if (ix > m_effectList.count() - 1 || ix < 0 || m_effectList.at(ix).isNull()) return QDomElement();
+    return m_effectList.at(ix).cloneNode().toElement();
 }
 
 void ClipItem::setEffectAt(int ix, QDomElement effect)
@@ -1297,24 +1302,16 @@ void ClipItem::setEffectAt(int ix, QDomElement effect)
     }
 }
 
-EffectsParameterList ClipItem::addEffect(QDomElement effect, bool animate)
+EffectsParameterList ClipItem::addEffect(const 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);
-
     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"));
+    if (effect.hasAttribute("disabled")) parameters.addParam("disabled", effect.attribute("disabled"));
 
-    QString state = effect.attribute("disabled");
-    if (!state.isEmpty()) {
-        parameters.addParam("disabled", state);
-    }
 
     QString effectId = effect.attribute("id");
     if (effectId.isEmpty()) effectId = effect.attribute("tag");
@@ -1405,17 +1402,14 @@ EffectsParameterList ClipItem::addEffect(QDomElement effect, bool animate)
     return parameters;
 }
 
-EffectsParameterList ClipItem::getEffectArgs(QDomElement effect)
+EffectsParameterList ClipItem::getEffectArgs(const 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()) {
-        parameters.addParam("disabled", state);
-    }
+    if (effect.hasAttribute("disabled")) parameters.addParam("disabled", effect.attribute("disabled"));
 
     QDomNodeList params = effect.elementsByTagName("parameter");
     for (int i = 0; i < params.count(); i++) {
@@ -1462,7 +1456,7 @@ void ClipItem::deleteEffect(QString index)
     bool needRepaint = false;
     QString ix;
 
-    for (int i = 0; i < m_effectList.size(); ++i) {
+    for (int i = 0; i < m_effectList.count(); ++i) {
         ix = m_effectList.at(i).attribute("kdenlive_ix");
         if (ix == index) {
             QString effectId = m_effectList.at(i).attribute("id");
@@ -1478,7 +1472,7 @@ void ClipItem::deleteEffect(QString index)
             m_effectList.removeAt(i);
             i--;
         } else if (ix.toInt() > index.toInt()) {
-            m_effectList[i].setAttribute("kdenlive_ix", ix.toInt() - 1);
+            m_effectList.item(i).setAttribute("kdenlive_ix", ix.toInt() - 1);
         }
     }
     m_effectNames = m_effectList.effectNames().join(" / ");
@@ -1534,12 +1528,15 @@ GenTime ClipItem::endPos() const
 //virtual
 void ClipItem::dropEvent(QGraphicsSceneDragDropEvent * event)
 {
-    QString effects = QString(event->mimeData()->data("kdenlive/effectslist"));
+    const QString effects = QString(event->mimeData()->data("kdenlive/effectslist"));
     QDomDocument doc;
     doc.setContent(effects, true);
-    QDomElement e = doc.documentElement();
-    CustomTrackView *view = (CustomTrackView *) scene()->views()[0];
-    if (view) view->slotAddEffect(e, m_startPos, track());
+    const QDomElement e = doc.documentElement();
+    if (scene() && !scene()->views().isEmpty()) {
+        event->accept();
+        CustomTrackView *view = (CustomTrackView *) scene()->views()[0];
+        if (view) view->slotAddEffect(e, m_startPos, track());
+    }
 }
 
 //virtual