]> git.sesse.net Git - kdenlive/commitdiff
start work on automatic transitions
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 15 Dec 2008 12:33:07 +0000 (12:33 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 15 Dec 2008 12:33:07 +0000 (12:33 +0000)
svn path=/branches/KDE4/; revision=2789

src/customtrackview.cpp
src/customtrackview.h
src/effectstackedit.cpp
src/kdenliveui.rc
src/mainwindow.cpp
src/mainwindow.h
src/movetransitioncommand.cpp
src/movetransitioncommand.h
src/resizeclipcommand.cpp
src/transition.cpp
src/transition.h

index 78c0ca31c8a6d911c02019eb2c92681994e4293a..822714a29966b25240e303752d2e01d84b00e028 100644 (file)
@@ -1638,17 +1638,22 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                 ClipItem *item = static_cast <ClipItem *>(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 <ClipItem *>(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 <Transition *>(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<QGraphicsItem *> 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 <ClipItem *>(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<QGraphicsItem *> 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 <ItemInfo> startClip, QList <ItemInfo> 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<QGraphicsItem *> 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 <Transition*>(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"
index 1608e47e579c9b580e9406ecc6105fdb166a6623..5ae843b092da18f575362eefa8c6509e498b8aa5 100644 (file)
@@ -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();
index 2a63c12b178e287d4da18884821ff225bbb47756..9beab1c13bc982662d9bef3c7b4d26a843e82798 100644 (file)
@@ -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();
index 869966495137cc05c30b92cb4e7683e586cd8ad4..0fd9a0ce7707be1169438998f53c3105c04f0312 100644 (file)
@@ -31,6 +31,7 @@
                <Action name="delete_clip_marker" />
                <Action name="delete_all_clip_markers" />
          </Menu>
+         <Action name="auto_transition" />
     </Menu>
 
     <Menu name="timeline" ><text>Timeline</text>
index 96bcdca7a4534dff418f01f92515f0055c08e5a6..3739c874902952b726752a3d12baa7e06a32af49 100644 (file)
@@ -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"
index c9ef5e9f343a8b5e4e0382b951aec4e4c836e023..941bfdf3abaae9d8880e9ed3e8a2b1c99a2321bf 100644 (file)
@@ -270,6 +270,7 @@ private slots:
     void slotDeleteTrack(int ix = 0);
     void slotChangeTrack(int ix = 0);
     void slotGetNewStuff();
+    void slotAutoTransition();
 };
 
 
index b2b354c8d3375ed7bdfa692265594eea05ffce9a..2164f157b5f0bd7e216c8b2f6f0b9e4567d67e7d 100644 (file)
@@ -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"));
 }
 
index ae0adf311e374d0c5b8895878473fd1f521c8a35..f0e2f03ce5cdf2c96b03011521b6c85be8094fd5 100644 (file)
@@ -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();
 
index 61f596ba31e2a63cfa0cbef0ac2692ffce369f6b..f76c7687069d1de9f8973c63aa94fff6449c19dd 100644 (file)
@@ -26,7 +26,6 @@ ResizeClipCommand::ResizeClipCommand(CustomTrackView *view, const ItemInfo start
     setText(i18n("Resize clip"));
 }
 
-
 // virtual
 void ResizeClipCommand::undo() {
 // kDebug()<<"----  undoing action";
index ea43261b7e2be33254058e4a9c4c857509075450..e2314e8c1bcfee2aa6ecfd306310342e7cfb4a40 100644 (file)
@@ -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));
index b7bd2b500ff3b1dcb6323817056d5ca95962a277..cd845868de3b1730b9ba788732481c08a3ce5f58 100644 (file)
@@ -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);