]> git.sesse.net Git - kdenlive/blobdiff - src/abstractclipitem.cpp
* New configuration page to set SDL audio/video driver and audio device
[kdenlive] / src / abstractclipitem.cpp
index 31be18b6a40805a4adaa68d0b09722fe57fc7b27..77a26f5b317456ebee8b643bfbc86af2d90dd17c 100644 (file)
  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
  ***************************************************************************/
 
-#include <KDebug>
 #include <QGraphicsScene>
 #include <QGraphicsView>
 #include <QScrollBar>
 #include <QToolTip>
 
+#include <KDebug>
+#include <KLocale>
+
 #include "abstractclipitem.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) {
+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);
     setTrack(info.track);
     m_startPos = info.startPos;
     m_cropDuration = info.endPos - info.startPos;
 }
 
-void AbstractClipItem::moveTo(int x, double scale, int offset, int newTrack) {
+ItemInfo AbstractClipItem::info() const {
+    ItemInfo itemInfo;
+    itemInfo.startPos = startPos();
+    itemInfo.endPos = endPos();
+    itemInfo.cropStart = cropStart();
+    itemInfo.track = track();
+    return itemInfo;
+}
+
+void AbstractClipItem::moveTo(int x, double scale, int offset, int newTrack, bool checkCollision) {
     double origX = rect().x();
     double origY = rect().y();
     bool success = true;
@@ -41,28 +52,29 @@ void AbstractClipItem::moveTo(int x, double scale, int offset, int newTrack) {
     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() == type()) {
-            if (offset == 0) {
-                QRectF other = ((QGraphicsRectItem *)item)->rect();
-                if (x < m_startPos.frames(m_fps)) {
-                    kDebug() << "COLLISION, MOVING TO------";
-                    m_startPos = ((AbstractClipItem *)item)->endPos();
-                    origX = m_startPos.frames(m_fps) * scale;
-                } else if (x > m_startPos.frames(m_fps)) {
-                    //kDebug() << "COLLISION, MOVING TO+++: "<<x<<", CLIP CURR POS: "<<m_startPos.frames(m_fps)<<", COLLIDING START: "<<((AbstractClipItem *)item)->startPos().frames(m_fps);
-                    m_startPos = ((AbstractClipItem *)item)->startPos() - m_cropDuration;
-                    origX = m_startPos.frames(m_fps) * scale;
+    if (checkCollision)
+        for (int i = 0; i < collisionList.size(); ++i) {
+            QGraphicsItem *item = collisionList.at(i);
+            if (item->type() == type()) {
+                if (offset == 0) {
+                    QRectF other = ((QGraphicsRectItem *)item)->rect();
+                    if (x < m_startPos.frames(m_fps)) {
+                        kDebug() << "COLLISION, MOVING TO------";
+                        m_startPos = ((AbstractClipItem *)item)->endPos();
+                        origX = m_startPos.frames(m_fps) * scale;
+                    } else if (x > m_startPos.frames(m_fps)) {
+                        //kDebug() << "COLLISION, MOVING TO+++: "<<x<<", CLIP CURR POS: "<<m_startPos.frames(m_fps)<<", COLLIDING START: "<<((AbstractClipItem *)item)->startPos().frames(m_fps);
+                        m_startPos = ((AbstractClipItem *)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;
             }
-            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);
@@ -124,8 +136,8 @@ void AbstractClipItem::resizeEnd(int posx, double scale) {
     //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 >= m_maxDuration) {
-        durationDiff = m_maxDuration - m_cropDuration - m_cropStart;
+    } else if (m_cropStart + m_cropDuration + durationDiff >= maxDuration()) {
+        durationDiff = maxDuration() - m_cropDuration - m_cropStart;
     }
     m_cropDuration += durationDiff;
     setRect(m_startPos.frames(m_fps) * scale, rect().y(), m_cropDuration.frames(m_fps) * scale, rect().height());
@@ -161,6 +173,10 @@ GenTime AbstractClipItem::maxDuration() const {
     return m_maxDuration;
 }
 
+void AbstractClipItem::setMaxDuration(const GenTime &max) {
+    m_maxDuration = max;
+}
+
 QPainterPath AbstractClipItem::upperRectPart(QRectF br) {
     QPainterPath roundRectPathUpper;
     double roundingY = 20;
@@ -211,41 +227,56 @@ QPainterPath AbstractClipItem::lowerRectPart(QRectF br) {
 }
 
 void AbstractClipItem::drawKeyFrames(QPainter *painter, QRectF exposedRect) {
+    if (m_keyframes.count() < 2) return;
     QRectF br = rect();
     double maxw = br.width() / m_cropDuration.frames(m_fps);
-    double maxh = br.height() / 100.0;
-    if (m_keyframes.count() > 1) {
-        QMap<int, double>::const_iterator i = m_keyframes.constBegin();
-        double x1;
-        double y1;
-        double x2;
-        double y2;
-        QColor color(Qt::blue);
-        x1 = br.x() + maxw * (i.key() - m_cropStart.frames(m_fps));
-        y1 = br.bottom() - i.value() * maxh;
-        while (i != m_keyframes.constEnd()) {
-            if (i.key() == m_selectedKeyframe) color = QColor(Qt::red);
-            else color = QColor(Qt::blue);
-            ++i;
-            if (i == m_keyframes.constEnd()) break;
-            x2 = br.x() + maxw * (i.key() - m_cropStart.frames(m_fps));
-            y2 = br.bottom() - i.value() * maxh;
-            QLineF l(x1, y1, x2, y2);
-            painter->drawLine(l);
-            if (isSelected()) {
-                painter->fillRect(x1 - 3, y1 - 3, 6, 6, QBrush(color));
-            }
-            x1 = x2;
-            y1 = y2;
+    double maxh = br.height() / 100.0 * m_keyframeFactor;
+    double x1;
+    double y1;
+    double x2;
+    double y2;
+
+    // draw line showing default value
+    if (isSelected()) {
+        x1 = br.x();
+        x1 = br.right();
+        y1 = br.bottom() - m_keyframeDefault * maxh;
+        QLineF l(x1, y1, x2, y1);
+        painter->setPen(QColor(168, 168, 168, 180));
+        painter->drawLine(l);
+        l.translate(0, 1);
+        painter->setPen(QColor(108, 108, 108, 180));
+        painter->drawLine(l);
+        painter->setPen(QColor(Qt::white));
+    }
+
+    // draw keyframes
+    QMap<int, double>::const_iterator i = m_keyframes.constBegin();
+    QColor color(Qt::blue);
+    x1 = br.x() + maxw * (i.key() - m_cropStart.frames(m_fps));
+    y1 = br.bottom() - i.value() * maxh;
+    while (i != m_keyframes.constEnd()) {
+        if (i.key() == m_selectedKeyframe) color = QColor(Qt::red);
+        else color = QColor(Qt::blue);
+        ++i;
+        if (i == m_keyframes.constEnd()) break;
+        x2 = br.x() + maxw * (i.key() - m_cropStart.frames(m_fps));
+        y2 = br.bottom() - i.value() * maxh;
+        QLineF l(x1, y1, x2, y2);
+        painter->drawLine(l);
+        if (isSelected()) {
+            painter->fillRect(x1 - 3, y1 - 3, 6, 6, QBrush(color));
         }
-        if (isSelected()) painter->fillRect(x1 - 3, y1 - 3, 6, 6, QBrush(color));
+        x1 = x2;
+        y1 = y2;
     }
+    if (isSelected()) painter->fillRect(x1 - 3, y1 - 3, 6, 6, QBrush(color));
 }
 
 int AbstractClipItem::mouseOverKeyFrames(QPointF pos) {
     QRectF br = rect();
     double maxw = br.width() / m_cropDuration.frames(m_fps);
-    double maxh = br.height() / 100.0;
+    double maxh = br.height() / 100.0 * m_keyframeFactor;
     if (m_keyframes.count() > 1) {
         QMap<int, double>::const_iterator i = m_keyframes.constBegin();
         double x1;
@@ -254,7 +285,7 @@ int AbstractClipItem::mouseOverKeyFrames(QPointF pos) {
             x1 = br.x() + maxw * (i.key() - m_cropStart.frames(m_fps));
             y1 = br.bottom() - i.value() * maxh;
             if (qAbs(pos.x() - x1) < 6 && qAbs(pos.y() - y1) < 6) {
-                setToolTip("[" + QString::number(i.key()) + "x" + QString::number(i.value()) + "]");
+                setToolTip("[" + QString::number((GenTime(i.key(), m_fps) - m_cropStart).seconds(), 'f', 2) + i18n("seconds") + ", " + QString::number(i.value(), 'f', 1) + "%]");
                 return i.key();
             } else if (x1 > pos.x()) break;
             ++i;
@@ -268,49 +299,58 @@ void AbstractClipItem::updateSelectedKeyFrame() {
     if (m_editedKeyframe == -1) return;
     QRectF br = rect();
     double maxw = br.width() / m_cropDuration.frames(m_fps);
-    double maxh = br.height() / 100.0;
+    double maxh = br.height() / 100.0 * m_keyframeFactor;
     update(br.x() + maxw * (m_selectedKeyframe - m_cropStart.frames(m_fps)) - 3, br.bottom() - m_keyframes[m_selectedKeyframe] * maxh - 3, 12, 12);
     m_selectedKeyframe = m_editedKeyframe;
     update(br.x() + maxw * (m_selectedKeyframe - m_cropStart.frames(m_fps)) - 3, br.bottom() - m_keyframes[m_selectedKeyframe] * maxh - 3, 12, 12);
 }
 
-void AbstractClipItem::updateKeyFramePos(const GenTime pos, const int value) {
+int AbstractClipItem::selectedKeyFramePos() const {
+    return m_editedKeyframe;
+}
+
+double AbstractClipItem::selectedKeyFrameValue() const {
+    return m_keyframes[m_editedKeyframe];
+}
+
+void AbstractClipItem::updateKeyFramePos(const GenTime pos, const double value) {
     if (!m_keyframes.contains(m_selectedKeyframe)) return;
-    QRectF br = rect();
-    double maxh = br.height() / 100.0;
-    double newval = (br.bottom() - value) / maxh;
     int newpos = (int) pos.frames(m_fps);
     int start = m_cropStart.frames(m_fps);
     int end = (m_cropStart + m_cropDuration).frames(m_fps);
     newpos = qMax(newpos, start);
     newpos = qMin(newpos, end);
-    if (newval < -50 && m_selectedKeyframe != start && m_selectedKeyframe != end) {
+    if (value < -50 && m_selectedKeyframe != start && m_selectedKeyframe != end) {
         // remove kexframe if it is dragged outside
         m_keyframes.remove(m_selectedKeyframe);
         m_selectedKeyframe = -1;
         update();
         return;
     }
-    if (newval > 150 && m_selectedKeyframe != start && m_selectedKeyframe != end) {
+    if (value > 150 && m_selectedKeyframe != start && m_selectedKeyframe != end) {
         // remove kexframe if it is dragged outside
         m_keyframes.remove(m_selectedKeyframe);
         m_selectedKeyframe = -1;
         update();
         return;
     }
-    newval = qMax(newval, 0.0);
+    double newval = qMax(value, 0.0);
     newval = qMin(newval, 100.0);
-
+    newval = newval / m_keyframeFactor;
     if (m_selectedKeyframe != newpos) m_keyframes.remove(m_selectedKeyframe);
     m_keyframes[newpos] = newval;
     m_selectedKeyframe = newpos;
     update();
 }
 
-void AbstractClipItem::addKeyFrame(const GenTime pos, const int value) {
+double AbstractClipItem::keyFrameFactor() const {
+    return m_keyframeFactor;
+}
+
+void AbstractClipItem::addKeyFrame(const GenTime pos, const double value) {
     QRectF br = rect();
-    double maxh = br.height() / 100.0;
-    double newval = (br.bottom() - value) / maxh;
+    double maxh = 100.0 / br.height() / m_keyframeFactor;
+    double newval = (br.bottom() - value) * maxh;
     int newpos = (int) pos.frames(m_fps) ;
     m_keyframes[newpos] = newval;
     m_selectedKeyframe = newpos;