]> git.sesse.net Git - kdenlive/commitdiff
Fix detection of overlapping transitions
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 13 Jun 2011 15:21:33 +0000 (15:21 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 13 Jun 2011 15:21:33 +0000 (15:21 +0000)
svn path=/trunk/kdenlive/; revision=5709

src/abstractclipitem.cpp
src/abstractclipitem.h
src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp
src/transition.cpp
src/transition.h

index 8fb767be27c83b8fa7548537e5776f389a10c172..f0e8061b950f015ec36bc16f5ae5ebbd790deb02 100644 (file)
@@ -487,3 +487,14 @@ void AbstractClipItem::mousePressEvent(QGraphicsSceneMouseEvent * event)
     }
 }
 
+int AbstractClipItem::itemHeight()
+{
+    return 0;
+}
+
+int AbstractClipItem::itemOffset()
+{
+    return 0;
+}
+
+
index b04f5712632e00fdd689485d6a0a7fb77ee3a108..bf554e0b56dacc6e7e52b81bb50919d88e66bbb2 100644 (file)
@@ -75,6 +75,11 @@ public:
     virtual int track() const ;
     virtual GenTime cropStart() const ;
     virtual GenTime cropDuration() const ;
+    /** @brief Return the current item's height */
+    static int itemHeight();
+    /** @brief Return the current item's vertical offset
+     *         For example transitions are drawn at 1/3 of track height */
+    static int itemOffset();
 
     /** @brief Resizes the clip from the start.
     * @param posx Absolute position of new in point
index d7d9819c0458cfcf15604249ca9369dbbad2132f..aeda00c815cc16e99c66c7e85c5c4a8c382a89ad 100644 (file)
@@ -60,8 +60,8 @@ ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, i
         m_framePixelWidth(0)
 {
     setZValue(2);
-    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);
+    setRect(0, 0, (info.endPos - info.startPos).frames(fps) - 0.02, (double) itemHeight());
+    setPos(info.startPos.frames(fps), (double)(info.track * KdenliveSettings::trackheight()) + 1 + itemOffset());
 
     // set speed independant info
     if (m_speed <= 0 && m_speed > -1)
@@ -969,6 +969,11 @@ OPERATIONTYPE ClipItem::operationMode(QPointF pos)
     return MOVE;
 }
 
+int ClipItem::itemHeight()
+{
+    return KdenliveSettings::trackheight() - 2;
+}
+
 QList <GenTime> ClipItem::snapMarkers() const
 {
     QList < GenTime > snaps;
index 9c6f4434fb02007cd84c30e2f6e6297992b23bae..87b9baa665d7b70b4881b4a09257cfa7282f3188 100644 (file)
@@ -55,6 +55,7 @@ public:
     void resizeStart(int posx, bool size = true);
     void resizeEnd(int posx);
     OPERATIONTYPE operationMode(QPointF pos);
+    static int itemHeight();
     const QString clipProducer() const;
     int clipType() const;
     DocClipBase *baseClip() const;
index 21ce40ba1526fe413791ee9003308055f8a3bda3..56bc2b743d412eb7f315123b913514d55d960147 100644 (file)
@@ -5309,10 +5309,22 @@ bool CustomTrackView::canBePastedTo(ItemInfo info, int type) const
         // If we are in overwrite mode, always allow the move
         return true;
     }
-    QRectF rect((double) info.startPos.frames(m_document->fps()), (double)(info.track * m_tracksHeight + 1), (double)(info.endPos - info.startPos).frames(m_document->fps()), (double)(m_tracksHeight - 1));
+    int height;
+    int offset = 0;
+    if (type == TRANSITIONWIDGET) {
+        height = Transition::itemHeight();
+        offset = Transition::itemOffset();
+    }
+    else if (type == AVWIDGET) {
+        height = ClipItem::itemHeight();
+        offset = ClipItem::itemOffset();
+    }
+    QRectF rect((double) info.startPos.frames(m_document->fps()), (double)(info.track * m_tracksHeight + 1 + offset), (double)(info.endPos - info.startPos).frames(m_document->fps()), (double) height);
     QList<QGraphicsItem *> collisions = scene()->items(rect, Qt::IntersectsItemBoundingRect);
     for (int i = 0; i < collisions.count(); i++) {
-        if (collisions.at(i)->type() == type) return false;
+        if (collisions.at(i)->type() == type) {
+            return false;
+        }
     }
     return true;
 }
index 811cc8ba1b8aed3062f81b17884dce93b04ba541..eefa77bfed643e4c8bdc525deb4d71ff3229185d 100644 (file)
@@ -40,19 +40,19 @@ Transition::Transition(const ItemInfo info, int transitiontrack, double fps, QDo
 {
     setZValue(3);
     m_info.cropDuration = info.endPos - info.startPos;
-    setPos(info.startPos.frames(fps), (qreal)(info.track * KdenliveSettings::trackheight() + KdenliveSettings::trackheight() / 3 * 2));
+    setPos(info.startPos.frames(fps), (qreal)(info.track * KdenliveSettings::trackheight() + itemOffset() + 1));
 
 #if QT_VERSION >= 0x040600
     m_startAnimation = new QPropertyAnimation(this, "rect");
     m_startAnimation->setDuration(200);
-    QRectF r(0, 0, m_info.cropDuration.frames(fps) - 0.02, (qreal)(KdenliveSettings::trackheight() / 3 + 5));
-    QRectF r2(0, 0, m_info.cropDuration.frames(fps) - 0.02, (qreal)(KdenliveSettings::trackheight() / 3 * 2 - 1));
+    QRectF r(0, 0, m_info.cropDuration.frames(fps) - 0.02, (qreal) itemHeight() / 2);
+    QRectF r2(0, 0, m_info.cropDuration.frames(fps) - 0.02, (qreal)itemHeight());
     m_startAnimation->setStartValue(r);
     m_startAnimation->setEndValue(r2);
     m_startAnimation->setEasingCurve(QEasingCurve::OutQuad);
     m_startAnimation->start();
 #else
-    setRect(0, 0, m_info.cropDuration.frames(fps) - 0.02, (qreal)(KdenliveSettings::trackheight() / 3 * 2 - 1));
+    setRect(0, 0, m_info.cropDuration.frames(fps) - 0.02, (qreal) itemHeight());
 #endif
 
     m_info.cropStart = GenTime();
@@ -303,6 +303,16 @@ OPERATIONTYPE Transition::operationMode(QPointF pos)
     return MOVE;
 }
 
+int Transition::itemHeight()
+{
+    return (int) (KdenliveSettings::trackheight() / 3 * 2 - 1);
+}
+
+int Transition::itemOffset()
+{
+    return (int) (KdenliveSettings::trackheight() / 3 * 2);
+}
+
 bool Transition::hasClip(const ClipItem * clip) const
 {
     if (clip == m_secondClip) return true;
index c70405fe87bc150deaf1f5381bac4b105f45487e..a904d1d670fb03b9882a51175fa7ad9f9c68d7f4 100644 (file)
@@ -59,6 +59,8 @@ public:
     QString transitionTag() const;
     QStringList transitionInfo() const;
     OPERATIONTYPE operationMode(QPointF pos);
+    static int itemHeight();
+    static int itemOffset();
     //const QMap < QString, QString > transitionParameters() const;
     void setTransitionParameters(const QDomElement params);
     void setTransitionDirection(bool inv);