]> git.sesse.net Git - kdenlive/commitdiff
Fix overwrite clip insert
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 1 Nov 2009 09:38:15 +0000 (09:38 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 1 Nov 2009 09:38:15 +0000 (09:38 +0000)
svn path=/trunk/kdenlive/; revision=4080

src/abstractclipitem.cpp
src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp
src/customtrackview.h
src/mainwindow.cpp
src/projectlistview.cpp

index 9c191d36e9dddb3b05e5f4ad91705ecec5ffa9d9..a9aec95ff3382602e5d04b9bcd79101483ae08df 100644 (file)
@@ -58,7 +58,7 @@ void AbstractClipItem::closeAnimation()
 {
 #if QT_VERSION >= 0x040600
     if (m_closeAnimation) return;
-    m_closeAnimation = new QPropertyAnimation(this, "rect");
+    m_closeAnimation = new QPropertyAnimation(this, "geometry");
     connect(m_closeAnimation, SIGNAL(finished()), this, SLOT(deleteLater()));
     m_closeAnimation->setDuration(200);
     QRectF r = rect();
@@ -142,13 +142,15 @@ void AbstractClipItem::resizeStart(int posx)
     if (type() == AVWIDGET) {
         m_info.cropStart += durationDiff;
     }
+
     m_info.cropDuration = m_info.cropDuration - durationDiff;
     setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height());
     moveBy(durationDiff.frames(m_fps), 0);
-    //setPos(m_startPos.frames(m_fps), pos().y());
-    if ((int) scenePos().x() != posx) {
+
+    if (m_info.startPos != GenTime(posx, m_fps)) {
+        kDebug() << "__ RESIZE START OFFSET: ";
         //kDebug()<<"//////  WARNING, DIFF IN XPOS: "<<pos().x()<<" == "<<m_startPos.frames(m_fps);
-        GenTime diff = GenTime((int) pos().x() - posx, m_fps);
+        GenTime diff = m_info.startPos - GenTime((int) posx, m_fps);
 
         if (type() == AVWIDGET) {
             m_info.cropStart += diff;
@@ -196,10 +198,10 @@ void AbstractClipItem::resizeEnd(int posx)
         for (int i = 0; i < collisionList.size(); ++i) {
             QGraphicsItem *item = collisionList.at(i);
             if (item->type() == type() && item->pos().x() > pos().x()) {
-                /*kDebug() << "/////////  COLLISION DETECTED!!!!!!!!!";
+                kDebug() << "/////////  COLLISION DETECTED!!!!!!!!!";
                 kDebug() << "/////////  CURRENT: " << startPos().frames(25) << "x" << endPos().frames(25) << ", RECT: " << rect() << "-" << pos();
-                kDebug() << "/////////  COLLISION: " << ((AbstractClipItem *)item)->startPos().frames(25) << "x" << ((AbstractClipItem *)item)->endPos().frames(25) << ", RECT: " << ((AbstractClipItem *)item)->rect() << "-" << item->pos();*/
-                GenTime diff = ((AbstractClipItem *)item)->startPos() - GenTime(1, m_fps) - startPos();
+                kDebug() << "/////////  COLLISION: " << ((AbstractClipItem *)item)->startPos().frames(25) << "x" << ((AbstractClipItem *)item)->endPos().frames(25) << ", RECT: " << ((AbstractClipItem *)item)->rect() << "-" << item->pos();
+                GenTime diff = ((AbstractClipItem *)item)->startPos() - startPos();
                 m_info.cropDuration = diff;
                 setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height());
                 break;
index 0b657927c2b1b20d56bbf8382a52525430115bea..befec3a43cfced6e57abf8523385c07d79567f0b 100644 (file)
@@ -1197,6 +1197,7 @@ QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value)
                         subitems.removeAll(this);
                         for (int j = 0; j < subitems.count(); j++) {
                             if (subitems.at(j)->type() == type()) {
+                                // move was not successful, revert to previous pos
                                 m_info.startPos = GenTime((int) pos().x(), m_fps);
                                 return pos();
                             }
@@ -1205,6 +1206,7 @@ QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value)
 
                     m_info.track = newTrack;
                     m_info.startPos = GenTime((int) newPos.x(), m_fps);
+
                     return newPos;
                 }
             }
index 7be82c5a7ab9bdd9a368e55a22866e8e8b4ca55c..0998eccb71b632c0290031f9995ccee00102546f 100644 (file)
@@ -87,7 +87,9 @@ public:
     /** Returns a list of times for this clip's markers */
     QList <GenTime> snapMarkers() const;
     QList <CommentedTime> commentedSnapMarkers() const;
+    /** Get the position of the fade in effect */
     int fadeIn() const;
+    /** Get the position of the fade out effect */
     int fadeOut() const;
     void setSelectedEffect(const int ix);
     void updateKeyframeEffect();
index a88a2e87a59da7268546616b1acb2b3ac6a2bb45..2c2ec67c1e984d4779037d9211ebf08596012eed 100644 (file)
 #include <QInputDialog>
 #include <KMessageBox>
 
+#if QT_VERSION >= 0x040600
+#include <QGraphicsDropShadowEffect>
+#endif
+
 bool sortGuidesList(const Guide *g1 , const Guide *g2)
 {
     return (*g1).position() < (*g2).position();
@@ -752,7 +756,14 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
         if (m_dragItem) emit clipItemSelected(NULL);
         m_dragItem = NULL;
     }
-
+#if QT_VERSION >= 0x040600
+    // Add shadow to dragged item, currently disabled because of painting artifacts
+    //TODO: re-enable when fixed
+    /*QGraphicsDropShadowEffect *eff = new QGraphicsDropShadowEffect();
+    eff->setBlurRadius(5);
+    eff->setOffset(3, 3);
+    m_dragItem->setGraphicsEffect(eff);*/
+#endif
     if (m_dragItem && m_dragItem->type() == TRANSITIONWIDGET) {
         // update transition menu action
         m_autoTransition->setChecked(static_cast<Transition *>(m_dragItem)->isAutomatic());
@@ -1721,7 +1732,8 @@ ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, boo
         newPos.track = info.track;
         newPos.cropDuration = newPos.endPos - newPos.startPos;
 
-
+        bool snap = KdenliveSettings::snaptopoints();
+        KdenliveSettings::setSnaptopoints(false);
         ClipItem *dup = item->clone(newPos);
         // remove unwanted effects (fade in) from 2nd part of cutted clip
         int ix = dup->hasEffect(QString(), "fadein");
@@ -1741,6 +1753,7 @@ ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, boo
         item->baseClip()->addReference();
         m_document->updateClip(item->baseClip()->getId());
         setDocumentModified();
+        KdenliveSettings::setSnaptopoints(snap);
         return dup;
         //kDebug() << "/////////  CUTTING CLIP RESULT: (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), DUP: (" << dup->startPos().frames(25) << "-" << dup->endPos().frames(25) << ")" << ", CUT: " << cutTime.frames(25);
     } else {
@@ -1748,6 +1761,7 @@ ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, boo
 
         ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track);
         ClipItem *dup = getClipItemAt((int) cutTime.frames(m_document->fps()), info.track);
+
         if (!item || !dup || item == dup) {
             emit displayMessage(i18n("Cannot find clip to uncut"), ErrorMessage);
             m_blockRefresh = false;
@@ -1763,6 +1777,8 @@ ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, boo
         kDebug() << "// UNCUTTING CLIPS, INFO (" << info.startPos.frames(25) << "x" << info.endPos.frames(25) << ") , CUT: " << cutTime.frames(25);;*/
         //deleteClip(dup->info());
 
+        bool snap = KdenliveSettings::snaptopoints();
+        KdenliveSettings::setSnaptopoints(false);
 
         if (dup->isSelected()) emit clipItemSelected(NULL);
         dup->baseClip()->removeReference();
@@ -1778,6 +1794,7 @@ ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, boo
             setDocumentModified();
         } else
             emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
+        KdenliveSettings::setSnaptopoints(snap);
         return item;
 
     }
@@ -2018,7 +2035,7 @@ void CustomTrackView::dropEvent(QDropEvent * event)
             if (m_document->renderer()->mltInsertClip(clipInfo, item->xml(), item->baseClip()->producer(item->track()), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT) == -1) {
                 emit displayMessage(i18n("Cannot insert clip in timeline"), ErrorMessage);
             }
-            adjustTimelineClips(m_scene->editMode(), item, addCommand);
+            adjustTimelineClips(m_scene->editMode(), item, ItemInfo(), addCommand);
 
             new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT, false, false, addCommand);
 
@@ -2031,6 +2048,25 @@ void CustomTrackView::dropEvent(QDropEvent * event)
         }
         m_commandStack->push(addCommand);
         setDocumentModified();
+
+        /*
+        // debug info
+        QRectF rect(0, 1 * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), 2);
+        QList<QGraphicsItem *> selection = m_scene->items(rect);
+        QStringList timelineList;
+
+        kDebug()<<"// ITEMS on TRACK: "<<selection.count();
+        for (int i = 0; i < selection.count(); i++) {
+               if (selection.at(i)->type() == AVWIDGET) {
+                   ClipItem *clip = static_cast <ClipItem *>(selection.at(i));
+                   int start = clip->startPos().frames(m_document->fps());
+                   int end = clip->endPos().frames(m_document->fps());
+                   timelineList.append(QString::number(start) + "-" + QString::number(end));
+            }
+        }
+        kDebug() << "// COMPARE:\n" << timelineList << "\n-------------------";
+        */
+
         m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
         if (items.count() > 1) groupSelectedItems(true);
         event->setDropAction(Qt::MoveAction);
@@ -2039,16 +2075,18 @@ void CustomTrackView::dropEvent(QDropEvent * event)
     setFocus();
 }
 
-void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, QUndoCommand *command)
+void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, ItemInfo posinfo, QUndoCommand *command)
 {
     if (mode == OVERWRITEEDIT) {
         // if we are in overwrite or push mode, move clips accordingly
         bool snap = KdenliveSettings::snaptopoints();
         KdenliveSettings::setSnaptopoints(false);
-        ItemInfo info = item->info();
+        ItemInfo info;
+        if (item == NULL) info = posinfo;
+        else info = item->info();
         QRectF rect(info.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight / 2, (info.endPos - info.startPos).frames(m_document->fps()) - 1, 5);
         QList<QGraphicsItem *> selection = m_scene->items(rect);
-        selection.removeAll(item);
+        if (item) selection.removeAll(item);
         for (int i = 0; i < selection.count(); i++) {
             if (selection.at(i)->type() == AVWIDGET) {
                 ClipItem *clip = static_cast<ClipItem *>(selection.at(i));
@@ -2056,7 +2094,7 @@ void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, QUndoCo
                     if (clip->endPos() > info.endPos) {
                         ItemInfo clipInfo = clip->info();
                         ItemInfo dupInfo = clipInfo;
-                        GenTime diff = info.startPos - clip->startPos();
+                        GenTime diff = info.startPos - clipInfo.startPos;
                         dupInfo.startPos = info.startPos;
                         dupInfo.cropStart += diff;
                         dupInfo.cropDuration = clipInfo.endPos - info.startPos;
@@ -2069,6 +2107,11 @@ void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, QUndoCo
                         new ResizeClipCommand(this, dupInfo, newdupInfo, false, false, command);
                         ClipItem *dup = cutClip(clipInfo, info.startPos, true, false);
                         if (dup) dup->resizeStart(info.endPos.frames(m_document->fps()));
+                        kDebug() << "-----------------------------";
+
+                        kDebug() << "///RES+CUT: " << dup->startPos().frames(25) << "x" << dup->endPos().frames(25);
+                        kDebug() << "-----------------------------";
+
 
                     } else {
                         ItemInfo newclipInfo = clip->info();
@@ -2631,6 +2674,9 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
     if (m_moveOpMode == SEEK) m_moveOpMode = NONE;
     QGraphicsView::mouseReleaseEvent(event);
     setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);
+#if QT_VERSION >= 0x040600
+    if (m_dragItem) m_dragItem->setGraphicsEffect(NULL);
+#endif
     if (m_scrollTimer.isActive()) m_scrollTimer.stop();
     if (event->button() == Qt::MidButton) {
         return;
@@ -2736,7 +2782,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                 if (success) {
                     QUndoCommand *moveCommand = new QUndoCommand();
                     moveCommand->setText(i18n("Move clip"));
-                    adjustTimelineClips(m_scene->editMode(), item, moveCommand);
+                    adjustTimelineClips(m_scene->editMode(), item, ItemInfo(), moveCommand);
 
                     int tracknumber = m_document->tracksCount() - item->track() - 1;
                     bool isLocked = m_document->trackInfoAt(tracknumber).isLocked;
@@ -2928,7 +2974,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                         ClipItem *clip = static_cast <ClipItem*>(item);
                         info.track = m_document->tracksCount() - info.track;
                         Mlt::Producer *prod;
-                        adjustTimelineClips(m_scene->editMode(), clip, moveGroup);
+                        adjustTimelineClips(m_scene->editMode(), clip, ItemInfo(), moveGroup);
                         if (clip->isAudioOnly()) prod = clip->baseClip()->audioProducer(info.track);
                         else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer();
                         else prod = clip->baseClip()->producer(info.track);
@@ -3295,7 +3341,13 @@ void CustomTrackView::deleteClip(ItemInfo info, bool refresh)
     if (m_dragItem == item) m_dragItem = NULL;
 #if QT_VERSION >= 0x040600
     // animate item deletion
-    item->closeAnimation();
+    if (refresh) item->closeAnimation();
+    else {
+        // no refresh, means we have several operations chained, we need to delete clip immediatly
+        // so that it does not get in the way of the other
+        delete item;
+        item = NULL;
+    }
 #else
     delete item;
     item = NULL;
@@ -5486,7 +5538,9 @@ void CustomTrackView::insertZoneOverwrite(QStringList data, int in)
     info.endPos = info.startPos + GenTime(data.at(2).toInt(), m_document->fps()) - info.cropStart;
     info.cropDuration = info.endPos - info.startPos;
     info.track = m_selectedTrack;
-
-    AddTimelineClipCommand *add = new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), info, EffectsList(), true, false, true, false);
-    m_commandStack->push(add);
+    QUndoCommand *addCommand = new QUndoCommand();
+    addCommand->setText(i18n("Insert clip"));
+    adjustTimelineClips(OVERWRITEEDIT, NULL, info, addCommand);
+    new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), info, EffectsList(), true, false, true, false, addCommand);
+    m_commandStack->push(addCommand);
 }
index e878e5959c1d50f1cf4e6cf16c1194de06ba4423..f85108628bab54ac569a2f013f1bf6a7a79429ac 100644 (file)
@@ -267,7 +267,7 @@ private:
     /** Selects all items in the scene rect, and sets ok to false if a group going over several tracks is found in it */
     QList<QGraphicsItem *> checkForGroups(const QRectF &rect, bool *ok);
     /** Adjust clips under another one when working in overwrite mode */
-    void adjustTimelineClips(EDITMODE mode, ClipItem *item, QUndoCommand *command);
+    void adjustTimelineClips(EDITMODE mode, ClipItem *item, ItemInfo posinfo, QUndoCommand *command);
     void adjustTimelineTransitions(EDITMODE mode, Transition *item, QUndoCommand *command);
 
 private slots:
index ebcf106c7f825e5b850922819ce06472d899d229..5dd0474d508dc9c00aba0fc95066571fb9fbaf87 100644 (file)
@@ -1995,6 +1995,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(trackView, SIGNAL(setZoom(int)), this, SLOT(slotSetZoom(int)));
     connect(trackView->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
 
+    //TODO: add QPoint for zone
     connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, const int)));
 
 
index d0980e307b9935a9b534ff2095cea175de21d3e3..8fc3252de1e6f1ce9e91c81bbaf0d4b535854d5e 100644 (file)
@@ -116,16 +116,16 @@ void ProjectListView::contextMenuEvent(QContextMenuEvent * event)
 void ProjectListView::mouseDoubleClickEvent(QMouseEvent * event)
 {
     QTreeWidgetItem *it = itemAt(event->pos());
-    if (!it) return;
+    if (!it) {
+       emit addClip();
+       return;
+    }
     ProjectItem *item;
     if (it->type() == QTreeWidgetItem::UserType + 1) {
         // subitem
         item = static_cast <ProjectItem *>(it->parent());
     } else item = static_cast <ProjectItem *>(it);
-    if (!item) {
-        emit addClip();
-        return;
-    }
+
     if (!(item->flags() & Qt::ItemIsDragEnabled)) return;
     if (item->isGroup()) {
         if ((columnAt(event->pos().x()) == 1)) QTreeWidget::mouseDoubleClickEvent(event);