From df039416a945ef7cd4ab1a56030d7bda4f6d05c2 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 7 Dec 2009 12:36:37 +0000 Subject: [PATCH] * Fix pasting of keyframe effects: http://kdenlive.org/mantis/view.php?id=1325 * When one clip is selected, make it display over its transitions so that keyframes for fades, etc can be adjusted svn path=/trunk/kdenlive/; revision=4172 --- src/abstractgroupitem.cpp | 4 ++++ src/clipitem.cpp | 6 +++++- src/customtrackview.cpp | 36 ++++++++++++++++++++++++++++-------- src/customtrackview.h | 2 ++ src/transition.cpp | 4 ++++ 5 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/abstractgroupitem.cpp b/src/abstractgroupitem.cpp index f99fd3ee..d4e92104 100644 --- a/src/abstractgroupitem.cpp +++ b/src/abstractgroupitem.cpp @@ -147,6 +147,10 @@ void AbstractGroupItem::paint(QPainter *p, const QStyleOptionGraphicsItem *optio //virtual QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant &value) { + if (change == QGraphicsItem::ItemSelectedChange) { + if (value.toBool()) setZValue(10); + else setZValue(1); + } if (change == ItemPositionChange && scene() && parentItem() == 0) { // calculate new position. const int trackHeight = KdenliveSettings::trackheight(); diff --git a/src/clipitem.cpp b/src/clipitem.cpp index f14d1639..94b5a543 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -1158,6 +1158,10 @@ bool ClipItem::checkEffectsKeyframesPos(const int previous, const int current, b //virtual QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value) { + if (change == QGraphicsItem::ItemSelectedChange) { + if (value.toBool()) setZValue(10); + else setZValue(2); + } if (change == ItemPositionChange && scene()) { // calculate new position. //if (parentItem()) return pos(); @@ -1434,7 +1438,7 @@ EffectsParameterList ClipItem::getEffectArgs(const QDomElement effect) double val = values.at(j).section(":", 1, 1).toDouble() / factor; values[j] = pos + "=" + QString::number(val); } - //kDebug() << "/ / / /SENDING KEYFR:"<setZValue(10); - if (m_selectionGroup) m_selectionGroup->setZValue(10); } else if (m_operationMode == TRANSITIONSTART && event->modifiers() != Qt::ControlModifier) { ItemInfo info; info.startPos = m_dragItem->startPos(); @@ -1363,7 +1361,7 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint pos) updateSnapPoints(NULL, offsetList); m_selectionGroup->setPos(framePos); scene()->addItem(m_selectionGroup); - m_selectionGroup->setZValue(10); + //m_selectionGroup->setZValue(10); return true; } else if (data->hasFormat("kdenlive/producerslist")) { m_clipDrag = true; @@ -1409,7 +1407,7 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint pos) start += info.cropDuration; offsetList.append(start); ClipItem *item = new ClipItem(clip, info, m_document->fps(), 1.0, 1, false); - item->setZValue(10); + //item->setZValue(10); item->setFlag(QGraphicsItem::ItemIsMovable, false); m_selectionGroup->addToGroup(item); m_waitingThumbs.append(item); @@ -1418,7 +1416,7 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint pos) updateSnapPoints(NULL, offsetList); m_selectionGroup->setPos(framePos); scene()->addItem(m_selectionGroup); - m_selectionGroup->setZValue(10); + //m_selectionGroup->setZValue(10); m_thumbsTimer.start(); return true; @@ -2062,7 +2060,7 @@ void CustomTrackView::dropEvent(QDropEvent * event) //TODO: take care of edit mode for undo item->baseClip()->addReference(); - item->setZValue(item->defaultZValue()); + //item->setZValue(item->defaultZValue()); m_document->updateClip(item->baseClip()->getId()); ItemInfo info = item->info(); @@ -2829,8 +2827,6 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) if (m_operationMode == MOVE) { setCursor(Qt::OpenHandCursor); - if (m_dragItem) m_dragItem->setZValue(m_dragItem->defaultZValue()); - if (m_selectionGroup) m_selectionGroup->setZValue(1); if (m_dragItem->parentItem() == 0) { // we are moving one clip, easy if (m_dragItem->type() == AVWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) { @@ -4744,6 +4740,7 @@ void CustomTrackView::pasteClipEffects() for (int j = 0; j < clip->effectsCount(); j++) { QDomElement eff = clip->effectAt(j); if (eff.attribute("unique", "0") == "0" || item->hasEffect(eff.attribute("tag"), eff.attribute("id")) == -1) { + adjustKeyfames(clip->cropStart(), item->cropStart(), eff); new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), eff, true, paste); } } @@ -4759,6 +4756,29 @@ void CustomTrackView::pasteClipEffects() } +void CustomTrackView::adjustKeyfames(GenTime oldstart, GenTime newstart, QDomElement xml) +{ + // parse parameters to check if we need to adjust to the new crop start + int diff = (newstart - oldstart).frames(m_document->fps()); + QDomNodeList params = xml.elementsByTagName("parameter"); + 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 def = e.attribute("default"); + // Effect has a keyframe type parameter, we need to adjust the values + QStringList keys = e.attribute("keyframes").split(";", QString::SkipEmptyParts); + QStringList newKeyFrames; + foreach(const QString &str, keys) { + int pos = str.section(':', 0, 0).toInt(); + double val = str.section(':', 1, 1).toDouble(); + newKeyFrames.append(QString::number(pos + diff) + ':' + QString::number(val)); + } + //kDebug()<<"ORIGIN: "<tracksCount())); diff --git a/src/customtrackview.h b/src/customtrackview.h index 88275ca6..115c9899 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -270,6 +270,8 @@ private: /** Adjust clips under another one when working in overwrite mode */ void adjustTimelineClips(EDITMODE mode, ClipItem *item, ItemInfo posinfo, QUndoCommand *command); void adjustTimelineTransitions(EDITMODE mode, Transition *item, QUndoCommand *command); + /** Adjust keyframes when pasted to another clip */ + void adjustKeyfames(GenTime oldstart, GenTime newstart, QDomElement xml); private slots: void slotRefreshGuides(); diff --git a/src/transition.cpp b/src/transition.cpp index 315d501c..10b03740 100644 --- a/src/transition.cpp +++ b/src/transition.cpp @@ -211,6 +211,10 @@ int Transition::type() const //virtual QVariant Transition::itemChange(GraphicsItemChange change, const QVariant &value) { + if (change == QGraphicsItem::ItemSelectedChange) { + if (value.toBool()) setZValue(10); + else setZValue(3); + } if (change == ItemPositionChange && scene()) { // calculate new position. QPointF newPos = value.toPointF(); -- 2.39.2