]> git.sesse.net Git - kdenlive/commitdiff
Almost solved all group move issues, still one lost synchro bug under investigation
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 11 Dec 2008 12:46:34 +0000 (12:46 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 11 Dec 2008 12:46:34 +0000 (12:46 +0000)
svn path=/branches/KDE4/; revision=2774

src/CMakeLists.txt
src/customtrackview.cpp
src/customtrackview.h
src/docclipbase.cpp
src/movegroupcommand.cpp [new file with mode: 0644]
src/movegroupcommand.h [new file with mode: 0644]

index dfc8bf2fe42463f8101dac4207fb0975497885bf..34c80f92a1e99f1253774d036cfe6d90330507e3 100644 (file)
@@ -138,6 +138,7 @@ set(kdenlive_SRCS
   spacerdialog.cpp
   addtrackcommand.cpp
   changetrackcommand.cpp
+  movegroupcommand.cpp
 )
 
 if(NO_JOGSHUTTLE)
index a24be28629af7cdbb882926be16dbbaabc5c16d7..475cf94b8995eb6b5c7de82cc9abceec204b8ff5 100644 (file)
@@ -65,6 +65,7 @@
 #include "spacerdialog.h"
 #include "addtrackcommand.h"
 #include "changetrackcommand.h"
+#include "movegroupcommand.h"
 #include "ui_addtrack_ui.h"
 
 //TODO:
@@ -571,8 +572,8 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) {
     if (event->button() == Qt::RightButton) {
         if (m_dragItem) {
             if (!m_dragItem->isSelected()) {
+                resetSelectionGroup(false);
                 m_scene->clearSelection();
-                resetSelectionGroup();
                 m_dragItem->setSelected(true);
             }
         }
@@ -721,13 +722,13 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) {
     //QGraphicsView::mousePressEvent(event);
 }
 
-void CustomTrackView::resetSelectionGroup() {
+void CustomTrackView::resetSelectionGroup(bool selectItems) {
     if (m_selectionGroup) {
         // delete selection group
         QList<QGraphicsItem *> children = m_selectionGroup->childItems();
         for (int i = 0; i < children.count(); i++) {
             children.at(i)->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
-            children.at(i)->setSelected(true);
+            children.at(i)->setSelected(selectItems);
         }
         scene()->destroyItemGroup(m_selectionGroup);
         m_selectionGroup = NULL;
@@ -735,6 +736,7 @@ void CustomTrackView::resetSelectionGroup() {
 }
 
 void CustomTrackView::groupSelectedItems() {
+    if (m_selectionGroup) kDebug() << "///// ERROR, TRYING TO OVERRIDE EXISTING GROUP";
     QList<QGraphicsItem *> selection = m_scene->selectedItems();
     if (selection.count() > 1) {
         m_selectionGroup = new AbstractGroupItem(m_document->fps());
@@ -755,7 +757,7 @@ void CustomTrackView::groupSelectedItems() {
             m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps());
             m_selectionGroupInfo.track = m_selectionGroup->track();
         }
-    }
+    } else resetSelectionGroup();
 }
 
 void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event) {
@@ -881,7 +883,7 @@ void CustomTrackView::dragEnterEvent(QDragEnterEvent * event) {
     } else if (event->mimeData()->hasFormat("kdenlive/producerslist")) {
         QStringList ids = QString(event->mimeData()->data("kdenlive/producerslist")).split(";");
         m_scene->clearSelection();
-        resetSelectionGroup();
+        resetSelectionGroup(false);
 
         m_selectionGroup = new AbstractGroupItem(m_document->fps());
         QPoint pos = QPoint();
@@ -1269,8 +1271,8 @@ void CustomTrackView::dragLeaveEvent(QDragLeaveEvent * event) {
 void CustomTrackView::dropEvent(QDropEvent * event) {
     if (m_selectionGroup) {
         QList<QGraphicsItem *> items = m_selectionGroup->childItems();
-        m_scene->clearSelection();
         resetSelectionGroup();
+        m_scene->clearSelection();
         for (int i = 0; i < items.count(); i++) {
             ClipItem *item = static_cast <ClipItem *>(items.at(i));
             AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false);
@@ -1677,12 +1679,14 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
 
             QList<QGraphicsItem *> items = m_selectionGroup->childItems();
 
+            QList<ItemInfo> clipsToMove = QList<ItemInfo> ();
+            QList<ItemInfo> transitionsToMove = QList<ItemInfo> ();
+
             GenTime timeOffset = GenTime(m_selectionGroup->scenePos().x(), m_document->fps()) - m_selectionGroupInfo.startPos;
             const int trackOffset = m_selectionGroup->track() - m_selectionGroupInfo.track;
-            // kDebug() << "&DROPPED GRPOUP:" << timeOffset.frames(25) << "TRK OFF: " << trackOffset;
             if (timeOffset != GenTime() || trackOffset != 0) {
                 QUndoCommand *moveClips = new QUndoCommand();
-                moveClips->setText("Move clips");
+                moveClips->setText(i18n("Move group"));
                 // remove items in MLT playlist
                 for (int i = 0; i < items.count(); i++) {
                     AbstractClipItem *item = static_cast <AbstractClipItem *>(items.at(i));
@@ -1692,13 +1696,11 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                             // error, clip cannot be removed from playlist
                             emit displayMessage(i18n("Error removing clip at %1 on track %2", m_document->timecode().getTimecodeFromFrames(info.startPos.frames(m_document->fps())), info.track), ErrorMessage);
                         } else {
-                            // clip removed from playlist, create command
-                            ClipItem *clip = static_cast <ClipItem*>(item);
-                            new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, true, moveClips);
+                            clipsToMove.append(info);
                         }
                     } else {
+                        transitionsToMove.append(info);
                         Transition *tr = static_cast <Transition*>(item);
-                        new AddTransitionCommand(this, info, tr->transitionEndTrack(), tr->toXML(), true, false, moveClips);
                         m_document->renderer()->mltDeleteTransition(tr->transitionTag(), tr->transitionEndTrack(), m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
                     }
                 }
@@ -1708,12 +1710,8 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                     AbstractClipItem *item = static_cast <AbstractClipItem *>(items.at(i));
                     item->updateItem();
                     ItemInfo info = item->info();
-                    /*info.startPos = info.startPos + timeOffset;
-                    info.endPos = info.endPos + timeOffset;
-                    info.track = info.track + trackOffset;*/
                     if (item->type() == AVWIDGET) {
                         ClipItem *clip = static_cast <ClipItem*>(item);
-                        new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, false, moveClips);
                         info.track = m_document->tracksCount() - info.track;
                         m_document->renderer()->mltInsertClip(info, clip->xml(), clip->baseClip()->producer(info.track));
                     } else {
@@ -1723,12 +1721,15 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                             newTrack += trackOffset;
                             if (newTrack < 0 || newTrack > m_document->tracksCount()) newTrack = getPreviousVideoTrack(info.track);
                         }
-                        new AddTransitionCommand(this, info, newTrack, tr->toXML(), false, false, moveClips);
-
+                        tr->updateTransitionEndTrack(newTrack);
                         m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
                     }
                 }
+
+                new MoveGroupCommand(this, clipsToMove, transitionsToMove, timeOffset, trackOffset, false, moveClips);
                 m_commandStack->push(moveClips);
+                m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps());
+                m_selectionGroupInfo.track = m_selectionGroup->track();
             }
         }
 
@@ -2039,6 +2040,78 @@ void CustomTrackView::moveClip(const ItemInfo start, const ItemInfo end) {
     }
 }
 
+void CustomTrackView::moveGroup(QList <ItemInfo> startClip, QList <ItemInfo> startTransition, const GenTime offset, const int trackOffset, bool reverseMove) {
+    // Group Items
+    kDebug() << "// GROUP MOVE; OFFSET: " << offset.frames(25) << ", TK OFF: " << trackOffset;
+    resetSelectionGroup();
+    m_scene->clearSelection();
+    for (int i = 0; i < startClip.count(); i++) {
+        if (reverseMove) {
+            startClip[i].startPos = startClip.at(i).startPos - offset;
+            startClip[i].track = startClip.at(i).track - trackOffset;
+        }
+        ClipItem *clip = getClipItemAt(startClip.at(i).startPos, startClip.at(i).track);
+        if (clip) {
+            clip->setSelected(true);
+            m_document->renderer()->mltRemoveClip(m_document->tracksCount() - startClip.at(i).track, startClip.at(i).startPos);
+        }
+    }
+    for (int i = 0; i < startTransition.count(); i++) {
+        if (reverseMove) {
+            startTransition[i].startPos = startTransition.at(i).startPos - offset;
+            startTransition[i].track = startTransition.at(i).track - trackOffset;
+        }
+        Transition *tr = getTransitionItemAt(startTransition.at(i).startPos, startTransition.at(i).track);
+        if (tr) {
+            tr->setSelected(true);
+            m_document->renderer()->mltDeleteTransition(tr->transitionTag(), tr->transitionEndTrack(), m_document->tracksCount() - startTransition.at(i).track, startTransition.at(i).startPos, startTransition.at(i).endPos, tr->toXML());
+        }
+    }
+    groupSelectedItems();
+    if (m_selectionGroup) {
+        QPointF pos = m_selectionGroup->pos();
+        qreal posx = pos.x() + offset.frames(m_document->fps());
+        qreal posy = pos.y() + trackOffset * (qreal) m_tracksHeight;
+        m_selectionGroup->setPos(posx, posy);
+        m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps());
+        m_selectionGroupInfo.track = m_selectionGroup->track();
+        kDebug() << "// Current GRUOP POS: " << pos.y() << ", TK OFF: " << trackOffset << ", TK HG: " << m_tracksHeight << ", POS: " << posx << "x" << posy;
+
+        /*QPointF top = m_selectionGroup->boundingRect().topLeft();
+        const int width = m_selectionGroup->boundingRect().width();
+        const int height = m_selectionGroup->boundingRect().height();
+        m_selectionGroup->setPos(top);
+        m_selectionGroup->translate(-top.x(), -top.y() + 1);
+        m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps());
+        m_selectionGroupInfo.track = m_selectionGroup->track();*/
+
+        QList<QGraphicsItem *> children = m_selectionGroup->childItems();
+        for (int i = 0; i < children.count(); i++) {
+            // re-add items in correct place
+            AbstractClipItem *item = static_cast <AbstractClipItem *>(children.at(i));
+            item->updateItem();
+            ItemInfo info = item->info();
+            if (item->type() == AVWIDGET) {
+                ClipItem *clip = static_cast <ClipItem*>(item);
+                info.track = m_document->tracksCount() - info.track;
+                m_document->renderer()->mltInsertClip(info, clip->xml(), clip->baseClip()->producer(info.track));
+            } else {
+                Transition *tr = static_cast <Transition*>(item);
+                int newTrack = tr->transitionEndTrack();
+                kDebug() << "/// TRANSITION CURR TRK: " << newTrack;
+                if (!tr->forcedTrack()) {
+                    newTrack += trackOffset;
+                    if (newTrack < 0 || newTrack > m_document->tracksCount()) newTrack = getPreviousVideoTrack(info.track);
+                }
+                tr->updateTransitionEndTrack(newTrack);
+                kDebug() << "/// TRANSITION UPDATED TRK: " << newTrack;
+                m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
+            }
+        }
+    }
+
+}
+
 void CustomTrackView::moveTransition(const ItemInfo start, const ItemInfo end) {
     Transition *item = getTransitionItemAt((int)start.startPos.frames(m_document->fps()), start.track);
     if (!item) {
index 9c6a91ec8e715d76f78c500fb5af6bf5e105639c..02c93a7f37aa3f7ddff98c8c117aba472a0e32f6 100644 (file)
@@ -54,6 +54,7 @@ public:
     int cursorPos();
     void checkAutoScroll();
     void moveClip(const ItemInfo start, const ItemInfo end);
+    void moveGroup(QList <ItemInfo> startClip, QList <ItemInfo> startTransition, const GenTime offset, const int trackOffset, bool reverseMove = false);
     /** move transition, startPos = (old start, old end), endPos = (new start, new end) */
     void moveTransition(const ItemInfo start, const ItemInfo end);
     void resizeClip(const ItemInfo start, const ItemInfo end);
@@ -212,7 +213,7 @@ private:
     ClipItem *getClipUnderCursor() const;
     ClipItem *getMainActiveClip() const;
     bool insertPossible(AbstractGroupItem *group, const QPoint &pos) const;
-    void resetSelectionGroup();
+    void resetSelectionGroup(bool selectItems = true);
     void groupSelectedItems();
 
 private slots:
index dc1bba96329f82461619e6e9a4ab9619a26f636e..7950189e177c0f217088ce2ff359c0bf35ddf9a2 100644 (file)
@@ -390,9 +390,9 @@ void DocClipBase::setProducer(Mlt::Producer *producer) {
 }
 
 Mlt::Producer *DocClipBase::producer(int track) {
-    for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+    /*for (int i = 0; i < m_baseTrackProducers.count(); i++) {
         if (m_baseTrackProducers.at(i)) kDebug() << "// PROD: " << i << ", ID: " << m_baseTrackProducers.at(i)->get("id");
-    }
+    }*/
     if (track == -1 || (m_clipType != AUDIO && m_clipType != AV)) {
         if (m_baseTrackProducers.count() == 0) return NULL;
         int i;
diff --git a/src/movegroupcommand.cpp b/src/movegroupcommand.cpp
new file mode 100644 (file)
index 0000000..38b2ba8
--- /dev/null
@@ -0,0 +1,43 @@
+/***************************************************************************
+ *   Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org)        *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
+ ***************************************************************************/
+
+#include <KLocale>
+
+#include "movegroupcommand.h"
+#include "customtrackview.h"
+
+MoveGroupCommand::MoveGroupCommand(CustomTrackView *view, const QList <ItemInfo> startClip, const QList <ItemInfo> startTransition, const GenTime offset, const int trackOffset, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_startClip(startClip), m_startTransition(startTransition), m_offset(offset), m_trackOffset(trackOffset), m_doIt(doIt) {
+    setText(i18n("Move clip"));
+}
+
+
+// virtual
+void MoveGroupCommand::undo() {
+// kDebug()<<"----  undoing action";
+    m_doIt = true;
+    m_view->moveGroup(m_startClip, m_startTransition, GenTime() - m_offset, - m_trackOffset, true);
+}
+// virtual
+void MoveGroupCommand::redo() {
+    kDebug() << "----  redoing action";
+    if (m_doIt)
+        m_view->moveGroup(m_startClip, m_startTransition, m_offset, m_trackOffset);
+    m_doIt = true;
+}
+
diff --git a/src/movegroupcommand.h b/src/movegroupcommand.h
new file mode 100644 (file)
index 0000000..d5cae66
--- /dev/null
@@ -0,0 +1,50 @@
+/***************************************************************************
+ *   Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org)        *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
+ ***************************************************************************/
+
+
+#ifndef MOVEGROUPCOMMAND_H
+#define MOVEGROUPCOMMAND_H
+
+#include <QUndoCommand>
+#include <QGraphicsView>
+#include <QPointF>
+
+#include <KDebug>
+#include "definitions.h"
+
+class GenTime;
+class CustomTrackView;
+
+class MoveGroupCommand : public QUndoCommand {
+public:
+    MoveGroupCommand(CustomTrackView *view, const QList <ItemInfo> startClip, const QList <ItemInfo> startTransition, const GenTime offset, const int trackOffset, bool doIt, QUndoCommand * parent = 0);
+    virtual void undo();
+    virtual void redo();
+
+private:
+    CustomTrackView *m_view;
+    const QList <ItemInfo> m_startClip;
+    const QList <ItemInfo> m_startTransition;
+    const GenTime m_offset;
+    const int m_trackOffset;
+    bool m_doIt;
+};
+
+#endif
+