X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fabstractclipitem.cpp;h=3eb281fe6cb9c346dd7bb00ffcf866c1c75b1e57;hb=decc9dd59d43ca9b1c2ac2168bb1ecc7de51862f;hp=c071c0a80c88f78c91fa652d3129a627f1f9fbc7;hpb=385b6d7849471384c6bed1b79f6fb0585e9b7725;p=kdenlive diff --git a/src/abstractclipitem.cpp b/src/abstractclipitem.cpp index c071c0a8..3eb281fe 100644 --- a/src/abstractclipitem.cpp +++ b/src/abstractclipitem.cpp @@ -18,15 +18,17 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ -#include #include #include #include #include +#include +#include + #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; @@ -211,50 +213,65 @@ 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() / 100.0; - double maxh = br.height() / 100.0; - if (m_keyframes.count() > 1) { - QMap::const_iterator i = m_keyframes.constBegin(); - double x1; - double y1; - double x2; - double y2; - QColor color(Qt::blue); - x1 = br.x() + maxw * i.key(); - 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(); - 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 maxw = br.width() / m_cropDuration.frames(m_fps); + 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::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() / 100.0; - double maxh = br.height() / 100.0; + double maxw = br.width() / m_cropDuration.frames(m_fps); + double maxh = br.height() / 100.0 * m_keyframeFactor; if (m_keyframes.count() > 1) { - QMap::const_iterator i = m_keyframes.constBegin(); + QMap::const_iterator i = m_keyframes.constBegin(); double x1; double y1; while (i != m_keyframes.constEnd()) { - x1 = br.x() + maxw * i.key(); + 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; @@ -267,59 +284,66 @@ int AbstractClipItem::mouseOverKeyFrames(QPointF pos) { void AbstractClipItem::updateSelectedKeyFrame() { if (m_editedKeyframe == -1) return; QRectF br = rect(); - double maxw = br.width() / 100.0; - double maxh = br.height() / 100.0; - update(br.x() + maxw * m_selectedKeyframe - 3, br.bottom() - m_keyframes[m_selectedKeyframe] * maxh - 3, 12, 12); + double maxw = br.width() / m_cropDuration.frames(m_fps); + 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 - 3, br.bottom() - m_keyframes[m_selectedKeyframe] * maxh - 3, 12, 12); + 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 QPoint pos) { - if (m_selectedKeyframe == -1) return; - QRectF br = rect(); - double maxw = br.width() / 100.0; - double maxh = br.height() / 100.0; - int newval = (int)((br.bottom() - pos.y()) / maxh); - int newpos = (int)((pos.x() - br.x()) / maxw); - if (newval < -50 && m_selectedKeyframe != 0 && m_selectedKeyframe != 100) { +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; + 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 (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 != 0 && m_selectedKeyframe != 100) { + 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; } - if (newval < 0) newval = 0; - else if (newval > 100) newval = 100; - if (m_selectedKeyframe == 0 || m_selectedKeyframe == 100) { - // start and end keyframes should stay in place - m_keyframes[m_selectedKeyframe] = newval; - } else { - m_keyframes.remove(m_selectedKeyframe); - m_keyframes[newpos] = newval; - m_selectedKeyframe = newpos; - } + 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 QPoint pos) { +double AbstractClipItem::keyFrameFactor() const { + return m_keyframeFactor; +} + +void AbstractClipItem::addKeyFrame(const GenTime pos, const double value) { QRectF br = rect(); - double maxw = br.width() / 100.0; - double maxh = br.height() / 100.0; - int newval = (int)((br.bottom() - pos.y()) / maxh); - int newpos = (int)((pos.x() - br.x()) / maxw); + 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; update(); } -bool AbstractClipItem::hasKeyFrames() { +bool AbstractClipItem::hasKeyFrames() const { return !m_keyframes.isEmpty(); }