From b02f7a677d475ddbfe403cf641086586a8d3de13 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Sat, 21 Jun 2008 08:46:36 +0000 Subject: [PATCH] volume effect now works fine with keyframes svn path=/branches/KDE4/; revision=2257 --- src/abstractclipitem.cpp | 26 ++++++++++++------------ src/clipitem.cpp | 44 ++++++++++++++++++++++++++++++++++++---- src/clipitem.h | 3 ++- src/effectslistview.cpp | 2 +- 4 files changed, 56 insertions(+), 19 deletions(-) diff --git a/src/abstractclipitem.cpp b/src/abstractclipitem.cpp index cdd197de..31be18b6 100644 --- a/src/abstractclipitem.cpp +++ b/src/abstractclipitem.cpp @@ -275,35 +275,35 @@ void AbstractClipItem::updateSelectedKeyFrame() { } void AbstractClipItem::updateKeyFramePos(const GenTime pos, const int value) { - if (m_selectedKeyframe == -1) return; + 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); - if (newval < -50 && m_selectedKeyframe != m_cropStart.frames(m_fps) && m_selectedKeyframe != (m_cropStart + m_cropDuration).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) { // remove kexframe if it is dragged outside m_keyframes.remove(m_selectedKeyframe); m_selectedKeyframe = -1; update(); return; } - if (newval > 150 && m_selectedKeyframe != m_cropStart.frames(m_fps) && m_selectedKeyframe != (m_cropStart + m_cropDuration).frames(m_fps)) { + if (newval > 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 == m_cropStart.frames(m_fps) || m_selectedKeyframe == (m_cropStart + m_cropDuration).frames(m_fps)) { - // 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; - } + newval = qMax(newval, 0.0); + newval = qMin(newval, 100.0); + + if (m_selectedKeyframe != newpos) m_keyframes.remove(m_selectedKeyframe); + m_keyframes[newpos] = newval; + m_selectedKeyframe = newpos; update(); } diff --git a/src/clipitem.cpp b/src/clipitem.cpp index 958af22d..634a71c2 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -110,10 +110,10 @@ void ClipItem::setSelectedEffect(int ix) { m_selectedEffect = ix; QDomElement effect = effectAt(m_selectedEffect); QDomNodeList params = effect.elementsByTagName("parameter"); - for (int i = 0; i < params.count(); i++) { QDomElement e = params.item(i).toElement(); if (!e.isNull() && e.attribute("type") == "keyframe") { + m_keyframes.clear(); int max = e.attribute("max").toInt(); int min = e.attribute("min").toInt(); int def = e.attribute("default").toInt(); @@ -164,9 +164,6 @@ void ClipItem::updateKeyframeEffect() { double y1; while (i != m_keyframes.constEnd()) { keyframes.append(QString::number(i.key()) + ":" + QString::number(i.value()) + ";"); - /*x1 = m_cropDuration.frames(m_fps) * i.key() / 100.0; - y1 = (min + i.value() * (max - min) / 100.0) / factor; - keyframes.append(QString::number(x1) + ":" + QString::number(y1) + ";");*/ ++i; } } @@ -688,15 +685,54 @@ void ClipItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *) { } void ClipItem::resizeStart(int posx, double scale) { + const int previous = cropStart().frames(m_fps); AbstractClipItem::resizeStart(posx, scale); + checkEffectsKeyframesPos(previous, cropStart().frames(m_fps), true); if (m_hasThumbs && KdenliveSettings::videothumbnails()) startThumbTimer->start(100); } void ClipItem::resizeEnd(int posx, double scale) { + const int previous = (cropStart() + duration()).frames(m_fps); AbstractClipItem::resizeEnd(posx, scale); + checkEffectsKeyframesPos(previous, (cropStart() + duration()).frames(m_fps), false); if (m_hasThumbs && KdenliveSettings::videothumbnails()) endThumbTimer->start(100); } + +void ClipItem::checkEffectsKeyframesPos(const int previous, const int current, bool fromStart) { + for (int i = 0; i < m_effectList.size(); i++) { + QDomElement effect = m_effectList.at(i); + QDomNodeList params = effect.elementsByTagName("parameter"); + for (int j = 0; j < params.count(); j++) { + QDomElement e = params.item(i).toElement(); + if (e.attribute("type") == "keyframe") { + // parse keyframes and adjust values + QStringList keyframes = e.attribute("keyframes").split(";", QString::SkipEmptyParts); + QMap kfr; + foreach(QString str, keyframes) { + int pos = str.section(":", 0, 0).toInt(); + double val = str.section(":", 1, 1).toDouble(); + if (pos == previous) kfr[current] = val; + else { + if (fromStart && pos >= current) kfr[pos] = val; + else if (!fromStart && pos <= current) kfr[pos] = val; + } + } + QString newkfr; + QMap::const_iterator k = kfr.constBegin(); + while (k != kfr.constEnd()) { + newkfr.append(QString::number(k.key()) + ":" + QString::number(k.value()) + ";"); + ++k; + } + e.setAttribute("keyframes", newkfr); + break; + } + } + } + setSelectedEffect(m_selectedEffect); +} + + // virtual /*void ClipItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event) { }*/ diff --git a/src/clipitem.h b/src/clipitem.h index e2e501b6..51c6e44c 100644 --- a/src/clipitem.h +++ b/src/clipitem.h @@ -129,7 +129,8 @@ private: bool audioThumbWasDrawn, audioThumbReady; double framePixelWidth; QMap channelPaths; - + /** Called when clip start is resized, adjust keyframes values */ + void checkEffectsKeyframesPos(const int previous, const int current, bool fromStart); private slots: void slotThumbReady(int frame, QPixmap pix); void slotFetchThumbs(); diff --git a/src/effectslistview.cpp b/src/effectslistview.cpp index 1f6e9247..9778fcda 100644 --- a/src/effectslistview.cpp +++ b/src/effectslistview.cpp @@ -74,7 +74,7 @@ void EffectsListView::showInfoPanel() { } void EffectsListView::slotEffectSelected() { - QDomElement effect = m_effectsList->currentEffect(); + QDomElement effect = m_effectsList->currentEffect().cloneNode().toElement(); if (!effect.isNull()) emit addEffect(effect); } -- 2.39.2