]> git.sesse.net Git - kdenlive/blobdiff - src/customtrackview.cpp
Fix crash when opening invalid file from command line: http://kdenlive.org/mantis...
[kdenlive] / src / customtrackview.cpp
index 15abfdebaa962de09f0eb814b0e2e68ddef4871b..8b1b1edc18ba9ee3e9398d0bf423ce40798327ca 100644 (file)
@@ -324,12 +324,9 @@ bool CustomTrackView::checkTrackHeight()
         }
     }
     double newHeight = m_tracksHeight * m_document->tracksCount() * matrix().m22();
-    m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), newHeight - 1);
-
+    m_cursorLine->setLine(0, 0, 0, newHeight - 1);
     for (int i = 0; i < m_guides.count(); i++) {
-        QLineF l = m_guides.at(i)->line();
-        l.setP2(QPointF(l.x2(), newHeight));
-        m_guides.at(i)->setLine(l);
+        m_guides.at(i)->setLine(0, 0, 0, newHeight - 1);
     }
 
     setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
@@ -3076,12 +3073,10 @@ void CustomTrackView::addTrack(TrackInfo type, int ix)
 
     int maxHeight = m_tracksHeight * m_document->tracksCount() * matrix().m22();
     for (int i = 0; i < m_guides.count(); i++) {
-        QLineF l = m_guides.at(i)->line();
-        l.setP2(QPointF(l.x2(), maxHeight));
-        m_guides.at(i)->setLine(l);
+        m_guides.at(i)->setLine(0, 0, 0, maxHeight - 1);
     }
 
-    m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), maxHeight - 1);
+    m_cursorLine->setLine(0, 0, 0, maxHeight - 1);
     setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
     viewport()->update();
     //QTimer::singleShot(500, this, SIGNAL(trackHeightChanged()));
@@ -3092,6 +3087,10 @@ void CustomTrackView::addTrack(TrackInfo type, int ix)
 
 void CustomTrackView::removeTrack(int ix)
 {
+    // Clear effect stack
+    clearSelection();
+    emit transitionItemSelected(NULL);
+
     // Delete track in MLT playlist
     m_document->renderer()->mltDeleteTrack(m_document->tracksCount() - ix);
     m_document->deleteTrack(m_document->tracksCount() - ix - 1);
@@ -3100,12 +3099,10 @@ void CustomTrackView::removeTrack(int ix)
     QRectF r(0, startY, sceneRect().width(), sceneRect().height() - startY);
     QList<QGraphicsItem *> selection = m_scene->items(r);
 
-    resetSelectionGroup();
-
     m_selectionGroup = new AbstractGroupItem(m_document->fps());
     scene()->addItem(m_selectionGroup);
     for (int i = 0; i < selection.count(); i++) {
-        if ((!selection.at(i)->parentItem()) && (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET || selection.at(i)->type() == GROUPWIDGET)) {
+        if ((selection.at(i) && !selection.at(i)->parentItem() && selection.at(i)->isEnabled()) && (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET || selection.at(i)->type() == GROUPWIDGET)) {
             m_selectionGroup->addItem(selection.at(i));
         }
     }
@@ -3149,11 +3146,9 @@ void CustomTrackView::removeTrack(int ix)
 
     int maxHeight = m_tracksHeight * m_document->tracksCount() * matrix().m22();
     for (int i = 0; i < m_guides.count(); i++) {
-        QLineF l = m_guides.at(i)->line();
-        l.setP2(QPointF(l.x2(), maxHeight));
-        m_guides.at(i)->setLine(l);
+        m_guides.at(i)->setLine(0, 0, 0, maxHeight - 1);
     }
-    m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), maxHeight - 1);
+    m_cursorLine->setLine(0, 0, 0, maxHeight - 1);
     setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
 
     m_selectedTrack = qMin(m_selectedTrack, m_document->tracksCount() - 1);
@@ -3656,6 +3651,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
         }
         m_dragGuide = NULL;
         m_dragItem = NULL;
+       QGraphicsView::mouseReleaseEvent(event);
         return;
     } else if (m_operationMode == SPACER && m_selectionGroup) {
         int track;
@@ -5188,10 +5184,21 @@ void CustomTrackView::prepareResizeClipEnd(AbstractClipItem* item, ItemInfo oldI
         } else {
             // Check transition keyframes
             QDomElement old = transition->toXML();
-            if (transition->updateKeyframes()) {
+            if (transition->updateKeyframes(oldInfo.cropDuration.frames(m_document->fps()) - 1)) {
                 QDomElement xml = transition->toXML();
                 m_document->renderer()->mltUpdateTransition(xml.attribute("tag"), xml.attribute("tag"), xml.attribute("transition_btrack").toInt(), m_document->tracksCount() - xml.attribute("transition_atrack").toInt(), transition->startPos(), transition->endPos(), xml);
                 new EditTransitionCommand(this, transition->track(), transition->startPos(), old, xml, false, command);
+               ItemInfo info = transition->info();
+               QPoint p;
+               ClipItem *transitionClip = getClipItemAt(info.startPos, info.track);
+               if (transitionClip && transitionClip->baseClip()) {
+                   QString size = transitionClip->baseClip()->getProperty("frame_size");
+                   double factor = transitionClip->baseClip()->getProperty("aspect_ratio").toDouble();
+                   if (factor == 0) factor = 1.0;
+                   p.setX((int)(size.section('x', 0, 0).toInt() * factor + 0.5));
+                   p.setY(size.section('x', 1, 1).toInt());
+               }
+               emit transitionItemSelected(transition, getPreviousVideoTrack(info.track), p, true);
             }
             new MoveTransitionCommand(this, oldInfo, info, false, command);
         }
@@ -5832,11 +5839,9 @@ void CustomTrackView::setScale(double scaleFactor, double verticalScale)
     setMatrix(newmatrix);
     if (adjust) {
         double newHeight = m_tracksHeight * m_document->tracksCount() * matrix().m22();
-        m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), newHeight - 1);
+       m_cursorLine->setLine(0, 0, 0, newHeight - 1);
         for (int i = 0; i < m_guides.count(); i++) {
-            QLineF l = m_guides.at(i)->line();
-            l.setP2(QPointF(l.x2(), newHeight));
-            m_guides.at(i)->setLine(l);
+            m_guides.at(i)->setLine(0, 0, 0, newHeight - 1);
         }
         setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
     }
@@ -6505,7 +6510,11 @@ void CustomTrackView::slotConfigTracks(int ix)
 void CustomTrackView::deleteTimelineTrack(int ix, TrackInfo trackinfo)
 {
     if (m_document->tracksCount() < 2) return;
-    double startY = ix * m_tracksHeight + 1 + m_tracksHeight / 2;
+    // Clear effect stack
+    clearSelection();
+    emit transitionItemSelected(NULL);
+    
+    double startY = ix * m_tracksHeight + 1 + m_tracksHeight / 2;    
     QRectF r(0, startY, sceneRect().width(), m_tracksHeight / 2 - 1);
     QList<QGraphicsItem *> selection = m_scene->items(r);
     QUndoCommand *deleteTrack = new QUndoCommand();
@@ -7347,6 +7356,7 @@ void CustomTrackView::insertZoneOverwrite(QStringList data, int in)
 
 void CustomTrackView::clearSelection(bool emitInfo)
 {
+    if (m_dragItem) m_dragItem->setSelected(false);
     resetSelectionGroup();
     scene()->clearSelection();
     m_dragItem = NULL;