]> git.sesse.net Git - kdenlive/commitdiff
Fix transition moving (still crashing a lot)
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 26 Mar 2008 21:16:32 +0000 (21:16 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 26 Mar 2008 21:16:32 +0000 (21:16 +0000)
svn path=/branches/KDE4/; revision=2125

src/abstractclipitem.cpp
src/abstractclipitem.h
src/customtrackview.cpp
src/customtrackview.h
src/moveclipcommand.cpp
src/movetransitioncommand.cpp
src/movetransitioncommand.h
src/renderer.cpp
src/renderer.h

index 7466fa143cf7db6d792a7330fe37385fac5358d9..eac2062d96704cedfb80c4ff3fa874166fbcd747 100644 (file)
@@ -7,11 +7,10 @@
 AbstractClipItem::AbstractClipItem(const QRectF& rect): QGraphicsRectItem(rect), m_startFade(0), m_endFade(0) {
     setFlags(QGraphicsItem::ItemClipsToShape | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
 }
-void AbstractClipItem::moveTo(int x, double scale, double offset, int newTrack) {
+void AbstractClipItem::moveTo(int x, double scale, int offset, int newTrack) {
     double origX = rect().x();
     double origY = rect().y();
     bool success = true;
-
     if (x < 0) return;
     setRect(x * scale, origY + offset, rect().width(), rect().height());
     QList <QGraphicsItem *> collisionList = collidingItems(Qt::IntersectsItemBoundingRect);
index 42cfc90a7c97f8907b9ee9c0ca5c8db1a40c6467..621cedb0ba4cf658c88889c9444c6c1fc71616ad 100644 (file)
@@ -14,7 +14,7 @@ public:
     virtual void setTrack(int track);
     virtual GenTime endPos() const ;
     virtual int track() const ;
-    virtual void moveTo(int x, double scale, double offset, int newTrack);
+    virtual void moveTo(int x, double scale, int offset, int newTrack);
     virtual GenTime cropStart() const ;
     virtual  void resizeStart(int posx, double scale);
     virtual void resizeEnd(int posx, double scale);
index e8b5100852fdf6480946890fdcd64ae468fced79..a21cb9b4616791f85f9e8ea1adb26567f823487a 100644 (file)
@@ -33,6 +33,7 @@
 #include "clipitem.h"
 #include "definitions.h"
 #include "moveclipcommand.h"
+#include "movetransitioncommand.h"
 #include "resizeclipcommand.h"
 #include "addtimelineclipcommand.h"
 #include "addeffectcommand.h"
@@ -590,16 +591,12 @@ void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTr
     m_document->setModified(true);
 }
 
-void CustomTrackView::moveTransition(GenTime oldpos, GenTime newpos) {
-    kDebug() << "move";
-}
-
 void CustomTrackView::addItem(DocClipBase *clip, QPoint pos) {
     int in = 0;
     GenTime out = clip->duration();
     //kdDebug()<<"- - - -CREATING CLIP, duration = "<<out<<", URL: "<<clip->fileURL();
-    int trackTop = ((int) mapToScene(pos).y() / m_tracksHeight) * m_tracksHeight + 1;
-    m_dropItem = new ClipItem(clip, ((int) mapToScene(pos).y() / m_tracksHeight), GenTime(), QRectF(mapToScene(pos).x() * m_scale, trackTop, out.frames(m_document->fps()) * m_scale, m_tracksHeight - 1), out, m_document->fps());
+    int trackTop = (int)(mapToScene(pos).y() / m_tracksHeight) * m_tracksHeight + 1;
+    m_dropItem = new ClipItem(clip, (int)(mapToScene(pos).y() / m_tracksHeight), GenTime(), QRectF(mapToScene(pos).x() * m_scale, trackTop, out.frames(m_document->fps()) * m_scale, m_tracksHeight - 1), out, m_document->fps());
     scene()->addItem(m_dropItem);
 }
 
@@ -609,7 +606,7 @@ void CustomTrackView::dragMoveEvent(QDragMoveEvent * event) {
     //kDebug()<<"+++++++++++++   DRAG MOVE, : "<<mapToScene(event->pos()).x()<<", SCAL: "<<m_scale;
     if (m_dropItem) {
         int track = (int)(event->pos().y() / m_tracksHeight);  //) * (m_scale * 50) + m_scale;
-        m_dropItem->moveTo((int)(mapToScene(event->pos()).x() / m_scale), m_scale, (double)(track - m_dropItem->track()) * m_tracksHeight, track);
+        m_dropItem->moveTo((int)(mapToScene(event->pos()).x() / m_scale), m_scale, (int)((track - m_dropItem->track()) * m_tracksHeight), track);
         event->setDropAction(Qt::MoveAction);
         if (event->mimeData()->hasFormat("kdenlive/producerslist")) {
             event->acceptProposedAction();
@@ -734,20 +731,24 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
     setDragMode(QGraphicsView::NoDrag);
     if (m_dragItem == NULL) return;
     if (m_operationMode == MOVE) setCursor(Qt::OpenHandCursor);
-    if (m_operationMode == MOVE && m_startPos.x() != m_dragItem->startPos().frames(m_document->fps())) {
+    if (m_operationMode == MOVE) {// && m_startPos.x() != m_dragItem->startPos().frames(m_document->fps())) {
         // move clip
-        MoveClipCommand *command = new MoveClipCommand(this, m_startPos, QPointF(m_dragItem->startPos().frames(m_document->fps()), m_dragItem->track()), false);
-        m_commandStack->push(command);
-        if (m_dragItem->type() == AVWIDGET) m_document->renderer()->mltMoveClip((int)(m_tracksList.count() - m_startPos.y()), (int)(m_tracksList.count() - m_dragItem->track()), (int) m_startPos.x(), (int)(m_dragItem->startPos().frames(m_document->fps())));
+        if (m_dragItem->type() == AVWIDGET) {
+            MoveClipCommand *command = new MoveClipCommand(this, m_startPos, QPointF(m_dragItem->startPos().frames(m_document->fps()), m_dragItem->track()), false);
+            m_commandStack->push(command);
+            m_document->renderer()->mltMoveClip((int)(m_tracksList.count() - m_startPos.y()), (int)(m_tracksList.count() - m_dragItem->track()), (int) m_startPos.x(), (int)(m_dragItem->startPos().frames(m_document->fps())));
+        }
         if (m_dragItem->type() == TRANSITIONWIDGET) {
             Transition* transition = (Transition*)m_dragItem;
             GenTime oldin = transition->transitionStartTime();
             GenTime oldout = transition->transitionEndTime();
             GenTime newin = m_dragItem->startPos();
             GenTime newout = newin + (oldout - oldin);
-            m_document->renderer()->mltMoveTransition(transition->transitionName(),
-                    (int)(m_tracksList.count() - m_dragItem->track()), 0,
-                    oldin, oldout, newin, newout);
+            transition->moveTransition(newin - oldin);
+            MoveTransitionCommand *command = new MoveTransitionCommand(this, QPointF(oldin.frames(m_document->fps()), oldout.frames(m_document->fps())), QPointF(newin.frames(m_document->fps()), newout.frames(m_document->fps())), (int) m_startPos.y(), (int)(m_dragItem->track()), false);
+            m_commandStack->push(command);
+            //kDebug()<<"/// MOVING TRS FROM: "<<(int)(m_tracksList.count() - m_startPos.y())<<", OFFSET: "<<(int) (m_dragItem->track() - m_startPos.y());
+            m_document->renderer()->mltMoveTransition(transition->transitionName(), (int)(m_tracksList.count() - m_startPos.y()), (int)(m_startPos.y() - m_dragItem->track()), oldin, oldout, newin, newout);
         }
 
     } else if (m_operationMode == RESIZESTART) {
@@ -818,28 +819,50 @@ ClipItem *CustomTrackView::getClipItemAt(int pos, int track) {
 }
 
 ClipItem *CustomTrackView::getClipItemAt(GenTime pos, int track) {
-    QList<QGraphicsItem *> list = scene()->items(QPointF(pos.frames(m_document->fps()) * m_scale, track * m_tracksHeight + m_tracksHeight / 2));
-    ClipItem *clip = NULL;
+    int framepos = (int)(pos.frames(m_document->fps()) * m_scale);
+    return getClipItemAt(framepos, track);
+}
+
+Transition *CustomTrackView::getTransitionItemAt(int pos, int track) {
+    QList<QGraphicsItem *> list = scene()->items(QPointF(pos * m_scale, track * m_tracksHeight + m_tracksHeight / 2));
+    Transition *clip = NULL;
     for (int i = 0; i < list.size(); ++i) {
-        if (list.at(i)->type() == AVWIDGET) {
-            clip = static_cast <ClipItem *>(list.at(i));
+        if (list.at(i)->type() == TRANSITIONWIDGET) {
+            clip = static_cast <Transition *>(list.at(i));
             break;
         }
     }
     return clip;
 }
 
+Transition *CustomTrackView::getTransitionItemAt(GenTime pos, int track) {
+    int framepos = (int)(pos.frames(m_document->fps()) * m_scale);
+    return getTransitionItemAt(framepos, track);
+}
+
 void CustomTrackView::moveClip(const QPointF &startPos, const QPointF &endPos) {
     ClipItem *item = getClipItemAt((int)startPos.x() + 1, (int)startPos.y());
     if (!item) {
         kDebug() << "----------------  ERROR, CANNOT find clip to move at: " << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2;
         return;
     }
-    kDebug() << "----------------  Move CLIP FROM: " << startPos.x() << ", END:" << endPos.x();
-    item->moveTo((int)endPos.x(), m_scale, (endPos.y() - startPos.y()) * m_tracksHeight, (int)endPos.y());
+    kDebug() << "----------------  Move CLIP FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << startPos.y() << " TO " << endPos.y();
+    item->moveTo((int)endPos.x(), m_scale, (int)((endPos.y() - startPos.y()) * m_tracksHeight), (int)endPos.y());
     m_document->renderer()->mltMoveClip((int)(m_tracksList.count() - startPos.y()), (int)(m_tracksList.count() - endPos.y()), (int) startPos.x(), (int)endPos.x());
 }
 
+void CustomTrackView::moveTransition(const QPointF &startPos, const QPointF &endPos, int oldtrack, int newtrack) {
+    Transition *item = getTransitionItemAt((int)startPos.x() + 1, oldtrack);
+    if (!item) {
+        kDebug() << "----------------  ERROR, CANNOT find transition to move at: " << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2;
+        return;
+    }
+    kDebug() << "----------------  Move TRANSITION FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << oldtrack << " TO " << newtrack;
+    item->moveTo((int)endPos.x(), m_scale, (newtrack - oldtrack) * m_tracksHeight, newtrack);
+    //item->moveTransition(GenTime((int) (endPos.x() - startPos.x()), m_document->fps()));
+    m_document->renderer()->mltMoveTransition(item->transitionName(), m_tracksList.count() - oldtrack, oldtrack - newtrack, GenTime((int) startPos.x(), m_document->fps()), GenTime((int) startPos.y(), m_document->fps()), GenTime((int) endPos.x(), m_document->fps()), GenTime((int) endPos.y(), m_document->fps()));
+}
+
 void CustomTrackView::resizeClip(const QPointF &startPos, const QPointF &endPos, bool resizeClipStart) {
     int offset;
     if (resizeClipStart) offset = 1;
index 1b82e1fdf2af3b96839b15ddd6dc3b060aee1f15..60f4ff25fbce79cb6e3158621ccafa88874480bc 100644 (file)
@@ -47,6 +47,8 @@ public:
     int cursorPos();
     void checkAutoScroll();
     void moveClip(const QPointF &startPos, const QPointF &endPos);
+    /** move transition, startPos = (old start, old end), endPos = (new start, new end) */
+    void moveTransition(const QPointF &startPos, const QPointF &endPos, int oldtrack, int newtrack);
     void resizeClip(const QPointF &startPos, const QPointF &endPos, bool resizeClipStart);
     void addClip(QDomElement xml, int clipId, int track, GenTime startpos, const QRectF &rect, GenTime duration);
     void deleteClip(int track, GenTime startpos, const QRectF &rect);
@@ -59,7 +61,7 @@ public:
     void addTransition(int track, GenTime pos, QDomElement transition);
     void deleteTransition(int track, GenTime pos, QDomElement transition);
     void updateTransition(int track, GenTime pos,  QDomElement oldTransition, QDomElement transition);
-    void moveTransition(GenTime oldpos,GenTime newpos);
+    void moveTransition(GenTime oldpos, GenTime newpos);
     void activateMonitor();
     int duration() const;
     void deleteSelectedClips();
@@ -117,6 +119,8 @@ private:
     double getSnapPointForPos(double pos);
     ClipItem *getClipItemAt(int pos, int track);
     ClipItem *getClipItemAt(GenTime pos, int track);
+    Transition *getTransitionItemAt(int pos, int track);
+    Transition *getTransitionItemAt(GenTime pos, int track);
     void checkScrolling();
     /** Should we auto scroll while playing (keep in sync with KdenliveSettings::autoscroll() */
     bool m_autoScroll;
index eb933a565f2f32e246268f17be586e9b4f196e03..60856127206ac1d0ad1245aadece8195c4e49ec9 100644 (file)
@@ -31,12 +31,13 @@ MoveClipCommand::MoveClipCommand(CustomTrackView *view, const QPointF startPos,
 void MoveClipCommand::undo() {
 // kDebug()<<"----  undoing action";
     m_doIt = true;
-    if (m_doIt) m_view->moveClip(m_endPos, m_startPos);
+    m_view->moveClip(m_endPos, m_startPos);
 }
 // virtual
 void MoveClipCommand::redo() {
     kDebug() << "----  redoing action";
-    if (m_doIt) m_view->moveClip(m_startPos, m_endPos);
+    if (m_doIt)
+        m_view->moveClip(m_startPos, m_endPos);
     m_doIt = true;
 }
 
index b60684582c80b62d15b21c00958ebe64faa52066..d996839007b6ccdffd180c3d4afef428ec8d3daa 100644 (file)
@@ -19,7 +19,7 @@
 #include "movetransitioncommand.h"
 #include "customtrackview.h"
 MoveTransitionCommand::MoveTransitionCommand(CustomTrackView *view, const QPointF startPos, const QPointF endPos, int startTrack, int endTrack, bool doIt)
-        : m_view(view), m_startPos(startPos), m_endPos(endPos), m_doIt(doIt) {
+        : m_view(view), m_startPos(startPos), m_endPos(endPos), m_startTrack(startTrack), m_endTrack(endTrack), m_doIt(doIt) {
     setText(i18n("Move transition"));
 }
 
@@ -28,12 +28,12 @@ MoveTransitionCommand::MoveTransitionCommand(CustomTrackView *view, const QPoint
 void MoveTransitionCommand::undo() {
 // kDebug()<<"----  undoing action";
     m_doIt = true;
-    //if (m_doIt) m_view->moveTransition(m_endPos, m_startPos);
+    m_view->moveTransition(m_endPos, m_startPos, m_endTrack, m_startTrack);
 }
 // virtual
 void MoveTransitionCommand::redo() {
     kDebug() << "----  redoing action";
-    //if (m_doIt) m_view->moveTransition(m_startPos, m_endPos);
+    if (m_doIt) m_view->moveTransition(m_startPos, m_endPos, m_startTrack, m_endTrack);
     m_doIt = true;
 }
 
index a3e1cb6f0d52fc1edd9ce7335a79145a71bde14a..a3fad9500c17e54ecdeff0f4960ba52fe3762e0a 100644 (file)
@@ -28,7 +28,7 @@ class CustomTrackView;
 
 class MoveTransitionCommand : public QUndoCommand {
 public:
-    MoveTransitionCommand(CustomTrackView *view, const QPointF startPos, const QPointF endPos,int startTrack, int endTrack, bool doIt);
+    MoveTransitionCommand(CustomTrackView *view, const QPointF startPos, const QPointF endPos, int startTrack, int endTrack, bool doIt);
     virtual void undo();
     virtual void redo();
 
@@ -37,8 +37,8 @@ private:
     QPointF m_startPos;
     QPointF m_endPos;
     bool m_doIt;
-        int m_startTrack;
-        int m_endTrack;
+    int m_startTrack;
+    int m_endTrack;
 };
 
 #endif
index b6a8ac9969abd430d7fab2426406efc17c45f2da..1f363f67ab81fe840b989c89e9de3b3f4d2e9075 100644 (file)
@@ -837,7 +837,7 @@ double Render::playSpeed() {
     return 0.0;
 }
 
-const GenTime & Render::seekPosition() const {
+GenTime Render::seekPosition() const {
     if (m_mltProducer) return GenTime((int) m_mltProducer->position(), m_fps);
     else return GenTime();
 }
@@ -1370,16 +1370,16 @@ void Render::mltMoveTransition(QString type, int startTrack, int trackOffset, Ge
             int currentTrack = mlt_transition_get_b_track(tr);
             int currentIn = (int) mlt_transition_get_in(tr);
             int currentOut = (int) mlt_transition_get_out(tr);
-            kDebug() << "// FOUND EXISTING TRANS, IN: " << type << resource << currentIn << ", OUT: " << currentOut << ", TRACK: " << currentTrack;
-            //kDebug()<<"// LOOKING FOR IN: "<<old_in<<", OUT: "<<old_out;
-            kDebug() << "// OLD IN: " << oldIn.frames(m_fps) << " // OLD OUT: " << oldOut.frames(m_fps) << ", TRACK: " << startTrack << ", MID POS: " << old_pos;
+
+            //kDebug() << "// OLD IN: " << oldIn.frames(m_fps) << " // OLD OUT: " << oldOut.frames(m_fps) << ", TRACK: " << startTrack << ", CURR TRANS: " <<currentIn<<", MID:"<< old_pos<<currentOut;
             if (resource == type && startTrack == currentTrack && currentIn <= old_pos && currentOut >= old_pos) {
+                //kDebug() << "// FOUND EXISTING TRANS, IN: " << type << resource << currentIn << ", OUT: " << currentOut << ", TRACK: " << currentTrack;
                 mlt_transition_set_in_and_out(tr, new_in, new_out);
                 if (trackOffset != 0) {
                     mlt_properties properties = MLT_TRANSITION_PROPERTIES(tr);
                     mlt_properties_set_int(properties, "a_track", mlt_transition_get_a_track(tr) + trackOffset);
                     mlt_properties_set_int(properties, "b_track", mlt_transition_get_b_track(tr) + trackOffset);
-                    kDebug() << "set new start & end :" << new_in << new_out;
+                    //kDebug() << "set new start & end :" << new_in << new_out<< "TR OFFSET: "<<trackOffset<<", TRACKS: "<<mlt_transition_get_a_track(tr)<<"x"<<mlt_transition_get_b_track(tr);
                 }
                 break;
             }
@@ -1389,7 +1389,9 @@ void Render::mltMoveTransition(QString type, int startTrack, int trackOffset, Ge
             resource = mlt_properties_get(properties, "mlt_service");
         }
         m_isBlocked = false;
+        delete tractor;
     }
+    m_mltConsumer->set("refresh", 1);
 }
 
 void Render::mltUpdateTransition(QString oldTag, QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml) {
index 496c67ece2f8332683be915a9c05e6a2e17e3639..5a46e06bb5fde28eca36c0110aa05c5951c05584 100644 (file)
@@ -124,7 +124,7 @@ Q_OBJECT public:
     not playing anything. */
     double playSpeed();
     /** Returns the current seek position of the renderer. */
-    const GenTime & seekPosition() const;
+    GenTime seekPosition() const;
 
     void emitFrameNumber(double position);
     void emitConsumerStopped();