]> git.sesse.net Git - kdenlive/blobdiff - src/customtrackview.cpp
Fix groups sometimes allowed on locked tracks: http://kdenlive.org/mantis/view.php...
[kdenlive] / src / customtrackview.cpp
index 1ce52f5a51ad9b2bbbf8c4ec2ad8c4bc356223ee..dc0a76a10fb0644723a11cfcde7f53ad3a45f97a 100644 (file)
@@ -846,7 +846,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
                m_selectionGroup->setProperty("y_absolute", yOffset);
                m_selectionGroup->setProperty("locked_tracks", lockedTracks);
            }
-            if (dragGroup) {
+           if (m_dragItem->parentItem() && m_dragItem->parentItem()->type() == GROUPWIDGET && m_dragItem->parentItem() != m_selectionGroup) {
                 dragGroup = static_cast <AbstractGroupItem *>(m_dragItem->parentItem());
                dragGroup->setProperty("y_absolute", yOffset);
                dragGroup->setProperty("locked_tracks", lockedTracks);
@@ -908,6 +908,10 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
         }
 
         m_operationMode = NONE;
+       if (dragGroup == NULL) {
+           if (m_dragItem && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup)
+               dragGroup = static_cast<AbstractGroupItem*> (m_dragItem->parentItem());
+       }
         displayContextMenu(event->globalPos(), m_dragItem, dragGroup);
         m_menuPosition = m_clickEvent;
     }
@@ -1290,15 +1294,21 @@ void CustomTrackView::groupSelectedItems(QList <QGraphicsItem *> selection, bool
     for (int i = 0; i < selection.count(); i++) {
        if (selectNewGroup) selection.at(i)->setSelected(true);
        if (selection.at(i)->type() == GROUPWIDGET) {
-           groupsList.insert(static_cast<AbstractGroupItem*> (selection.at(i)));
+           AbstractGroupItem *it = static_cast <AbstractGroupItem *> (selection.at(i));
+           if (!it || it->isItemLocked()) continue;
+           groupsList.insert(it);
        }
     }
     for (int i = 0; i < selection.count(); i++) {
        if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET) {
            if (selection.at(i)->parentItem() && selection.at(i)->parentItem()->type() == GROUPWIDGET) {
-               groupsList.insert(static_cast <QGraphicsItemGroup *> (selection.at(i)->parentItem()));
+               AbstractGroupItem *it = static_cast <AbstractGroupItem *> (selection.at(i)->parentItem());
+               if (!it || it->isItemLocked()) continue;
+               groupsList.insert(it);
            }
            else {
+               AbstractClipItem *it = static_cast<AbstractClipItem *> (selection.at(i));
+               if (!it || it->isItemLocked()) continue;
                itemsList.insert(selection.at(i));
            }
        }
@@ -1616,10 +1626,16 @@ void CustomTrackView::insertClipCut(DocClipBase *clip, int in, int out)
 
 bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos)
 {
-    if (data->hasFormat("kdenlive/clip")) {
-        m_clipDrag = true;
-        m_scene->clearSelection();
-        resetSelectionGroup(false);
+    QPointF framePos = mapToScene(pos);
+    int track = framePos.y() / KdenliveSettings::trackheight();
+    m_scene->clearSelection();
+    m_dragItem = NULL;
+    resetSelectionGroup(false);
+    m_clipDrag = data->hasFormat("kdenlive/clip") || data->hasFormat("kdenlive/producerslist");
+    // This is not a clip drag, maybe effect or other...
+    if (!m_clipDrag) return false;
+    if (track < 0 || track > m_document->tracksCount() - 1 || m_document->trackInfoAt(m_document->tracksCount() - track - 1).isLocked) return true;
+    if (data->hasFormat("kdenlive/clip")) {    
         QStringList list = QString(data->data("kdenlive/clip")).split(';');
         DocClipBase *clip = m_document->getBaseClip(list.at(0));
         if (clip == NULL) {
@@ -1630,7 +1646,6 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos)
             emit displayMessage(i18n("Clip not ready"), ErrorMessage);
             return false;
         }
-        QPointF framePos = mapToScene(pos);
         ItemInfo info;
         info.startPos = GenTime();
         info.cropStart = GenTime(list.at(1).toInt(), m_document->fps());
@@ -1655,19 +1670,19 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos)
         QList <GenTime> offsetList;
         offsetList.append(info.endPos);
         updateSnapPoints(NULL, offsetList);
+       QStringList lockedTracks;
+       for (int i = 0; i < m_document->tracksCount(); i++) {
+           if (m_document->trackInfoAt(i).isLocked) lockedTracks << QString::number(m_document->tracksCount() - i - 1);
+       }
+       m_selectionGroup->setProperty("locked_tracks", lockedTracks);
         m_selectionGroup->setPos(framePos);
         scene()->addItem(m_selectionGroup);
         m_selectionGroup->setSelected(true);
-        return true;
     } else if (data->hasFormat("kdenlive/producerslist")) {
-        m_clipDrag = true;
         QStringList ids = QString(data->data("kdenlive/producerslist")).split(';');
-        m_scene->clearSelection();
-        resetSelectionGroup(false);
 
         QList <GenTime> offsetList;
         QList <ItemInfo> infoList;
-        QPointF framePos = mapToScene(pos);
         GenTime start = GenTime((int)(framePos.x() + 0.5), m_document->fps());
         int track = (int)(framePos.y() / m_tracksHeight);
         framePos.setX((int)(framePos.x() + 0.5));
@@ -1734,23 +1749,25 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint &pos)
         }
 
         updateSnapPoints(NULL, offsetList);
+       QStringList lockedTracks;
+       for (int i = 0; i < m_document->tracksCount(); i++) {
+           if (m_document->trackInfoAt(i).isLocked) lockedTracks << QString::number(m_document->tracksCount() - i - 1);
+       }   
+           
         if (m_selectionGroup) {
+           m_selectionGroup->setProperty("locked_tracks", lockedTracks);
            m_selectionGroup->setPos(framePos);
            scene()->addItem(m_selectionGroup);
        }
        else if (m_dragItem) {
+           m_dragItem->setProperty("locked_tracks", lockedTracks);
            m_dragItem->setPos(framePos);
            scene()->addItem(m_dragItem);
        }
         //m_selectionGroup->setZValue(10);
         m_thumbsTimer.start();
-        return true;
-
-    } else {
-        // the drag is not a clip (may be effect, ...)
-        m_clipDrag = false;
-        return false;
     }
+    return true;
 }