From fee94f8ed072ea2864a40b8fd139bafce35a5e96 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 25 Jan 2010 21:22:36 +0000 Subject: [PATCH] first step in fixing keyframe issue svn path=/trunk/kdenlive/; revision=4248 --- src/abstractclipitem.cpp | 3 ++- src/abstractclipitem.h | 2 +- src/clipitem.cpp | 29 ++++++++++++++++++++++++++++- src/clipitem.h | 1 + src/customtrackview.cpp | 6 ++++-- 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/abstractclipitem.cpp b/src/abstractclipitem.cpp index 6584428f..c9da1c32 100644 --- a/src/abstractclipitem.cpp +++ b/src/abstractclipitem.cpp @@ -381,7 +381,7 @@ double AbstractClipItem::keyFrameFactor() const return m_keyframeFactor; } -void AbstractClipItem::addKeyFrame(const GenTime pos, const double value) +int AbstractClipItem::addKeyFrame(const GenTime pos, const double value) { QRectF br = sceneBoundingRect(); double maxh = 100.0 / br.height() / m_keyframeFactor; @@ -391,6 +391,7 @@ void AbstractClipItem::addKeyFrame(const GenTime pos, const double value) m_keyframes[newpos] = newval; m_selectedKeyframe = newpos; update(); + return newval; } bool AbstractClipItem::hasKeyFrames() const diff --git a/src/abstractclipitem.h b/src/abstractclipitem.h index e49d0db7..fdc91438 100644 --- a/src/abstractclipitem.h +++ b/src/abstractclipitem.h @@ -46,7 +46,7 @@ public: virtual ~ AbstractClipItem(); void updateSelectedKeyFrame(); void updateKeyFramePos(const GenTime pos, const double value); - void addKeyFrame(const GenTime pos, const double value); + int addKeyFrame(const GenTime pos, const double value); bool hasKeyFrames() const; int selectedKeyFramePos() const; double selectedKeyFrameValue() const; diff --git a/src/clipitem.cpp b/src/clipitem.cpp index 1aa2b203..7c6cac2b 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -190,7 +190,7 @@ void ClipItem::initEffect(QDomElement effect, int diff) // Effect has a keyframe type parameter, we need to set the values if (e.attribute("keyframes").isEmpty()) { e.setAttribute("keyframes", QString::number(cropStart().frames(m_fps)) + ':' + def + ';' + QString::number((cropStart() + cropDuration()).frames(m_fps) - 1) + ':' + def); - //kDebug() << "///// EFFECT KEYFRAMES INITED: " << e.attribute("keyframes"); + kDebug() << "///// EFFECT KEYFRAMES INITED: " << e.attribute("keyframes"); //break; } } @@ -1628,5 +1628,32 @@ bool ClipItem::isVideoOnly() const return m_videoOnly; } +void ClipItem::insertKeyframe(QDomElement effect, const int pos, const int val) +{ + if (effect.attribute("disabled") == "1") return; + QDomNodeList params = effect.elementsByTagName("parameter"); + for (int i = 0; i < params.count(); i++) { + QDomElement e = params.item(i).toElement(); + QString kfr = e.attribute("keyframes"); + const QStringList keyframes = kfr.split(';', QString::SkipEmptyParts); + QStringList newkfr; + bool added = false; + foreach(const QString &str, keyframes) { + int kpos = str.section(':', 0, 0).toInt(); + double newval = str.section(':', 1, 1).toDouble(); + if (kpos < pos) { + newkfr.append(str); + } else if (!added) { + if (i == 0) newkfr.append(QString::number(pos) + ":" + QString::number(val)); + else newkfr.append(QString::number(pos) + ":" + QString::number(newval)); + if (kpos > pos) newkfr.append(str); + added = true; + } else newkfr.append(str); + } + if (!added) newkfr.append(QString::number(pos) + ":" + QString::number(val)); + e.setAttribute("keyframes", newkfr.join(";")); + kDebug() << "insert kfr: " << newkfr.join(";"); + } +} #include "clipitem.moc" diff --git a/src/clipitem.h b/src/clipitem.h index 0998eccb..d55c659d 100644 --- a/src/clipitem.h +++ b/src/clipitem.h @@ -116,6 +116,7 @@ public: bool isAudioOnly() const; /** Called when clip start is resized, adjust keyframes values */ bool checkEffectsKeyframesPos(const int previous, const int current, bool fromStart); + void insertKeyframe(QDomElement effect, const int pos, const int val); protected: //virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * event); diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 607f1a75..07965765 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -1171,6 +1171,7 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event) if (m_dragItem && m_dragItem->hasKeyFrames()) { if (m_moveOpMode == KEYFRAME) { // user double clicked on a keyframe, open edit dialog + //TODO: update for effects with several values per keyframe QDialog d(parentWidget()); Ui::KeyFrameDialog_UI view; view.setupUi(&d); @@ -1193,10 +1194,11 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event) } else { // add keyframe GenTime keyFramePos = GenTime((int)(mapToScene(event->pos()).x()), m_document->fps()) - m_dragItem->startPos() + m_dragItem->cropStart(); - m_dragItem->addKeyFrame(keyFramePos, mapToScene(event->pos()).toPoint().y()); + int val = m_dragItem->addKeyFrame(keyFramePos, mapToScene(event->pos()).toPoint().y()); ClipItem * item = static_cast (m_dragItem); QString previous = item->keyframes(item->selectedEffectIndex()); - item->updateKeyframeEffect(); + item->insertKeyframe(item->getEffectAt(item->selectedEffectIndex()), keyFramePos.frames(m_document->fps()), val); + //item->updateKeyframeEffect(); QString next = item->keyframes(item->selectedEffectIndex()); EditKeyFrameCommand *command = new EditKeyFrameCommand(this, m_dragItem->track(), m_dragItem->startPos(), item->selectedEffectIndex(), previous, next, false); m_commandStack->push(command); -- 2.39.2