}
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();
}
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();
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;
}
}
}
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 <int, double> 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<int, double>::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) {
}*/