From: <tt...@us...> - 2010-10-30 22:35:23
|
Revision: 5064 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=5064&view=rev Author: ttill Date: 2010-10-30 22:35:15 +0000 (Sat, 30 Oct 2010) Log Message: ----------- Fix keyframes not editable in timeline if first parameter is not keyframable Modified Paths: -------------- trunk/kdenlive/src/abstractclipitem.h trunk/kdenlive/src/clipitem.cpp trunk/kdenlive/src/keyframeedit.h Modified: trunk/kdenlive/src/abstractclipitem.h =================================================================== --- trunk/kdenlive/src/abstractclipitem.h 2010-10-30 09:08:17 UTC (rev 5063) +++ trunk/kdenlive/src/abstractclipitem.h 2010-10-30 22:35:15 UTC (rev 5064) @@ -103,6 +103,8 @@ QMap <int, int> m_keyframes; double m_keyframeFactor; double m_keyframeDefault; + /** The (keyframe) parameter that is visible and editable in timeline (on the clip) */ + int m_visibleParam; double m_fps; //QRect visibleRect(); void drawKeyFrames(QPainter *painter, QRectF exposedRect); Modified: trunk/kdenlive/src/clipitem.cpp =================================================================== --- trunk/kdenlive/src/clipitem.cpp 2010-10-30 09:08:17 UTC (rev 5063) +++ trunk/kdenlive/src/clipitem.cpp 2010-10-30 22:35:15 UTC (rev 5064) @@ -393,6 +393,7 @@ e.setAttribute("keyframes", keyframes.at(keyframeParams)); if (ix == m_selectedEffect && keyframeParams == 0) { m_keyframes.clear(); + m_visibleParam = i; double max = e.attribute("max").toDouble(); double min = e.attribute("min").toDouble(); m_keyframeFactor = 100.0 / (max - min); @@ -426,6 +427,7 @@ QDomElement e = params.item(i).toElement(); if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { m_keyframes.clear(); + m_visibleParam = i; double max = e.attribute("max").toDouble(); double min = e.attribute("min").toDouble(); m_keyframeFactor = 100.0 / (max - min); @@ -471,23 +473,19 @@ QDomElement effect = getEffectAt(m_selectedEffect); if (effect.attribute("disable") == "1") return; QDomNodeList params = effect.elementsByTagName("parameter"); + QDomElement e = params.item(m_visibleParam).toElement(); - for (int i = 0; i < params.count(); i++) { - QDomElement e = params.item(i).toElement(); - if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { - QString keyframes; - if (m_keyframes.count() > 0) { - QMap<int, int>::const_iterator i = m_keyframes.constBegin(); - while (i != m_keyframes.constEnd()) { - keyframes.append(QString::number(i.key()) + ':' + QString::number(i.value()) + ';'); - ++i; - } + if (!e.isNull()) { + QString keyframes; + if (m_keyframes.count() > 0) { + QMap<int, int>::const_iterator i = m_keyframes.constBegin(); + while (i != m_keyframes.constEnd()) { + keyframes.append(QString::number(i.key()) + ':' + QString::number(i.value()) + ';'); + ++i; } - // Effect has a keyframe type parameter, we need to set the values - //kDebug() << "::::::::::::::: SETTING EFFECT KEYFRAMES: " << keyframes; - e.setAttribute("keyframes", keyframes); - break; } + // Effect has a keyframe type parameter, we need to set the values + e.setAttribute("keyframes", keyframes); } } @@ -1221,9 +1219,7 @@ for (int j = 0; j < params.count(); j++) { bool modified = false; QDomElement e = params.item(j).toElement(); - if (e.isNull()) - continue; - if (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe") { + if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { // parse keyframes and adjust values const QStringList keyframes = e.attribute("keyframes").split(';', QString::SkipEmptyParts); QMap <int, double> kfr; @@ -1683,29 +1679,33 @@ 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 (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { + 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 == m_visibleParam) + 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) { + if (i == m_visibleParam) + newkfr.append(QString::number(pos) + ":" + QString::number(val)); + else + newkfr.append(QString::number(pos) + ":" + e.attribute("default")); + } + e.setAttribute("keyframes", newkfr.join(";")); } - if (!added) { - if (i == 0) - newkfr.append(QString::number(pos) + ":" + QString::number(val)); - else - newkfr.append(QString::number(pos) + ":" + e.attribute("default")); - } - e.setAttribute("keyframes", newkfr.join(";")); } } @@ -1718,20 +1718,24 @@ int end = (cropStart() + cropDuration()).frames(m_fps) - 1; 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; - foreach(const QString &str, keyframes) { - if (str.section(':', 0, 0).toInt() != oldpos) { - newkfr.append(str); - } else if (newpos != -1) { - newpos = qMax(newpos, start); - newpos = qMin(newpos, end); - if (i == 0) newkfr.append(QString::number(newpos) + ":" + QString::number(value)); - else newkfr.append(QString::number(newpos) + ":" + str.section(':', 1, 1)); + if (!e.isNull() && (e.attribute("type") == "keyframe" || e.attribute("type") == "simplekeyframe")) { + QString kfr = e.attribute("keyframes"); + const QStringList keyframes = kfr.split(';', QString::SkipEmptyParts); + QStringList newkfr; + foreach(const QString &str, keyframes) { + if (str.section(':', 0, 0).toInt() != oldpos) { + newkfr.append(str); + } else if (newpos != -1) { + newpos = qMax(newpos, start); + newpos = qMin(newpos, end); + if (i == m_visibleParam) + newkfr.append(QString::number(newpos) + ":" + QString::number(value)); + else + newkfr.append(QString::number(newpos) + ":" + str.section(':', 1, 1)); + } } + e.setAttribute("keyframes", newkfr.join(";")); } - e.setAttribute("keyframes", newkfr.join(";")); } updateKeyframes(effect); @@ -1743,7 +1747,7 @@ m_keyframes.clear(); // parse keyframes QDomNodeList params = effect.elementsByTagName("parameter"); - QDomElement e = params.item(0).toElement(); + QDomElement e = params.item(m_visibleParam).toElement(); const QStringList keyframes = e.attribute("keyframes").split(';', QString::SkipEmptyParts); foreach(const QString &str, keyframes) { int pos = str.section(':', 0, 0).toInt(); Modified: trunk/kdenlive/src/keyframeedit.h =================================================================== --- trunk/kdenlive/src/keyframeedit.h 2010-10-30 09:08:17 UTC (rev 5063) +++ trunk/kdenlive/src/keyframeedit.h 2010-10-30 22:35:15 UTC (rev 5064) @@ -115,7 +115,7 @@ void slotAdjustKeyframePos(int value); void slotAdjustKeyframeValue(int value); /** @brief Turns the seek to keyframe position setting on/off. - * @param state State of the associated checkbox */ + * @param seek true = seeking on */ void slotSetSeeking(bool seek); /** @brief Shows the keyframe table and adds a second keyframe. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |