From 503fc29cddd66b5f5c4bee92044fa4ae34e41bad Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Fri, 14 Jan 2011 10:03:55 +0000 Subject: [PATCH] Keyframe gui fixes (when keyframe negative value was allowed) svn path=/trunk/kdenlive/; revision=5322 --- src/abstractclipitem.cpp | 17 +++++++++-------- src/abstractclipitem.h | 4 ++++ src/clipitem.cpp | 2 ++ src/keyframeedit.cpp | 3 ++- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/abstractclipitem.cpp b/src/abstractclipitem.cpp index 7bd2ea7e..079a5812 100644 --- a/src/abstractclipitem.cpp +++ b/src/abstractclipitem.cpp @@ -36,6 +36,7 @@ AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect, doub m_editedKeyframe(-1), m_selectedKeyframe(0), m_keyframeFactor(1), + m_keyframeOffset(0), m_fps(fps) #if QT_VERSION >= 0x040600 , m_closeAnimation(NULL) @@ -262,7 +263,7 @@ void AbstractClipItem::drawKeyFrames(QPainter *painter, QRectF /*exposedRect*/) if (active) { x1 = br.x(); x2 = br.right(); - y1 = br.bottom() - m_keyframeDefault * maxh; + y1 = br.bottom() - (m_keyframeDefault - m_keyframeOffset) * maxh; QLineF l(x1, y1, x2, y1); QLineF l2 = painter->matrix().map(l); painter->setPen(QColor(168, 168, 168, 180)); @@ -278,7 +279,7 @@ void AbstractClipItem::drawKeyFrames(QPainter *painter, QRectF /*exposedRect*/) QColor color(Qt::blue); QLineF l2; x1 = br.x() + maxw * (i.key() - start); - y1 = br.bottom() - i.value() * maxh; + y1 = br.bottom() - (i.value() - m_keyframeOffset) * maxh; // make sure line begins with clip beginning if (i.key() != start) { @@ -300,7 +301,7 @@ void AbstractClipItem::drawKeyFrames(QPainter *painter, QRectF /*exposedRect*/) y2 = y1; } else { x2 = br.x() + maxw * (i.key() - start); - y2 = br.bottom() - i.value() * maxh; + y2 = br.bottom() - (i.value() - m_keyframeOffset) * maxh; } QLineF l(x1, y1, x2, y2); l2 = painter->matrix().map(l); @@ -338,7 +339,7 @@ int AbstractClipItem::mouseOverKeyFrames(QPointF pos, double maxOffset) double y1; while (i != m_keyframes.constEnd()) { x1 = br.x() + maxw * (i.key() - cropStart().frames(m_fps)); - y1 = br.bottom() - i.value() * maxh; + y1 = br.bottom() - (i.value() - m_keyframeOffset) * maxh; if (qAbs(pos.x() - x1) < maxOffset && qAbs(pos.y() - y1) < 10) { setToolTip('[' + QString::number((GenTime(i.key(), m_fps) - cropStart()).seconds(), 'f', 2) + i18n("seconds") + ", " + QString::number(i.value(), 'f', 1) + "]"); return i.key(); @@ -359,9 +360,9 @@ void AbstractClipItem::updateSelectedKeyFrame() QRectF br = sceneBoundingRect(); double maxw = br.width() / cropDuration().frames(m_fps); double maxh = br.height() / 100.0 * m_keyframeFactor; - update(br.x() + maxw *(m_selectedKeyframe - cropStart().frames(m_fps)) - 3, br.bottom() - m_keyframes.value(m_selectedKeyframe) * maxh - 3, 12, 12); + update(br.x() + maxw *(m_selectedKeyframe - cropStart().frames(m_fps)) - 3, br.bottom() - (m_keyframes.value(m_selectedKeyframe) - m_keyframeOffset) * maxh - 3, 12, 12); m_selectedKeyframe = m_editedKeyframe; - update(br.x() + maxw *(m_selectedKeyframe - cropStart().frames(m_fps)) - 3, br.bottom() - m_keyframes.value(m_selectedKeyframe) * maxh - 3, 12, 12); + update(br.x() + maxw *(m_selectedKeyframe - cropStart().frames(m_fps)) - 3, br.bottom() - (m_keyframes.value(m_selectedKeyframe) - m_keyframeOffset) * maxh - 3, 12, 12); } int AbstractClipItem::editedKeyFramePos() const @@ -408,7 +409,7 @@ void AbstractClipItem::updateKeyFramePos(const GenTime pos, const double value) double newval = qMax(value, 0.0); newval = qMin(newval, 100.0); - newval = newval / m_keyframeFactor; + newval = newval / m_keyframeFactor + m_keyframeOffset; if (m_editedKeyframe != newpos) m_keyframes.remove(m_editedKeyframe); m_keyframes[newpos] = (int) newval; @@ -430,7 +431,7 @@ int AbstractClipItem::addKeyFrame(const GenTime pos, const double value) { QRectF br = sceneBoundingRect(); double maxh = 100.0 / br.height() / m_keyframeFactor; - int newval = (br.bottom() - value) * maxh; + int newval = (br.bottom() - value) * maxh + m_keyframeOffset; //kDebug() << "Rect: " << br << "/ SCENE: " << sceneBoundingRect() << ", VALUE: " << value << ", MAX: " << maxh << ", NEWVAL: " << newval; int newpos = (int) pos.frames(m_fps) ; m_keyframes[newpos] = newval; diff --git a/src/abstractclipitem.h b/src/abstractclipitem.h index f42bcdd3..b04f5712 100644 --- a/src/abstractclipitem.h +++ b/src/abstractclipitem.h @@ -101,7 +101,11 @@ protected: GenTime m_startPos;*/ GenTime m_maxDuration; QMap m_keyframes; + /** @brief Strech factor so that keyframes display on the full clip height. */ double m_keyframeFactor; + /** @brief Offset factor so that keyframes minimum value are displaed at the bottom of the clip. */ + double m_keyframeOffset; + /** @brief Default reset value for keyframe. */ double m_keyframeDefault; /** The (keyframe) parameter that is visible and editable in timeline (on the clip) */ int m_visibleParam; diff --git a/src/clipitem.cpp b/src/clipitem.cpp index e80e3fcd..e4b759bb 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -397,6 +397,7 @@ void ClipItem::setKeyframes(const int ix, const QStringList keyframes) double max = e.attribute("max").toDouble(); double min = e.attribute("min").toDouble(); m_keyframeFactor = 100.0 / (max - min); + m_keyframeOffset = min; m_keyframeDefault = e.attribute("default").toDouble(); m_selectedKeyframe = 0; // parse keyframes @@ -431,6 +432,7 @@ void ClipItem::setSelectedEffect(const int ix) double max = e.attribute("max").toDouble(); double min = e.attribute("min").toDouble(); m_keyframeFactor = 100.0 / (max - min); + m_keyframeOffset = min; m_keyframeDefault = e.attribute("default").toDouble(); m_selectedKeyframe = 0; diff --git a/src/keyframeedit.cpp b/src/keyframeedit.cpp index e3af8ab3..ae91d02c 100644 --- a/src/keyframeedit.cpp +++ b/src/keyframeedit.cpp @@ -123,11 +123,12 @@ void KeyframeEdit::addParameter(QDomElement e, int activeKeyframe) m_slidersLayout->addWidget(doubleparam, columnId, 0); QRadioButton *radio = new QRadioButton(this); + radio->setToolTip(i18n("Show %1 in timeline").arg(paramName)); m_showButtons->addButton(radio, columnId); if (e.attribute("intimeline") == "1") radio->setChecked(true); - QVBoxLayout *radioLayout = new QVBoxLayout(this); + QVBoxLayout *radioLayout = new QVBoxLayout; radioLayout->addWidget(radio, 0, Qt::AlignTop); m_slidersLayout->addLayout(radioLayout, columnId, 1); -- 2.39.2