X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fabstractclipitem.cpp;h=427aa0d8bde5cdf330567f28fc228f4ec81e0848;hb=8191e28c244126b4a6e6eedbf3f56a88ab983825;hp=c0d8bb802b79eb0cc46aab2f653439ab50b9b810;hpb=d5e2d9e691b22dab741ed689df6d87478ba24c9f;p=kdenlive diff --git a/src/abstractclipitem.cpp b/src/abstractclipitem.cpp index c0d8bb80..427aa0d8 100644 --- a/src/abstractclipitem.cpp +++ b/src/abstractclipitem.cpp @@ -28,6 +28,7 @@ #include "abstractclipitem.h" #include "customtrackscene.h" +#include "kdenlivesettings.h" AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect, double fps): QGraphicsRectItem(rect), m_track(0), m_fps(fps), m_editedKeyframe(-1), m_selectedKeyframe(0), m_keyframeFactor(1) { setFlags(/*QGraphicsItem::ItemClipsToShape | */QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); @@ -40,7 +41,7 @@ ItemInfo AbstractClipItem::info() const { ItemInfo itemInfo; itemInfo.startPos = startPos(); itemInfo.endPos = endPos(); - itemInfo.cropStart = cropStart(); + itemInfo.cropStart = m_cropStart; itemInfo.track = track(); return itemInfo; } @@ -57,57 +58,85 @@ GenTime AbstractClipItem::cropStart() const { return m_cropStart; } +GenTime AbstractClipItem::cropDuration() const { + return m_cropDuration; +} + void AbstractClipItem::setCropStart(GenTime pos) { m_cropStart = pos; } -void AbstractClipItem::resizeStart(int posx) { +void AbstractClipItem::updateItem() { + m_track = (int)(scenePos().y() / KdenliveSettings::trackheight()); + m_startPos = GenTime((int) scenePos().x(), m_fps); +} + +void AbstractClipItem::updateRectGeometry() { + setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); +} + +void AbstractClipItem::resizeStart(int posx, double speed) { GenTime durationDiff = GenTime(posx, m_fps) - m_startPos; if (durationDiff == GenTime()) return; - //kDebug() << "-- RESCALE: CROP=" << m_cropStart << ", DIFF = " << durationDiff; + //kDebug() << "-- RESCALE DIFF=" << durationDiff.frames(25) << ", CLIP: " << startPos().frames(25) << "-" << endPos().frames(25); - if (type() == AVWIDGET && m_cropStart + durationDiff < GenTime()) { - durationDiff = GenTime() - m_cropStart; + if (type() == AVWIDGET && cropStart() + durationDiff < GenTime()) { + durationDiff = GenTime() - cropStart(); } else if (durationDiff >= m_cropDuration) { - durationDiff = m_cropDuration - GenTime(3, m_fps); + return; + if (m_cropDuration > GenTime(3, m_fps)) durationDiff = GenTime(3, m_fps); + else return; } m_startPos += durationDiff; - if (type() == AVWIDGET) m_cropStart += durationDiff; - m_cropDuration = m_cropDuration - durationDiff; + if (type() == AVWIDGET) m_cropStart += durationDiff * speed; + m_cropDuration = m_cropDuration - durationDiff * speed; + + setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); + setPos(m_startPos.frames(m_fps), pos().y()); + if (pos().x() != m_startPos.frames(m_fps)) { + GenTime diff = GenTime(pos().x(), m_fps) - m_startPos; + m_startPos += diff; + m_cropDuration = m_cropDuration - diff; + if (type() == AVWIDGET) m_cropStart = m_cropStart + diff; + setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); + } - setRect(0, 0, m_cropDuration.frames(m_fps) - 0.02, rect().height()); - setPos((qreal) m_startPos.frames(m_fps), pos().y()); + + //kDebug() << "-- NEW CLIP=" << startPos().frames(25) << "-" << endPos().frames(25); //setRect((double) m_startPos.frames(m_fps) * scale, rect().y(), (double) m_cropDuration.frames(m_fps) * scale, rect().height()); - if (durationDiff < GenTime()) { - QList collisionList = collidingItems(Qt::IntersectsItemBoundingRect); - for (int i = 0; i < collisionList.size(); ++i) { - QGraphicsItem *item = collisionList.at(i); - if (item->type() == type() && item->pos().x() < pos().x()) { - kDebug() << "///////// COLLISION DETECTED!!!!!!!!!"; - GenTime diff = ((AbstractClipItem *)item)->endPos() + GenTime(1, m_fps) - m_startPos; - setRect(0, 0, (m_cropDuration - diff).frames(m_fps) - 0.02, rect().height()); - setPos((qreal)(m_startPos + diff).frames(m_fps), pos().y()); - m_startPos += diff; - if (type() == AVWIDGET) m_cropStart += diff; - m_cropDuration = m_cropDuration - diff; - break; + + /* if (durationDiff < GenTime()) { + QList collisionList = collidingItems(Qt::IntersectsItemBoundingRect); + for (int i = 0; i < collisionList.size(); ++i) { + QGraphicsItem *item = collisionList.at(i); + if (item->type() == type() && item->pos().x() < pos().x()) { + kDebug() << "///////// COLLISION DETECTED!!!!!!!!!"; + GenTime diff = ((AbstractClipItem *)item)->endPos() + GenTime(1, m_fps) - m_startPos; + setRect(0, 0, (m_cropDuration - diff).frames(m_fps) - 0.02, rect().height()); + setPos((m_startPos + diff).frames(m_fps), pos().y()); + m_startPos += diff; + if (type() == AVWIDGET) m_cropStart += diff; + m_cropDuration = m_cropDuration - diff; + break; + } } - } - } + }*/ } -void AbstractClipItem::resizeEnd(int posx) { +void AbstractClipItem::resizeEnd(int posx, double speed, bool updateKeyFrames) { 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_cropStart + m_cropDuration + durationDiff >= maxDuration()) { - durationDiff = maxDuration() - m_cropDuration - m_cropStart; + //kDebug() << "// DUR DIFF1:" << durationDiff.frames(25) << ", ADJUSTED: " << durationDiff.frames(25) * speed << ", SPED:" << speed; + if (cropDuration() + durationDiff <= GenTime()) { + durationDiff = GenTime() - (cropDuration() - GenTime(3, m_fps)); + } else if (cropStart() + cropDuration() + durationDiff >= maxDuration()) { + kDebug() << "// MAX OVERLOAD:" << cropDuration().frames(25) << " + " << durationDiff.frames(25) << ", MAX:" << maxDuration().frames(25); + durationDiff = maxDuration() - cropDuration() - cropStart(); } - m_cropDuration += durationDiff; - setRect(0, 0, m_cropDuration.frames(m_fps) - 0.02, rect().height()); + //kDebug() << "// DUR DIFF2:" << durationDiff.frames(25) << ", ADJUSTED: " << durationDiff.frames(25) * speed << ", SPED:" << speed; + m_cropDuration += durationDiff * speed; + setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); if (durationDiff > GenTime()) { QList collisionList = collidingItems(Qt::IntersectsItemBoundingRect); for (int i = 0; i < collisionList.size(); ++i) { @@ -118,7 +147,7 @@ void AbstractClipItem::resizeEnd(int posx) { kDebug() << "///////// COLLISION: " << ((AbstractClipItem *)item)->startPos().frames(25) << "x" << ((AbstractClipItem *)item)->endPos().frames(25) << ", RECT: " << ((AbstractClipItem *)item)->rect() << "-" << item->pos(); GenTime diff = ((AbstractClipItem *)item)->startPos() - GenTime(1, m_fps) - startPos(); m_cropDuration = diff; - setRect(0, 0, (m_cropDuration.frames(m_fps)) - 0.02, rect().height()); + setRect(0, 0, m_cropDuration.frames(m_fps) - 0.02, rect().height()); break; } } @@ -349,5 +378,6 @@ QRect AbstractClipItem::visibleRect() { } CustomTrackScene* AbstractClipItem::projectScene() { - return static_cast (scene()); + if (scene()) return static_cast (scene()); + return NULL; }