]> git.sesse.net Git - kdenlive/blobdiff - src/customtrackview.cpp
Spacer should not move locked tracks
[kdenlive] / src / customtrackview.cpp
index a88a2e87a59da7268546616b1acb2b3ac6a2bb45..8234f6ce2116daca6eaa87c01b340fc6f9d99245 100644 (file)
 #include <QInputDialog>
 #include <KMessageBox>
 
+#if QT_VERSION >= 0x040600
+#include <QGraphicsDropShadowEffect>
+#endif
+
 bool sortGuidesList(const Guide *g1 , const Guide *g2)
 {
     return (*g1).position() < (*g2).position();
@@ -752,7 +756,14 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
         if (m_dragItem) emit clipItemSelected(NULL);
         m_dragItem = NULL;
     }
-
+#if QT_VERSION >= 0x040600
+    // Add shadow to dragged item, currently disabled because of painting artifacts
+    //TODO: re-enable when fixed
+    /*QGraphicsDropShadowEffect *eff = new QGraphicsDropShadowEffect();
+    eff->setBlurRadius(5);
+    eff->setOffset(3, 3);
+    m_dragItem->setGraphicsEffect(eff);*/
+#endif
     if (m_dragItem && m_dragItem->type() == TRANSITIONWIDGET) {
         // update transition menu action
         m_autoTransition->setChecked(static_cast<Transition *>(m_dragItem)->isAutomatic());
@@ -805,6 +816,12 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
             if (event->modifiers() == Qt::ControlModifier) {
                 // Ctrl + click, select all items on track after click position
                 int track = (int)(mapToScene(m_clickEvent).y() / m_tracksHeight);
+               if (m_document->trackInfoAt(m_document->tracksCount() - track - 1).isLocked) {
+                    // Cannot use spacer on locked track
+                    emit displayMessage(i18n("Cannot use spacer in a locked track"), ErrorMessage);
+                    return;              
+               }  
+  
                 QRectF rect(mapToScene(m_clickEvent).x(), track * m_tracksHeight + m_tracksHeight / 2, sceneRect().width() - mapToScene(m_clickEvent).x(), m_tracksHeight / 2 - 2);
 
                 bool isOk;
@@ -829,11 +846,13 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
             for (int i = 0; i < selection.count(); i++) {
                 if (selection.at(i)->parentItem() == 0 && (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET)) {
                     AbstractClipItem *item = static_cast<AbstractClipItem *>(selection.at(i));
+                   if (item->isItemLocked()) continue;
                     offsetList.append(item->startPos());
                     offsetList.append(item->endPos());
                     m_selectionGroup->addToGroup(selection.at(i));
                     selection.at(i)->setFlag(QGraphicsItem::ItemIsMovable, false);
                 } else if (selection.at(i)->parentItem() == 0 && selection.at(i)->type() == GROUPWIDGET) {
+                   if (static_cast<AbstractGroupItem *>(selection.at(i))->isItemLocked()) continue;
                     QList<QGraphicsItem *> children = selection.at(i)->childItems();
                     for (int j = 0; j < children.count(); j++) {
                         AbstractClipItem *item = static_cast<AbstractClipItem *>(children.at(j));
@@ -843,6 +862,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
                     m_selectionGroup->addToGroup(selection.at(i));
                     selection.at(i)->setFlag(QGraphicsItem::ItemIsMovable, false);
                 } else if (selection.at(i)->parentItem()) {
+                   if (static_cast<AbstractGroupItem *>(selection.at(i)->parentItem())->isItemLocked()) continue;
                     m_selectionGroup->addToGroup(selection.at(i)->parentItem());
                     selection.at(i)->parentItem()->setFlag(QGraphicsItem::ItemIsMovable, false);
                 }
@@ -1721,7 +1741,8 @@ ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, boo
         newPos.track = info.track;
         newPos.cropDuration = newPos.endPos - newPos.startPos;
 
-
+        bool snap = KdenliveSettings::snaptopoints();
+        KdenliveSettings::setSnaptopoints(false);
         ClipItem *dup = item->clone(newPos);
         // remove unwanted effects (fade in) from 2nd part of cutted clip
         int ix = dup->hasEffect(QString(), "fadein");
@@ -1741,6 +1762,7 @@ ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, boo
         item->baseClip()->addReference();
         m_document->updateClip(item->baseClip()->getId());
         setDocumentModified();
+        KdenliveSettings::setSnaptopoints(snap);
         return dup;
         //kDebug() << "/////////  CUTTING CLIP RESULT: (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), DUP: (" << dup->startPos().frames(25) << "-" << dup->endPos().frames(25) << ")" << ", CUT: " << cutTime.frames(25);
     } else {
@@ -1748,6 +1770,7 @@ ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, boo
 
         ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track);
         ClipItem *dup = getClipItemAt((int) cutTime.frames(m_document->fps()), info.track);
+
         if (!item || !dup || item == dup) {
             emit displayMessage(i18n("Cannot find clip to uncut"), ErrorMessage);
             m_blockRefresh = false;
@@ -1763,6 +1786,8 @@ ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, boo
         kDebug() << "// UNCUTTING CLIPS, INFO (" << info.startPos.frames(25) << "x" << info.endPos.frames(25) << ") , CUT: " << cutTime.frames(25);;*/
         //deleteClip(dup->info());
 
+        bool snap = KdenliveSettings::snaptopoints();
+        KdenliveSettings::setSnaptopoints(false);
 
         if (dup->isSelected()) emit clipItemSelected(NULL);
         dup->baseClip()->removeReference();
@@ -1778,6 +1803,7 @@ ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, boo
             setDocumentModified();
         } else
             emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
+        KdenliveSettings::setSnaptopoints(snap);
         return item;
 
     }
@@ -2018,7 +2044,7 @@ void CustomTrackView::dropEvent(QDropEvent * event)
             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);
             }
-            adjustTimelineClips(m_scene->editMode(), item, addCommand);
+            adjustTimelineClips(m_scene->editMode(), item, ItemInfo(), addCommand);
 
             new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT, false, false, addCommand);
 
@@ -2031,6 +2057,25 @@ void CustomTrackView::dropEvent(QDropEvent * event)
         }
         m_commandStack->push(addCommand);
         setDocumentModified();
+
+        /*
+        // debug info
+        QRectF rect(0, 1 * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), 2);
+        QList<QGraphicsItem *> selection = m_scene->items(rect);
+        QStringList timelineList;
+
+        kDebug()<<"// ITEMS on TRACK: "<<selection.count();
+        for (int i = 0; i < selection.count(); i++) {
+            if (selection.at(i)->type() == AVWIDGET) {
+                ClipItem *clip = static_cast <ClipItem *>(selection.at(i));
+                int start = clip->startPos().frames(m_document->fps());
+                int end = clip->endPos().frames(m_document->fps());
+                timelineList.append(QString::number(start) + "-" + QString::number(end));
+            }
+        }
+        kDebug() << "// COMPARE:\n" << timelineList << "\n-------------------";
+        */
+
         m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
         if (items.count() > 1) groupSelectedItems(true);
         event->setDropAction(Qt::MoveAction);
@@ -2039,24 +2084,27 @@ void CustomTrackView::dropEvent(QDropEvent * event)
     setFocus();
 }
 
-void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, QUndoCommand *command)
+void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, ItemInfo posinfo, QUndoCommand *command)
 {
     if (mode == OVERWRITEEDIT) {
         // if we are in overwrite or push mode, move clips accordingly
         bool snap = KdenliveSettings::snaptopoints();
         KdenliveSettings::setSnaptopoints(false);
-        ItemInfo info = item->info();
+        ItemInfo info;
+        if (item == NULL) info = posinfo;
+        else info = item->info();
         QRectF rect(info.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight / 2, (info.endPos - info.startPos).frames(m_document->fps()) - 1, 5);
         QList<QGraphicsItem *> selection = m_scene->items(rect);
-        selection.removeAll(item);
+        if (item) selection.removeAll(item);
         for (int i = 0; i < selection.count(); i++) {
+            if (!selection.at(i)->isEnabled()) continue;
             if (selection.at(i)->type() == AVWIDGET) {
                 ClipItem *clip = static_cast<ClipItem *>(selection.at(i));
                 if (clip->startPos() < info.startPos) {
                     if (clip->endPos() > info.endPos) {
                         ItemInfo clipInfo = clip->info();
                         ItemInfo dupInfo = clipInfo;
-                        GenTime diff = info.startPos - clip->startPos();
+                        GenTime diff = info.startPos - clipInfo.startPos;
                         dupInfo.startPos = info.startPos;
                         dupInfo.cropStart += diff;
                         dupInfo.cropDuration = clipInfo.endPos - info.startPos;
@@ -2069,7 +2117,6 @@ void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, QUndoCo
                         new ResizeClipCommand(this, dupInfo, newdupInfo, false, false, command);
                         ClipItem *dup = cutClip(clipInfo, info.startPos, true, false);
                         if (dup) dup->resizeStart(info.endPos.frames(m_document->fps()));
-
                     } else {
                         ItemInfo newclipInfo = clip->info();
                         newclipInfo.endPos = info.startPos;
@@ -2105,6 +2152,7 @@ void CustomTrackView::adjustTimelineTransitions(EDITMODE mode, Transition *item,
         QList<QGraphicsItem *> selection = m_scene->items(rect);
         selection.removeAll(item);
         for (int i = 0; i < selection.count(); i++) {
+            if (!selection.at(i)->isEnabled()) continue;
             if (selection.at(i)->type() == TRANSITIONWIDGET) {
                 Transition *tr = static_cast<Transition *>(selection.at(i));
                 if (tr->startPos() < info.startPos) {
@@ -2631,6 +2679,9 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
     if (m_moveOpMode == SEEK) m_moveOpMode = NONE;
     QGraphicsView::mouseReleaseEvent(event);
     setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);
+#if QT_VERSION >= 0x040600
+    if (m_dragItem) m_dragItem->setGraphicsEffect(NULL);
+#endif
     if (m_scrollTimer.isActive()) m_scrollTimer.stop();
     if (event->button() == Qt::MidButton) {
         return;
@@ -2736,7 +2787,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                 if (success) {
                     QUndoCommand *moveCommand = new QUndoCommand();
                     moveCommand->setText(i18n("Move clip"));
-                    adjustTimelineClips(m_scene->editMode(), item, moveCommand);
+                    adjustTimelineClips(m_scene->editMode(), item, ItemInfo(), moveCommand);
 
                     int tracknumber = m_document->tracksCount() - item->track() - 1;
                     bool isLocked = m_document->trackInfoAt(tracknumber).isLocked;
@@ -2928,7 +2979,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                         ClipItem *clip = static_cast <ClipItem*>(item);
                         info.track = m_document->tracksCount() - info.track;
                         Mlt::Producer *prod;
-                        adjustTimelineClips(m_scene->editMode(), clip, moveGroup);
+                        adjustTimelineClips(m_scene->editMode(), clip, ItemInfo(), moveGroup);
                         if (clip->isAudioOnly()) prod = clip->baseClip()->audioProducer(info.track);
                         else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer();
                         else prod = clip->baseClip()->producer(info.track);
@@ -3296,6 +3347,13 @@ void CustomTrackView::deleteClip(ItemInfo info, bool refresh)
 #if QT_VERSION >= 0x040600
     // animate item deletion
     item->closeAnimation();
+    /*if (refresh) item->closeAnimation();
+    else {
+        // no refresh, means we have several operations chained, we need to delete clip immediatly
+        // so that it does not get in the way of the other
+        delete item;
+        item = NULL;
+    }*/
 #else
     delete item;
     item = NULL;
@@ -3576,6 +3634,7 @@ ClipItem *CustomTrackView::getClipItemAtEnd(GenTime pos, int track)
     QList<QGraphicsItem *> list = scene()->items(QPointF(framepos - 1, track * m_tracksHeight + m_tracksHeight / 2));
     ClipItem *clip = NULL;
     for (int i = 0; i < list.size(); i++) {
+        if (!list.at(i)->isEnabled()) continue;
         if (list.at(i)->type() == AVWIDGET) {
             ClipItem *test = static_cast <ClipItem *>(list.at(i));
             if (test->endPos() == pos) clip = test;
@@ -3590,6 +3649,7 @@ ClipItem *CustomTrackView::getClipItemAtStart(GenTime pos, int track)
     QList<QGraphicsItem *> list = scene()->items(QPointF(pos.frames(m_document->fps()), track * m_tracksHeight + m_tracksHeight / 2));
     ClipItem *clip = NULL;
     for (int i = 0; i < list.size(); i++) {
+        if (!list.at(i)->isEnabled()) continue;
         if (list.at(i)->type() == AVWIDGET) {
             ClipItem *test = static_cast <ClipItem *>(list.at(i));
             if (test->startPos() == pos) clip = test;
@@ -3605,6 +3665,7 @@ ClipItem *CustomTrackView::getClipItemAt(int pos, int track)
     QList<QGraphicsItem *> list = scene()->items(p);
     ClipItem *clip = NULL;
     for (int i = 0; i < list.size(); i++) {
+        if (!list.at(i)->isEnabled()) continue;
         if (list.at(i)->type() == AVWIDGET) {
             clip = static_cast <ClipItem *>(list.at(i));
             break;
@@ -3624,6 +3685,7 @@ Transition *CustomTrackView::getTransitionItemAt(int pos, int track)
     QList<QGraphicsItem *> list = scene()->items(p);
     Transition *clip = NULL;
     for (int i = 0; i < list.size(); i++) {
+        if (!list.at(i)->isEnabled()) continue;
         if (list.at(i)->type() == TRANSITIONWIDGET) {
             clip = static_cast <Transition *>(list.at(i));
             break;
@@ -3644,6 +3706,7 @@ Transition *CustomTrackView::getTransitionItemAtEnd(GenTime pos, int track)
     QList<QGraphicsItem *> list = scene()->items(p);
     Transition *clip = NULL;
     for (int i = 0; i < list.size(); i++) {
+        if (!list.at(i)->isEnabled()) continue;
         if (list.at(i)->type() == TRANSITIONWIDGET) {
             Transition *test = static_cast <Transition *>(list.at(i));
             if (test->endPos() == pos) clip = test;
@@ -3659,6 +3722,7 @@ Transition *CustomTrackView::getTransitionItemAtStart(GenTime pos, int track)
     QList<QGraphicsItem *> list = scene()->items(p);
     Transition *clip = NULL;
     for (int i = 0; i < list.size(); ++i) {
+        if (!list.at(i)->isEnabled()) continue;
         if (list.at(i)->type() == TRANSITIONWIDGET) {
             Transition *test = static_cast <Transition *>(list.at(i));
             if (test->startPos() == pos) clip = test;
@@ -5486,7 +5550,9 @@ void CustomTrackView::insertZoneOverwrite(QStringList data, int in)
     info.endPos = info.startPos + GenTime(data.at(2).toInt(), m_document->fps()) - info.cropStart;
     info.cropDuration = info.endPos - info.startPos;
     info.track = m_selectedTrack;
-
-    AddTimelineClipCommand *add = new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), info, EffectsList(), true, false, true, false);
-    m_commandStack->push(add);
+    QUndoCommand *addCommand = new QUndoCommand();
+    addCommand->setText(i18n("Insert clip"));
+    adjustTimelineClips(OVERWRITEEDIT, NULL, info, addCommand);
+    new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), info, EffectsList(), true, false, true, false, addCommand);
+    m_commandStack->push(addCommand);
 }