]> git.sesse.net Git - kdenlive/blobdiff - src/customtrackview.cpp
Fix crash on clip deletion, fix issues with placeholder clips
[kdenlive] / src / customtrackview.cpp
index c1d4b07415f731c502ab481006e6e8b8f6b3caa6..680c7fc9cc32978c0c757461bfd64cb96f48edbc 100644 (file)
@@ -171,6 +171,7 @@ CustomTrackView::CustomTrackView(KdenliveDoc *doc, CustomTrackScene* projectscen
 CustomTrackView::~CustomTrackView()
 {
     qDeleteAll(m_guides);
+    m_guides.clear();
     m_waitingThumbs.clear();
 }
 
@@ -670,7 +671,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
 
     // special cases (middle click button or ctrl / shift click
     if (event->button() == Qt::MidButton) {
-        m_document->renderer()->switchPlay();
+        emit playMonitor();
         m_blockRefresh = false;
         m_operationMode = NONE;
         return;
@@ -1410,7 +1411,7 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint pos)
             //item->setZValue(10);
             item->setFlag(QGraphicsItem::ItemIsMovable, false);
             m_selectionGroup->addToGroup(item);
-            m_waitingThumbs.append(item);
+            if (!clip->isPlaceHolder()) m_waitingThumbs.append(item);
         }
 
         updateSnapPoints(NULL, offsetList);
@@ -1750,7 +1751,8 @@ ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, boo
         ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track);
         if (!item || cutTime >= item->endPos() || cutTime <= item->startPos()) {
             emit displayMessage(i18n("Cannot find clip to cut"), ErrorMessage);
-            kDebug() << "/////////  ERROR CUTTING CLIP : (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), INFO: (" << info.startPos.frames(25) << "-" << info.endPos.frames(25) << ")" << ", CUT: " << cutTime.frames(25);
+            if (item) kDebug() << "/////////  ERROR CUTTING CLIP : (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), INFO: (" << info.startPos.frames(25) << "-" << info.endPos.frames(25) << ")" << ", CUT: " << cutTime.frames(25);
+            else kDebug() << "/// ERROR NO CLIP at: " << info.startPos.frames(m_document->fps()) << ", track: " << info.track;
             m_blockRefresh = false;
             return NULL;
         }
@@ -2048,6 +2050,7 @@ void CustomTrackView::dropEvent(QDropEvent * event)
         bool hasVideoClip = false;
         QUndoCommand *addCommand = new QUndoCommand();
         addCommand->setText(i18n("Add timeline clip"));
+        QList <ClipItem *> brokenClips;
 
         for (int i = 0; i < items.count(); i++) {
             ClipItem *item = static_cast <ClipItem *>(items.at(i));
@@ -2071,6 +2074,8 @@ void CustomTrackView::dropEvent(QDropEvent * event)
             clipInfo.track = m_document->tracksCount() - item->track();
             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);
+                brokenClips.append(item);
+                continue;
             }
             adjustTimelineClips(m_scene->editMode(), item, ItemInfo(), addCommand);
 
@@ -2083,7 +2088,10 @@ void CustomTrackView::dropEvent(QDropEvent * event)
             }
             item->setSelected(true);
         }
-        m_commandStack->push(addCommand);
+        qDeleteAll(brokenClips);
+        brokenClips.clear();
+        if (addCommand->childCount() > 0) m_commandStack->push(addCommand);
+        else delete addCommand;
         setDocumentModified();
 
         /*
@@ -2151,7 +2159,7 @@ void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, ItemInf
                         new ResizeClipCommand(this, clip->info(), newclipInfo, false, false, command);
                         clip->resizeEnd(info.startPos.frames(m_document->fps()));
                     }
-                } else if (clip->endPos() < info.endPos) {
+                } else if (clip->endPos() <= info.endPos) {
                     new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), clip->info(), clip->effectList(), false, false, false, true, command);
                     scene()->removeItem(clip);
                     delete clip;
@@ -2269,7 +2277,7 @@ int CustomTrackView::duration() const
 void CustomTrackView::addTrack(TrackInfo type, int ix)
 {
     if (ix == -1 || ix == m_document->tracksCount()) {
-        m_document->insertTrack(ix, type);
+        m_document->insertTrack(0, type);
         m_document->renderer()->mltInsertTrack(1, type.type == VIDEOTRACK);
     } else {
         m_document->insertTrack(m_document->tracksCount() - ix, type);
@@ -2305,8 +2313,8 @@ void CustomTrackView::addTrack(TrackInfo type, int ix)
             ItemInfo clipinfo = item->info();
             if (item->type() == AVWIDGET) {
                 ClipItem *clip = static_cast <ClipItem *>(item);
-               // slowmotion clips are not track dependant, so no need to update them
-               if (clip->speed() != 1.0) continue;
+                // slowmotion clips are not track dependant, so no need to update them
+                if (clip->speed() != 1.0) continue;
                 // We add a move clip command so that we get the correct producer for new track number
                 if (clip->clipType() == AV || clip->clipType() == AUDIO) {
                     Mlt::Producer *prod;
@@ -3662,7 +3670,7 @@ void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo i
     }
     setDocumentModified();
     if (refresh) m_document->renderer()->doRefresh();
-    m_waitingThumbs.append(item);
+    if (!baseclip->isPlaceHolder()) m_waitingThumbs.append(item);
     m_thumbsTimer.start();
 }
 
@@ -4907,6 +4915,7 @@ void CustomTrackView::setOutPoint()
 
 void CustomTrackView::slotUpdateAllThumbs()
 {
+    if (!isEnabled()) return;
     QList<QGraphicsItem *> itemList = items();
     //if (itemList.isEmpty()) return;
     ClipItem *item;