]> git.sesse.net Git - kdenlive/blobdiff - src/clipitem.cpp
Looks like I finally got the profile switching work!
[kdenlive] / src / clipitem.cpp
index ebec5e33a5f1bf783597c3482817155e4d0a6f45..3823623f22f80b939cc4a53fe49471eae1ffde74 100644 (file)
 #include "kdenlivesettings.h"
 
 ClipItem::ClipItem(DocClipBase *clip, int track, GenTime startpos, const QRectF & rect, GenTime duration, double fps)
-        : QGraphicsRectItem(rect), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_track(track), m_startPos(startpos), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_startFade(0), m_endFade(0), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_thumbsRequested(0), m_fps(fps), m_hover(false) {
+        : AbstractClipItem(rect), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), m_effectsCounter(1), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_thumbsRequested(0), m_hover(false) {
     //setToolTip(name);
     // kDebug() << "*******  CREATING NEW TML CLIP, DUR: " << duration;
+    m_fps = fps;
+    m_startPos = startpos;
+    m_track = track;
     m_xml = clip->toXML();
     m_clipName = clip->name();
     m_producer = clip->getId();
@@ -81,10 +84,12 @@ ClipItem::ClipItem(DocClipBase *clip, int track, GenTime startpos, const QRectF
         connect(endThumbTimer, SIGNAL(timeout()), this, SLOT(slotGetEndThumb()));
 
     } else if (m_clipType == COLOR) {
+        m_maxDuration = GenTime(10000, m_fps);
         QString colour = m_xml.attribute("colour");
         colour = colour.replace(0, 2, "#");
         setBrush(QColor(colour.left(7)));
     } else if (m_clipType == IMAGE) {
+        m_maxDuration = GenTime(10000, m_fps);
         m_startPix = KThumb::getImage(KUrl(m_xml.attribute("resource")), (int)(50 * KdenliveSettings::project_display_ratio()), 50);
     } else if (m_clipType == AUDIO) {
         connect(clip, SIGNAL(gotAudioData()), this, SLOT(slotGotAudioData()));
@@ -126,7 +131,7 @@ void ClipItem::slotGotAudioData() {
 }
 
 int ClipItem::type() const {
-    return 70000;
+    return AVWIDGET;
 }
 
 DocClipBase *ClipItem::baseClip() {
@@ -149,30 +154,6 @@ int ClipItem::clipProducer() {
     return m_producer;
 }
 
-GenTime ClipItem::maxDuration() const {
-    return m_maxDuration;
-}
-
-GenTime ClipItem::duration() const {
-    return m_cropDuration;
-}
-
-GenTime ClipItem::startPos() const {
-    return m_startPos;
-}
-
-GenTime ClipItem::cropStart() const {
-    return m_cropStart;
-}
-
-GenTime ClipItem::endPos() const {
-    return m_startPos + m_cropDuration;
-}
-
-double ClipItem::fps() const {
-    return m_fps;
-}
-
 void ClipItem::flashClip() {
     if (m_timeLine == 0) {
         m_timeLine = new QTimeLine(750, this);
@@ -192,8 +173,10 @@ void ClipItem::paint(QPainter *painter,
                      QWidget *widget) {
     painter->setOpacity(m_opacity);
     QBrush paintColor = brush();
+
     if (isSelected()) paintColor = QBrush(QColor(79, 93, 121));
     QRectF br = rect();
+    double scale = br.width() / m_cropDuration.frames(m_fps);
     QRect rectInView;//this is the rect that is visible by the user
     if (scene()->views().size() > 0) {
         rectInView = scene()->views()[0]->viewport()->rect();
@@ -207,6 +190,7 @@ void ClipItem::paint(QPainter *painter,
     clippath.addRect(rectInView);
 
     int startpixel = (int)(rectInView.x() - rect().x()); //start and endpixel that is viewable from rect()
+
     if (startpixel < 0)
         startpixel = 0;
     int endpixel = rectInView.width() + rectInView.x();
@@ -229,7 +213,7 @@ void ClipItem::paint(QPainter *painter,
     int br_endy = (int)(br.y() + br.height());
     int left_upper = 0, left_lower = 0, right_upper = 0, right_lower = 0;
 
-    if (m_hover) {
+    if (m_hover && false) {
         if (!true) /*TRANSITIONSTART to upper clip*/
             left_upper = 40;
         if (!false) /*TRANSITIONSTART to lower clip*/
@@ -253,7 +237,9 @@ void ClipItem::paint(QPainter *painter,
     roundRectPathLower.arcTo(br_endx - roundingX - right_lower , br_endy - roundingY, roundingX, roundingY, 270.0, 90.0);
     roundRectPathLower.lineTo(br_endx - right_lower , br_halfy);
 
-    painter->setClipPath(roundRectPathUpper.united(roundRectPathLower).intersected(clippath), Qt::IntersectClip);
+    QPainterPath resultClipPath = roundRectPathUpper.united(roundRectPathLower);
+
+    painter->setClipPath(resultClipPath.intersected(clippath), Qt::IntersectClip);
     //painter->fillPath(roundRectPath, brush()); //, QBrush(QColor(Qt::red)));
     painter->fillRect(br.intersected(rectInView), paintColor);
     //painter->fillRect(QRectF(br.x() + br.width() - m_endPix.width(), br.y(), m_endPix.width(), br.height()), QBrush(QColor(Qt::black)));
@@ -282,20 +268,18 @@ void ClipItem::paint(QPainter *painter,
         if (m_clipType == AV) painter->fillPath(path, QBrush(QColor(200, 200, 200, 140)));
 
         int channels = 2;
-        double pixelForOneFrame = (double)br.width() / duration().frames(m_fps);
-        if (pixelForOneFrame != framePixelWidth)
+        if (scale != framePixelWidth)
             audioThumbCachePic.clear();
-        emit prepareAudioThumb(pixelForOneFrame, path, startpixel, endpixel + 200);//200 more for less missing parts before repaint after scrolling
-
+        emit prepareAudioThumb(scale, path, startpixel, endpixel + 200);//200 more for less missing parts before repaint after scrolling
+        int cropLeft = (m_cropStart).frames(m_fps) * scale;
         for (int startCache = startpixel - startpixel % 100; startCache < endpixel + 300;startCache += 100) {
             if (audioThumbCachePic.contains(startCache) && !audioThumbCachePic[startCache].isNull())
-                painter->drawPixmap((int)(roundRectPathUpper.united(roundRectPathLower).boundingRect().x() + startCache), (int)(path.boundingRect().y()), audioThumbCachePic[startCache]);
+                painter->drawPixmap((int)(roundRectPathUpper.united(roundRectPathLower).boundingRect().x() + startCache - cropLeft), (int)(path.boundingRect().y()), audioThumbCachePic[startCache]);
         }
 
     }
 
     // draw start / end fades
-    double scale = br.width() / m_cropDuration.frames(m_fps);
     QBrush fades;
     if (isSelected()) {
         fades = QBrush(QColor(200, 50, 50, 150));
@@ -372,8 +356,7 @@ void ClipItem::paint(QPainter *painter,
     pen.setWidth(2);
     if (isSelected()) painter->setPen(pen);
     painter->setClipRect(option->exposedRect);
-    painter->drawPath(roundRectPathUpper.united(roundRectPathLower).intersected(clippath));
-
+    painter->drawPath(resultClipPath.intersected(clippath));
 
     //painter->fillRect(startpixel,0,startpixel+endpixel,(int)br.height(),  QBrush(QColor(255,255,255,150)));
     //painter->fillRect(QRect(br.x(), br.y(), roundingX, roundingY), QBrush(QColor(Qt::green)));
@@ -410,6 +393,7 @@ OPERATIONTYPE ClipItem::operationMode(QPointF pos, double scale) {
     else if (abs((int)(pos.x() - (rect().x() + rect().width()))) < 6) return RESIZEEND;
     else if (abs((int)(pos.x() - (rect().x() + 10))) < 6 && abs((int)(pos.y() - (rect().y() + rect().height() / 2 - 5))) < 6) return TRANSITIONSTART;
     else if (abs((int)(pos.x() - (rect().x() + rect().width() - 20))) < 6 && abs((int)(pos.y() - (rect().y() + rect().height() / 2 - 5))) < 6) return TRANSITIONEND;
+
     return MOVE;
 }
 
@@ -493,13 +477,7 @@ void ClipItem::slotPrepareAudioThumb(double pixelForOneFrame, QPainterPath path,
     //}
 }
 
-int ClipItem::fadeIn() const {
-    return m_startFade;
-}
 
-int ClipItem::fadeOut() const {
-    return m_endFade;
-}
 
 void ClipItem::setFadeIn(int pos, double scale) {
     int oldIn = m_startFade;
@@ -549,95 +527,13 @@ void ClipItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *) {
     update();
 }
 
-void ClipItem::moveTo(int x, double scale, double offset, int newTrack) {
-    double origX = rect().x();
-    double origY = rect().y();
-    bool success = true;
-    if (x < 0) return;
-    setRect(x * scale, origY + offset, rect().width(), rect().height());
-    QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect);
-    if (collisionList.size() == 0) m_track = newTrack;
-    for (int i = 0; i < collisionList.size(); ++i) {
-        QGraphicsItem *item = collisionList.at(i);
-        if (item->type() == 70000) {
-            if (offset == 0) {
-                QRectF other = ((QGraphicsRectItem *)item)->rect();
-                if (x < m_startPos.frames(m_fps)) {
-                    kDebug() << "COLLISION, MOVING TO------";
-                    m_startPos = ((ClipItem *)item)->endPos() + GenTime(1, m_fps);
-                    origX = m_startPos.frames(m_fps) * scale;
-                } else {
-                    kDebug() << "COLLISION, MOVING TO+++";
-                    m_startPos = ((ClipItem *)item)->startPos() - m_cropDuration;
-                    origX = m_startPos.frames(m_fps) * scale;
-                }
-            }
-            setRect(origX, origY, rect().width(), rect().height());
-            offset = 0;
-            origX = rect().x();
-            success = false;
-            break;
-        }
-    }
-    if (success) {
-        m_track = newTrack;
-        m_startPos = GenTime(x, m_fps);
-    }
-    /*    QList <QGraphicsItem *> childrenList = QGraphicsItem::children();
-        for (int i = 0; i < childrenList.size(); ++i) {
-          childrenList.at(i)->moveBy(rect().x() - origX , offset);
-        }*/
-}
-
 void ClipItem::resizeStart(int posx, double scale) {
-    GenTime durationDiff = GenTime(posx, m_fps) - m_startPos;
-    if (durationDiff == GenTime()) return;
-    //kDebug() << "-- RESCALE: CROP=" << m_cropStart << ", DIFF = " << durationDiff;
-    if (m_cropStart + durationDiff < GenTime()) {
-        durationDiff = GenTime() - m_cropStart;
-    } else if (durationDiff >= m_cropDuration) {
-        durationDiff = m_cropDuration - GenTime(3, m_fps);
-    }
-    m_startPos += durationDiff;
-    m_cropStart += durationDiff;
-    m_cropDuration = m_cropDuration - durationDiff;
-    setRect(m_startPos.frames(m_fps) * scale, rect().y(), m_cropDuration.frames(m_fps) * scale, rect().height());
-    QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect);
-    for (int i = 0; i < collisionList.size(); ++i) {
-        QGraphicsItem *item = collisionList.at(i);
-        if (item->type() == 70000) {
-            GenTime diff = ((ClipItem *)item)->endPos() + GenTime(1, m_fps) - m_startPos;
-            setRect((m_startPos + diff).frames(m_fps) * scale, rect().y(), (m_cropDuration - diff).frames(m_fps) * scale, rect().height());
-            m_startPos += diff;
-            m_cropStart += diff;
-            m_cropDuration = m_cropDuration - diff;
-            break;
-        }
-    }
+    AbstractClipItem::resizeStart(posx, scale);
     if (m_hasThumbs) startThumbTimer->start(100);
 }
 
 void ClipItem::resizeEnd(int posx, double scale) {
-    GenTime durationDiff = GenTime(posx, m_fps) - endPos();
-    if (durationDiff == GenTime()) return;
-    //kDebug() << "-- RESCALE: CROP=" << m_cropStart << ", DIFF = " << durationDiff;
-    if (m_cropDuration + durationDiff <= GenTime()) {
-        durationDiff = GenTime() - (m_cropDuration - GenTime(3, m_fps));
-    } else if (m_cropDuration + durationDiff >= m_maxDuration) {
-        durationDiff = m_maxDuration - m_cropDuration;
-    }
-    m_cropDuration += durationDiff;
-    setRect(m_startPos.frames(m_fps) * scale, rect().y(), m_cropDuration.frames(m_fps) * scale, rect().height());
-    QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect);
-    for (int i = 0; i < collisionList.size(); ++i) {
-        QGraphicsItem *item = collisionList.at(i);
-        if (item->type() == 70000) {
-            GenTime diff = ((ClipItem *)item)->startPos() - GenTime(1, m_fps) - startPos();
-            m_cropDuration = diff;
-            setRect(m_startPos.frames(m_fps) * scale, rect().y(), m_cropDuration.frames(m_fps) * scale, rect().height());
-            break;
-        }
-    }
+    AbstractClipItem::resizeEnd(posx, scale);
     if (m_hasThumbs) endThumbTimer->start(100);
 }
 
@@ -645,14 +541,6 @@ void ClipItem::resizeEnd(int posx, double scale) {
 void ClipItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event) {
 }
 
-int ClipItem::track() const {
-    return  m_track;
-}
-
-void ClipItem::setTrack(int track) {
-    m_track = track;
-}
-
 int ClipItem::effectsCounter() {
     return m_effectsCounter++;
 }
@@ -742,11 +630,6 @@ void ClipItem::deleteEffect(QString index) {
     update(boundingRect());
 }
 
-void ClipItem::addTransition(Transition tr) {
-    m_transitionsList.append(&tr);
-    update();
-}
-
 //virtual
 void ClipItem::dropEvent(QGraphicsSceneDragDropEvent * event) {
     QString effects = QString(event->mimeData()->data("kdenlive/effectslist"));