]> git.sesse.net Git - kdenlive/blobdiff - src/customtrackview.cpp
Fix clip effect stack not updated when dropping effect in a group, nicer timeline...
[kdenlive] / src / customtrackview.cpp
index 9ed99e8db4c04ee89a45a3fee2984346a6ed7e38..e97c46ad1183331f5dfad70592709d921bc0f330 100644 (file)
@@ -980,27 +980,34 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
     else if (dragGroup && dragGroup->isSelected())
         itemSelected = true;
 
-    if (event->modifiers() == Qt::ControlModifier || itemSelected == false) {
+    if ((event->modifiers() == Qt::ControlModifier) || itemSelected == false) {
         if (event->modifiers() != Qt::ControlModifier) {
             resetSelectionGroup(false);
             m_scene->clearSelection();
             // A refresh seems necessary otherwise in zoomed mode, some clips disappear
             viewport()->update();
-        } else resetSelectionGroup();
+        } else {
+           resetSelectionGroup();
+       }
         dragGroup = NULL;
         if (m_dragItem->parentItem() && m_dragItem->parentItem()->type() == GROUPWIDGET) {
             dragGroup = static_cast <AbstractGroupItem *>(m_dragItem->parentItem());
         }
         bool selected = !m_dragItem->isSelected();
-        if (dragGroup)
+        /*if (dragGroup)
             dragGroup->setSelected(selected);
-        else
+        else*/
             m_dragItem->setSelected(selected);
-
+       if (selected == false) {
+           m_dragItem = NULL;
+       }
         groupSelectedItems();
-        ClipItem *clip = static_cast <ClipItem *>(m_dragItem);
-        updateClipTypeActions(dragGroup == NULL ? clip : NULL);
-        m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
+       if (m_dragItem) { 
+           ClipItem *clip = static_cast <ClipItem *>(m_dragItem);
+           updateClipTypeActions(dragGroup == NULL ? clip : NULL);
+           m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
+       }
+       else updateClipTypeActions(NULL);
     }
 
     if (collisionClip != NULL || m_dragItem == NULL) {
@@ -1013,9 +1020,11 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
     }
 
     // If clicked item is selected, allow move
-    if (event->modifiers() != Qt::ControlModifier && m_operationMode == NONE) QGraphicsView::mousePressEvent(event);
+    //if (!(event->modifiers() | Qt::ControlModifier) && m_operationMode == NONE)
+    QGraphicsView::mousePressEvent(event);
 
-    m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps())), (int)(event->pos().y() - m_dragItem->pos().y()));
+    if (m_dragItem) {
+       m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps())), (int)(event->pos().y() - m_dragItem->pos().y()));
     if (m_selectionGroup && m_dragItem->parentItem() == m_selectionGroup) {
         // all other modes break the selection, so the user probably wants to move it
         m_operationMode = MOVE;
@@ -1026,6 +1035,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
        }
         else m_operationMode = m_dragItem->operationMode(mapToScene(event->pos()));
     }
+    } else m_operationMode = NONE;
     m_controlModifier = (event->modifiers() == Qt::ControlModifier);
 
     // Update snap points
@@ -1489,7 +1499,15 @@ void CustomTrackView::insertClipCut(DocClipBase *clip, int in, int out)
     pasteInfo.startPos = GenTime(m_cursorPos, m_document->fps());
     pasteInfo.endPos = pasteInfo.startPos + info.endPos;
     pasteInfo.track = selectedTrack();
-    if (!canBePastedTo(pasteInfo, AVWIDGET)) {
+    bool ok = canBePastedTo(pasteInfo, AVWIDGET);
+    if (!ok) {
+       // Cannot be inserted at cursor pos, insert at end of track
+       int duration = m_document->renderer()->mltTrackDuration(m_document->tracksCount() - pasteInfo.track) + 1;
+       pasteInfo.startPos = GenTime(duration, m_document->fps());
+       pasteInfo.endPos = pasteInfo.startPos + info.endPos;
+       ok = canBePastedTo(pasteInfo, AVWIDGET);
+    }
+    if (!ok) {
         emit displayMessage(i18n("Cannot insert clip in timeline"), ErrorMessage);
         return;
     }
@@ -1566,7 +1584,8 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos)
 
         // Check if clips can be inserted at that position
         for (int i = 0; i < ids.size(); ++i) {
-            DocClipBase *clip = m_document->getBaseClip(ids.at(i));
+           QString clipData = ids.at(i);
+            DocClipBase *clip = m_document->getBaseClip(clipData.section('/', 0, 0));
             if (clip == NULL) {
                 kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << ids.at(i);
                 return false;
@@ -1577,11 +1596,20 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos)
             }
             ItemInfo info;
             info.startPos = start;
-            info.cropDuration = clip->duration();
-            info.endPos = info.startPos + info.cropDuration;
+           if (clipData.contains('/')) {
+               // this is a clip zone, set in / out
+               int in = clipData.section('/', 1, 1).toInt();
+               int out = clipData.section('/', 2, 2).toInt();
+               info.cropStart = GenTime(in, m_document->fps());
+               info.cropDuration = GenTime(out - in, m_document->fps());
+           }
+            else {
+               info.cropDuration = clip->duration();
+           }
+           info.endPos = info.startPos + info.cropDuration;
             info.track = track;
             infoList.append(info);
-            start += clip->duration();
+            start += info.cropDuration;
         }
         if (!canBePastedTo(infoList, AVWIDGET)) {
             return true;
@@ -1589,11 +1617,21 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos)
         m_selectionGroup = new AbstractGroupItem(m_document->fps());
         start = GenTime();
         for (int i = 0; i < ids.size(); ++i) {
-            DocClipBase *clip = m_document->getBaseClip(ids.at(i));
+            QString clipData = ids.at(i);
+            DocClipBase *clip = m_document->getBaseClip(clipData.section('/', 0, 0));
             ItemInfo info;
             info.startPos = start;
-            info.cropDuration = clip->duration();
-            info.endPos = info.startPos + info.cropDuration;
+           if (clipData.contains('/')) {
+               // this is a clip zone, set in / out
+               int in = clipData.section('/', 1, 1).toInt();
+               int out = clipData.section('/', 2, 2).toInt();
+               info.cropStart = GenTime(in, m_document->fps());
+               info.cropDuration = GenTime(out - in, m_document->fps());
+           }
+            else {
+               info.cropDuration = clip->duration();
+           }
+           info.endPos = info.startPos + info.cropDuration;
             info.track = 0;
             start += info.cropDuration;
             offsetList.append(start);
@@ -1859,12 +1897,23 @@ void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track)
                        clearSelection(false);
                        clip->setSelected(true);
                        m_dragItem = clip;
-                       emit clipItemSelected(clip);
                    }
+                   emit clipItemSelected(clip);
                    break;
                }
            }
        }
+       else {
+           for (int i = 0; i < itemList.count(); i++) {
+               if (itemList.at(i)->type() == AVWIDGET) {
+                   ClipItem *clip = static_cast<ClipItem *>(itemList.at(i));
+                   if (clip->isMainSelectedClip()) {
+                       emit clipItemSelected(clip);
+                       break;
+                   }
+               }
+           }
+       }
     } else delete effectCommand;
 }
 
@@ -3410,7 +3459,7 @@ void CustomTrackView::checkScrolling()
 void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
 {
     if (m_moveOpMode == SEEK) m_moveOpMode = NONE;
-    QGraphicsView::mouseReleaseEvent(event);
+    if (!m_controlModifier) QGraphicsView::mouseReleaseEvent(event);
     setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);
 #if QT_VERSION >= 0x040600
     if (m_dragItem) m_dragItem->setGraphicsEffect(NULL);
@@ -5527,7 +5576,9 @@ void CustomTrackView::drawBackground(QPainter * painter, const QRectF &rect)
 {
     painter->setClipRect(rect);
     QPen pen1 = painter->pen();
-    pen1.setColor(palette().dark().color());
+    QColor lineColor = palette().dark().color();
+    lineColor.setAlpha(100);
+    pen1.setColor(lineColor);
     painter->setPen(pen1);
     double min = rect.left();
     double max = rect.right();
@@ -5901,7 +5952,8 @@ ClipItem *CustomTrackView::getClipUnderCursor() const
     QList<QGraphicsItem *> collisions = scene()->items(rect, Qt::IntersectsItemBoundingRect);
     for (int i = 0; i < collisions.count(); i++) {
         if (collisions.at(i)->type() == AVWIDGET) {
-            return static_cast < ClipItem *>(collisions.at(i));
+           ClipItem *clip = static_cast < ClipItem *>(collisions.at(i));
+           if (!clip->isItemLocked()) return clip;
         }
     }
     return NULL;