From 74a50cb99d5215db8256af51d915d65dc276ea70 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 13 Jun 2011 15:21:33 +0000 Subject: [PATCH] Fix detection of overlapping transitions svn path=/trunk/kdenlive/; revision=5709 --- src/abstractclipitem.cpp | 11 +++++++++++ src/abstractclipitem.h | 5 +++++ src/clipitem.cpp | 9 +++++++-- src/clipitem.h | 1 + src/customtrackview.cpp | 16 ++++++++++++++-- src/transition.cpp | 18 ++++++++++++++---- src/transition.h | 2 ++ 7 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/abstractclipitem.cpp b/src/abstractclipitem.cpp index 8fb767be..f0e8061b 100644 --- a/src/abstractclipitem.cpp +++ b/src/abstractclipitem.cpp @@ -487,3 +487,14 @@ void AbstractClipItem::mousePressEvent(QGraphicsSceneMouseEvent * event) } } +int AbstractClipItem::itemHeight() +{ + return 0; +} + +int AbstractClipItem::itemOffset() +{ + return 0; +} + + diff --git a/src/abstractclipitem.h b/src/abstractclipitem.h index b04f5712..bf554e0b 100644 --- a/src/abstractclipitem.h +++ b/src/abstractclipitem.h @@ -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 diff --git a/src/clipitem.cpp b/src/clipitem.cpp index d7d9819c..aeda00c8 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -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 ClipItem::snapMarkers() const { QList < GenTime > snaps; diff --git a/src/clipitem.h b/src/clipitem.h index 9c6f4434..87b9baa6 100644 --- a/src/clipitem.h +++ b/src/clipitem.h @@ -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; diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 21ce40ba..56bc2b74 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -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 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; } diff --git a/src/transition.cpp b/src/transition.cpp index 811cc8ba..eefa77bf 100644 --- a/src/transition.cpp +++ b/src/transition.cpp @@ -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; diff --git a/src/transition.h b/src/transition.h index c70405fe..a904d1d6 100644 --- a/src/transition.h +++ b/src/transition.h @@ -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); -- 2.39.2