]> git.sesse.net Git - kdenlive/commitdiff
Make sure we cannot move a clip to a locked track
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Fri, 28 Dec 2012 02:13:27 +0000 (03:13 +0100)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Fri, 28 Dec 2012 02:13:27 +0000 (03:13 +0100)
src/abstractgroupitem.cpp
src/clipitem.cpp
src/customtrackview.cpp
src/transition.cpp

index 4ea3e8783134c6a489897ce0c2b0613561618949..e9a30c8555013871e11e89eb8e3b10896a02bc40 100644 (file)
@@ -173,17 +173,19 @@ QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant
         xpos = qMax(xpos, 0);
         //kDebug()<<"GRP XPOS:"<<xpos<<", START:"<<start.x()<<",NEW:"<<newPos.x()<<"; SCENE:"<<scenePos().x()<<",POS:"<<pos().x();
         newPos.setX((int)(pos().x() + xpos - (int) start.x()));
-
-       int yOffset = property("y_absolute").toInt() + newPos.y();
-        int proposedTrack = yOffset / trackHeight;
-
+       QStringList lockedTracks = property("locked_tracks").toStringList();
+        int proposedTrack = (property("y_absolute").toInt() + newPos.y()) / trackHeight;
         // Check if top item is a clip or a transition
         int offset = 0;
         int topTrack = -1;
+       QList<int> groupTracks;
         QList<QGraphicsItem *> children = childItems();
         for (int i = 0; i < children.count(); i++) {
             int currentTrack = 0;
-           if (children.at(i)->type() == AVWIDGET || children.at(i)->type() == TRANSITIONWIDGET) currentTrack = static_cast <AbstractClipItem*> (children.at(i))->track();
+           if (children.at(i)->type() == AVWIDGET || children.at(i)->type() == TRANSITIONWIDGET) {
+               currentTrack = static_cast <AbstractClipItem*> (children.at(i))->track();
+               if (!groupTracks.contains(currentTrack)) groupTracks.append(currentTrack);
+           }
            else if (children.at(i)->type() == GROUPWIDGET) currentTrack = static_cast <AbstractGroupItem*> (children.at(i))->track();
            else continue;
             if (children.at(i)->type() == AVWIDGET) {
@@ -201,8 +203,9 @@ QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant
                 bool clipGroup = false;
                 for (int j = 0; j < subchildren.count(); j++) {
                     if (subchildren.at(j)->type() == AVWIDGET) {
+                       int subTrack = static_cast <AbstractClipItem*> (subchildren.at(j))->track();
+                       if (!groupTracks.contains(subTrack)) groupTracks.append(subTrack);
                         clipGroup = true;
-                        break;
                     }
                 }
                 if (clipGroup) {
@@ -218,6 +221,24 @@ QVariant AbstractGroupItem::itemChange(GraphicsItemChange change, const QVariant
                 }
             }
         }
+        // Check no clip in the group goes outside of existing tracks
+        int maximumTrack = projectScene()->tracksCount() - 1;
+       int groupHeight = 0;
+       for (int i = 0; i < groupTracks.count(); i++) {
+           int offset = groupTracks.at(i) - topTrack;
+           if (offset > groupHeight) groupHeight = offset; 
+       }
+       maximumTrack -= groupHeight;
+        proposedTrack = qMin(proposedTrack, maximumTrack);
+        proposedTrack = qMax(proposedTrack, 0);
+       int groupOffset = proposedTrack - topTrack;
+       if (!lockedTracks.isEmpty()) {
+           for (int i = 0; i < groupTracks.count(); i++) {
+               if (lockedTracks.contains(QString::number(groupTracks.at(i) + groupOffset))) {
+                   return pos();
+               }
+           }
+       }
         newPos.setY((int)((proposedTrack) * trackHeight) + offset);
         //if (newPos == start) return start;
 
index 47a0c73e14ed97de696cd819fa2f1f35142d6c67..51ae67a9e5c297007df896a6ed5afbf8816530ff 100644 (file)
@@ -893,6 +893,11 @@ void ClipItem::paint(QPainter *painter,
                 painter->drawPixmap(clipStart + startCache - cropLeft, mappedRect.y(),  m_audioThumbCachePic.value(startCache));
         }
     }
+    
+    if (m_isMainSelectedClip) {
+       framePen.setColor(Qt::red);
+       textBgColor = Qt::red;
+    }
 
     // only paint details if clip is big enough
     if (mapped.width() > 20) {
@@ -919,10 +924,6 @@ void ClipItem::paint(QPainter *painter,
         // Draw clip name
         const QRectF txtBounding2 = painter->boundingRect(mapped, Qt::AlignRight | Qt::AlignTop, m_clipName + ' ').adjusted(0, -1, 0, -1);
        painter->setPen(Qt::NoPen);
-       if (m_isMainSelectedClip) {
-           framePen.setColor(Qt::red);
-           textBgColor = Qt::red;
-       }
         painter->fillRect(txtBounding2.adjusted(-3, 0, 0, 0), textBgColor);
         painter->setBrush(QBrush(Qt::NoBrush));
        painter->setPen(textColor);
@@ -1343,6 +1344,11 @@ QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value)
         int newTrack = yOffset / KdenliveSettings::trackheight();
         newTrack = qMin(newTrack, projectScene()->tracksCount() - 1);
         newTrack = qMax(newTrack, 0);
+       QStringList lockedTracks = property("locked_tracks").toStringList();
+       if (lockedTracks.contains(QString::number(newTrack))) {
+           // Trying to move to a locked track
+           return pos();
+       }
         newPos.setY((int)(newTrack  * KdenliveSettings::trackheight() + 1));
         // Only one clip is moving
         QRectF sceneShape = rect();
index 50a617b6ddc78280a7a745bd7974c3751136df46..4fad4c8e440cac7d570d9a0ab48daccdc4417b95 100644 (file)
@@ -831,13 +831,21 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
                 m_dragItem = collisionClip;
            }
             found = true;
-           
+           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_dragItem->setProperty("y_absolute", mapToScene(m_clickEvent).y() - m_dragItem->scenePos().y());
+           m_dragItem->setProperty("locked_tracks", lockedTracks);
             m_dragItemInfo = m_dragItem->info();
-           if (m_selectionGroup) m_selectionGroup->setProperty("y_absolute", mapToScene(m_clickEvent).y() - m_dragItem->scenePos().y());
+           if (m_selectionGroup) {
+               m_selectionGroup->setProperty("y_absolute", mapToScene(m_clickEvent).y() - m_dragItem->scenePos().y());
+               m_selectionGroup->setProperty("locked_tracks", lockedTracks);
+           }
             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", mapToScene(m_clickEvent).y() - m_dragItem->scenePos().y());
+               dragGroup->setProperty("locked_tracks", lockedTracks);
             }
             break;
         }
index 799fe5d7ae63691a02c4bf55b9559130c68cd1af..7fb3ca6b903c11a1162ddcbeac760cb95b9421fd 100644 (file)
@@ -224,6 +224,11 @@ QVariant Transition::itemChange(GraphicsItemChange change, const QVariant &value
         int newTrack = newPos.y() / KdenliveSettings::trackheight();
         newTrack = qMin(newTrack, projectScene()->tracksCount() - 1);
         newTrack = qMax(newTrack, 0);
+       QStringList lockedTracks = property("locked_tracks").toStringList();
+       if (lockedTracks.contains(QString::number(newTrack))) {
+           // Trying to move to a locked track
+           return pos();
+       }
         newPos.setY((int)(newTrack * KdenliveSettings::trackheight() + itemOffset() + 1));
         // Only one clip is moving
         QRectF sceneShape = rect();