From: Jean-Baptiste Mardelle Date: Mon, 15 Dec 2008 12:33:07 +0000 (+0000) Subject: start work on automatic transitions X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=5fb0a5d3b0ed9357047d5b620617df5b2038ed40;p=kdenlive start work on automatic transitions svn path=/branches/KDE4/; revision=2789 --- diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 78c0ca31..822714a2 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -1638,17 +1638,22 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { ClipItem *item = static_cast (m_dragItem); bool success = m_document->renderer()->mltMoveClip((int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItem->track()), (int) m_dragItemInfo.startPos.frames(m_document->fps()), (int)(m_dragItem->startPos().frames(m_document->fps())), item->baseClip()->producer(info.track)); if (success) { - MoveClipCommand *command = new MoveClipCommand(this, m_dragItemInfo, info, false, false); - m_commandStack->push(command); - if (item->baseClip()->isTransparent()) { - // Also move automatic transition - Transition *tr = getTransitionItemAt((int) m_dragItemInfo.startPos.frames(m_document->fps()), m_dragItemInfo.track); - if (tr && tr->isAutomatic()) { - tr->updateTransitionEndTrack(getPreviousVideoTrack(info.track)); - m_document->renderer()->mltMoveTransition(tr->transitionTag(), m_document->tracksCount() - m_dragItemInfo.track, m_document->tracksCount() - info.track, tr->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos); - tr->setPos((int) info.startPos.frames(m_document->fps()), (int)(info.track * m_tracksHeight + 1)); - } + QUndoCommand *moveCommand = new QUndoCommand(); + moveCommand->setText(i18n("Move clip")); + new MoveClipCommand(this, m_dragItemInfo, info, false, moveCommand); + // Also move automatic transition + Transition *tr = getTransitionItemAt((int) m_dragItemInfo.startPos.frames(m_document->fps()), m_dragItemInfo.track); + if (tr && tr->isAutomatic()) { + tr->updateTransitionEndTrack(getPreviousVideoTrack(info.track)); + ItemInfo trInfo = tr->info(); + ItemInfo newTrInfo = trInfo; + newTrInfo.startPos = m_dragItem->startPos(); + kDebug() << "// CHECKING TRANS END TRACK ON: " << m_document->tracksCount() - tr->transitionEndTrack(); + if (m_dragItemInfo.track == info.track && !getClipItemAtEnd(newTrInfo.endPos, m_document->tracksCount() - tr->transitionEndTrack())); + newTrInfo.endPos = newTrInfo.endPos + (newTrInfo.startPos - trInfo.startPos); + new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand); } + m_commandStack->push(moveCommand); } else { // undo last move and emit error message MoveClipCommand *command = new MoveClipCommand(this, info, m_dragItemInfo, true); @@ -1735,9 +1740,20 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { resizeinfo.track = m_document->tracksCount() - resizeinfo.track; bool success = m_document->renderer()->mltResizeClipStart(resizeinfo, m_dragItem->startPos() - m_dragItemInfo.startPos); if (success) { + QUndoCommand *resizeCommand = new QUndoCommand(); + resizeCommand->setText(i18n("Resize clip")); + + // Check if there is an automatic transition on that clip + Transition *transition = getTransitionItemAt((int) m_dragItemInfo.startPos.frames(m_document->fps()), m_dragItemInfo.track); + if (transition && transition->isAutomatic() && transition->startPos() == m_dragItemInfo.startPos) { + ItemInfo trInfo = transition->info(); + ItemInfo newTrInfo = trInfo; + newTrInfo.startPos = m_dragItem->startPos(); + new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand); + } updateClipFade(static_cast (m_dragItem)); - ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false); - m_commandStack->push(command); + new ResizeClipCommand(this, m_dragItemInfo, info, false, resizeCommand); + m_commandStack->push(resizeCommand); } else { m_dragItem->resizeStart((int) m_dragItemInfo.startPos.frames(m_document->fps())); emit displayMessage(i18n("Error when resizing clip"), ErrorMessage); @@ -1746,7 +1762,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false); m_commandStack->push(command); Transition *transition = static_cast (m_dragItem); - m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItemInfo.track), 0, m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos); + m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItemInfo.track), transition->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos); } //m_document->renderer()->doRefresh(); @@ -1974,6 +1990,22 @@ void CustomTrackView::slotUpdateClip(const QString &clipId) { } } +ClipItem *CustomTrackView::getClipItemAtEnd(GenTime pos, int track) { + int framepos = (int)(pos.frames(m_document->fps())); + QList list = scene()->items(QPointF(framepos - 1, track * m_tracksHeight + m_tracksHeight / 2)); + ClipItem *clip = NULL; + kDebug() << "// CHECK CLP AT: " << framepos << ", TK: " << track << ", FND: " << list.size(); + for (int i = 0; i < list.size(); ++i) { + if (list.at(i)->type() == AVWIDGET) { + ClipItem *test = static_cast (list.at(i)); + kDebug() << "// GET END; " << test->endPos().frames(m_document->fps()) << " == " << framepos; + if (test->endPos().frames(m_document->fps()) == framepos) clip = test; + break; + } + } + return clip; +} + ClipItem *CustomTrackView::getClipItemAt(int pos, int track) { QList list = scene()->items(QPointF(pos , track * m_tracksHeight + m_tracksHeight / 2)); ClipItem *clip = NULL; @@ -2013,11 +2045,9 @@ void CustomTrackView::moveClip(const ItemInfo start, const ItemInfo end) { ClipItem *item = getClipItemAt((int) start.startPos.frames(m_document->fps()) + 1, start.track); if (!item) { emit displayMessage(i18n("Cannot move clip at time: %1 on track %2", m_document->timecode().getTimecodeFromFrames(start.startPos.frames(m_document->fps())), start.track), ErrorMessage); - kDebug() << "----------------  ERROR, CANNOT find clip to move at.. ";// << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2; + kDebug() << "----------------  ERROR, CANNOT find clip to move at.. "; return; } - //kDebug() << "----------------  Move CLIP FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << startPos.y() << " TO " << endPos.y(); - bool success = m_document->renderer()->mltMoveClip((int)(m_document->tracksCount() - start.track), (int)(m_document->tracksCount() - end.track), (int) start.startPos.frames(m_document->fps()), (int)end.startPos.frames(m_document->fps()), item->baseClip()->producer(end.track)); if (success) { item->setPos((int) end.startPos.frames(m_document->fps()), (int)(end.track * m_tracksHeight + 1)); @@ -2036,6 +2066,7 @@ void CustomTrackView::moveClip(const ItemInfo start, const ItemInfo end) { // undo last move and emit error message emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(end.startPos.frames(m_document->fps()))), ErrorMessage); } + kDebug() << " // MOVED CLIP TO: " << end.startPos.frames(25) << ", ITEM START: " << item->startPos().frames(25); } void CustomTrackView::moveGroup(QList startClip, QList startTransition, const GenTime offset, const int trackOffset, bool reverseMove) { @@ -2120,9 +2151,14 @@ void CustomTrackView::moveTransition(const ItemInfo start, const ItemInfo end) { } else if (end.endPos == start.endPos) { // Transition start resize item->resizeStart((int) end.startPos.frames(m_document->fps())); - } else { + } else if (end.startPos == start.startPos) { // Transition end resize; item->resizeEnd((int) end.endPos.frames(m_document->fps())); + } else { + // Move & resize + item->setPos((int) end.startPos.frames(m_document->fps()), (end.track) * m_tracksHeight + 1); + item->resizeStart((int) end.startPos.frames(m_document->fps())); + item->resizeEnd((int) end.endPos.frames(m_document->fps())); } //item->moveTransition(GenTime((int) (endPos.x() - startPos.x()), m_document->fps())); item->updateTransitionEndTrack(getPreviousVideoTrack(end.track)); @@ -2953,4 +2989,16 @@ void CustomTrackView::changeTimelineTrack(int ix, TrackInfo trackinfo) { m_commandStack->push(changeTrack); } +void CustomTrackView::autoTransition() { + QList itemList = scene()->selectedItems(); + if (itemList.count() != 1 || itemList.at(0)->type() != TRANSITIONWIDGET) { + emit displayMessage(i18n("You must select one transition for this action"), ErrorMessage); + return; + } + Transition *tr = static_cast (itemList.at(0)); + tr->setAutomatic(!tr->isAutomatic()); + QDomElement transition = tr->toXML(); + m_document->renderer()->mltUpdateTransition(transition.attribute("tag"), transition.attribute("tag"), transition.attribute("transition_btrack").toInt(), m_document->tracksCount() - transition.attribute("transition_atrack").toInt(), tr->startPos(), tr->endPos(), transition); +} + #include "customtrackview.moc" diff --git a/src/customtrackview.h b/src/customtrackview.h index 1608e47e..5ae843b0 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -105,6 +105,7 @@ public: void deleteTimelineTrack(int ix, TrackInfo trackinfo); void changeTimelineTrack(int ix, TrackInfo trackinfo); void saveThumbnails(); + void autoTransition(); public slots: void setCursorPos(int pos, bool seek = true); @@ -180,6 +181,7 @@ private: void updateSnapPoints(AbstractClipItem *selected); ClipItem *getClipItemAt(int pos, int track); ClipItem *getClipItemAt(GenTime pos, int track); + ClipItem *getClipItemAtEnd(GenTime pos, int track); Transition *getTransitionItemAt(int pos, int track); Transition *getTransitionItemAt(GenTime pos, int track); void checkScrolling(); diff --git a/src/effectstackedit.cpp b/src/effectstackedit.cpp index 2a63c12b..9beab1c1 100644 --- a/src/effectstackedit.cpp +++ b/src/effectstackedit.cpp @@ -81,7 +81,7 @@ void EffectStackEdit::transferParamDesc(const QDomElement& d, int in, int out) { QDomDocument doc; doc.appendChild(doc.importNode(params, true)); - kDebug() << "IMPORTED TRANS: " << doc.toString(); + //kDebug() << "IMPORTED TRANS: " << doc.toString(); QDomNodeList namenode = params.elementsByTagName("parameter"); QDomElement e = params.toElement(); const int minFrame = e.attribute("start").toInt(); diff --git a/src/kdenliveui.rc b/src/kdenliveui.rc index 86996649..0fd9a0ce 100644 --- a/src/kdenliveui.rc +++ b/src/kdenliveui.rc @@ -31,6 +31,7 @@ + Timeline diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 96bcdca7..3739c874 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -323,6 +323,8 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent m_timelineContextTransitionMenu->addAction(actionCollection()->action("delete_timeline_clip")); m_timelineContextTransitionMenu->addAction(actionCollection()->action(KStandardAction::name(KStandardAction::Copy))); + m_timelineContextTransitionMenu->addAction(actionCollection()->action("auto_transition")); + connect(projectMonitorDock, SIGNAL(visibilityChanged(bool)), m_projectMonitor, SLOT(refreshMonitor(bool))); connect(clipMonitorDock, SIGNAL(visibilityChanged(bool)), m_clipMonitor, SLOT(refreshMonitor(bool))); //connect(m_monitorManager, SIGNAL(connectMonitors()), this, SLOT(slotConnectMonitors())); @@ -716,10 +718,7 @@ void MainWindow::setupActions() { markIn->setShortcut(Qt::Key_I); connect(markIn, SIGNAL(triggered(bool)), this, SLOT(slotSetInPoint())); - KAction *markOut = collection->addAction("mark_out"); - markOut->setText(i18n("Set Out Point")); - markOut->setShortcut(Qt::Key_O); - connect(markOut, SIGNAL(triggered(bool)), this, SLOT(slotSetOutPoint())); + KAction* monitorSeekBackward = new KAction(KIcon("media-seek-backward"), i18n("Rewind"), this); monitorSeekBackward->setShortcut(Qt::Key_J); @@ -780,6 +779,10 @@ void MainWindow::setupActions() { collection->addAction("change_clip_speed", editTimelineClipSpeed); connect(editTimelineClipSpeed, SIGNAL(triggered(bool)), this, SLOT(slotChangeClipSpeed())); + KAction *stickTransition = collection->addAction("auto_transition"); + stickTransition->setText(i18n("Automatic Transition")); + connect(stickTransition, SIGNAL(triggered(bool)), this, SLOT(slotAutoTransition())); + KAction* cutTimelineClip = new KAction(KIcon("edit-cut"), i18n("Cut Clip"), this); cutTimelineClip->setShortcut(Qt::SHIFT + Qt::Key_R); collection->addAction("cut_timeline_clip", cutTimelineClip); @@ -2012,4 +2015,8 @@ void MainWindow::slotGetNewStuff() { initEffects::refreshLumas(); } +void MainWindow::slotAutoTransition() { + m_activeTimeline->projectView()->autoTransition(); +} + #include "mainwindow.moc" diff --git a/src/mainwindow.h b/src/mainwindow.h index c9ef5e9f..941bfdf3 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -270,6 +270,7 @@ private slots: void slotDeleteTrack(int ix = 0); void slotChangeTrack(int ix = 0); void slotGetNewStuff(); + void slotAutoTransition(); }; diff --git a/src/movetransitioncommand.cpp b/src/movetransitioncommand.cpp index b2b354c8..2164f157 100644 --- a/src/movetransitioncommand.cpp +++ b/src/movetransitioncommand.cpp @@ -18,7 +18,7 @@ #include "movetransitioncommand.h" #include "customtrackview.h" -MoveTransitionCommand::MoveTransitionCommand(CustomTrackView *view, const ItemInfo start, const ItemInfo end, bool doIt) : m_view(view), m_startPos(start), m_endPos(end), m_doIt(doIt) { +MoveTransitionCommand::MoveTransitionCommand(CustomTrackView *view, const ItemInfo start, const ItemInfo end, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_startPos(start), m_endPos(end), m_doIt(doIt) { setText(i18n("Move transition")); } diff --git a/src/movetransitioncommand.h b/src/movetransitioncommand.h index ae0adf31..f0e2f03c 100644 --- a/src/movetransitioncommand.h +++ b/src/movetransitioncommand.h @@ -30,7 +30,7 @@ class CustomTrackView; class MoveTransitionCommand : public QUndoCommand { public: - MoveTransitionCommand(CustomTrackView *view, const ItemInfo start, const ItemInfo end, bool doIt); + MoveTransitionCommand(CustomTrackView *view, const ItemInfo start, const ItemInfo end, bool doIt, QUndoCommand * parent = 0); virtual void undo(); virtual void redo(); diff --git a/src/resizeclipcommand.cpp b/src/resizeclipcommand.cpp index 61f596ba..f76c7687 100644 --- a/src/resizeclipcommand.cpp +++ b/src/resizeclipcommand.cpp @@ -26,7 +26,6 @@ ResizeClipCommand::ResizeClipCommand(CustomTrackView *view, const ItemInfo start setText(i18n("Resize clip")); } - // virtual void ResizeClipCommand::undo() { // kDebug()<<"---- undoing action"; diff --git a/src/transition.cpp b/src/transition.cpp index ea43261b..e2314e8c 100644 --- a/src/transition.cpp +++ b/src/transition.cpp @@ -84,6 +84,13 @@ bool Transition::isAutomatic() const { return m_automaticTransition; } +void Transition::setAutomatic(bool automatic) { + m_automaticTransition = automatic; + if (automatic) m_parameters.setAttribute("automatic", 1); + else m_parameters.removeAttribute("automatic"); + update(); +} + void Transition::setTransitionParameters(const QDomElement params) { m_parameters = params; if (m_parameters.attribute("force_track") == "1") setForcedTrack(true, m_parameters.attribute("transition_btrack").toInt()); @@ -150,7 +157,8 @@ void Transition::paint(QPainter *painter, painter->setMatrixEnabled(false); //painter->drawPixmap(painter->matrix().map(p1) + QPointF(5, 0), transitionPixmap()); QString text = transitionName(); - if (forcedTrack()) text.append("|>"); + if (m_forceTransitionTrack) text.append("|>"); + if (m_automaticTransition) text.prepend('+'); QRectF txtBounding = painter->boundingRect(mapped, Qt::AlignHCenter | Qt::AlignVCenter, " " + text + " "); painter->fillRect(txtBounding, QBrush(QColor(50, 50, 0, 150))); txtBounding.translate(QPointF(1, 1)); diff --git a/src/transition.h b/src/transition.h index b7bd2b50..cd845868 100644 --- a/src/transition.h +++ b/src/transition.h @@ -71,6 +71,7 @@ public: const ClipItem *referencedClip() const; Transition *clone(); bool isAutomatic() const; + void setAutomatic(bool automatic); protected: virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);