]> git.sesse.net Git - kdenlive/blobdiff - src/customtrackview.cpp
Check & update clip length in timeline when doing a "clip reload" from project tree...
[kdenlive] / src / customtrackview.cpp
index f10b6cf1c58c4a4b9c4fd60d7fbe6a2ee059b54d..c74204daabbfb2cb824379bd8a76c3f71b096fcf 100644 (file)
 // const bool animate = KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects;
 // const int duration = animate ? 1500 : 1;
 
-CustomTrackView::CustomTrackView(KdenliveDoc *doc, CustomTrackScene* projectscene, QWidget *parent)
-        : QGraphicsView(projectscene, parent), m_scene(projectscene), m_cursorPos(0), m_cursorLine(NULL), m_operationMode(NONE), m_dragItem(NULL), m_visualTip(NULL), m_moveOpMode(NONE), m_animation(NULL), m_projectDuration(0), m_clickPoint(QPoint()), m_document(doc), m_autoScroll(KdenliveSettings::autoscroll()), m_tracksHeight(KdenliveSettings::trackheight()), m_tool(SELECTTOOL), m_dragGuide(NULL), m_findIndex(0), m_menuPosition(QPoint()), m_blockRefresh(false), m_selectionGroup(NULL), m_selectedTrack(0), m_copiedItems(QList<AbstractClipItem *> ()), m_scrollOffset(0), m_changeSpeedAction(NULL), m_pasteEffectsAction(NULL), m_ungroupAction(NULL), m_clipDrag(false)
+CustomTrackView::CustomTrackView(KdenliveDoc *doc, CustomTrackScene* projectscene, QWidget *parent) :
+        QGraphicsView(projectscene, parent),
+        m_tracksHeight(KdenliveSettings::trackheight()),
+        m_projectDuration(0),
+        m_cursorPos(0),
+        m_document(doc),
+        m_scene(projectscene),
+        m_cursorLine(NULL),
+        m_operationMode(NONE),
+        m_moveOpMode(NONE),
+        m_dragItem(NULL),
+        m_dragGuide(NULL),
+        m_visualTip(NULL),
+        m_animation(NULL),
+        m_clickPoint(),
+        m_autoScroll(KdenliveSettings::autoscroll()),
+        m_changeSpeedAction(NULL),
+        m_pasteEffectsAction(NULL),
+        m_ungroupAction(NULL),
+        m_scrollOffset(0),
+        m_clipDrag(false),
+        m_findIndex(0),
+        m_tool(SELECTTOOL),
+        m_copiedItems(),
+        m_menuPosition(),
+        m_blockRefresh(false),
+        m_selectionGroup(NULL)
 {
     if (doc) m_commandStack = doc->commandStack();
     else m_commandStack = NULL;
@@ -109,7 +134,8 @@ CustomTrackView::CustomTrackView(KdenliveDoc *doc, CustomTrackScene* projectscen
     KIcon spacerIcon("kdenlive-spacer-tool");
     m_spacerCursor = QCursor(spacerIcon.pixmap(22, 22));
     verticalScrollBar()->setTracking(true);
-    connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(slotRefreshGuides()));
+    // Line below was supposed to scroll guides label with scrollbar, not implemented yet
+    //connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(slotRefreshGuides()));
     connect(&m_scrollTimer, SIGNAL(timeout()), this, SLOT(slotCheckMouseScrolling()));
     m_scrollTimer.setInterval(100);
     m_scrollTimer.setSingleShot(true);
@@ -192,13 +218,6 @@ void CustomTrackView::checkTrackHeight()
     update();
 }
 
-// virtual
-void CustomTrackView::resizeEvent(QResizeEvent * event)
-{
-    QGraphicsView::resizeEvent(event);
-}
-
-// virtual
 /** Zoom or move viewport on mousewheel
  *
  * If mousewheel+Ctrl, zooms in/out on the timeline.
@@ -264,8 +283,9 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
     int pos = event->x();
     int mappedXPos = (int)(mapToScene(event->pos()).x() + 0.5);
     emit mousePosition(mappedXPos);
+
     if (event->buttons() & Qt::MidButton) return;
-    if ((event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL) || event->modifiers() == Qt::ShiftModifier) {
+    if (m_operationMode == RUBBERSELECTION || (event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL)) {
         QGraphicsView::mouseMoveEvent(event);
         m_moveOpMode = NONE;
         return;
@@ -306,15 +326,15 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
                 m_dragItem->updateKeyFramePos(keyFramePos, pos);
             }
 
-            if (m_animation) delete m_animation;
+            delete m_animation;
             m_animation = NULL;
-            if (m_visualTip) delete m_visualTip;
+            delete m_visualTip;
             m_visualTip = NULL;
             return;
         } else if (m_operationMode == MOVEGUIDE) {
-            if (m_animation) delete m_animation;
+            delete m_animation;
             m_animation = NULL;
-            if (m_visualTip) delete m_visualTip;
+            delete m_visualTip;
             m_visualTip = NULL;
             QGraphicsView::mouseMoveEvent(event);
             return;
@@ -365,7 +385,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
             return;
         } else {
             if (m_visualTip) {
-                if (m_animation) delete m_animation;
+                delete m_animation;
                 m_animation = NULL;
                 m_animationTimer->stop();
                 delete m_visualTip;
@@ -526,7 +546,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
             slotCheckPositionScrolling();
         } else m_moveOpMode = NONE;
         if (m_visualTip) {
-            if (m_animation) delete m_animation;
+            delete m_animation;
             m_animationTimer->stop();
             m_animation = NULL;
             delete m_visualTip;
@@ -691,7 +711,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
             return;
         }
         AbstractClipItem *clip = static_cast <AbstractClipItem *>(m_dragItem);
-        RazorClipCommand* command = new RazorClipCommand(this, clip->info(), GenTime((int)(mapToScene(event->pos()).x()), m_document->fps()), true);
+        RazorClipCommand* command = new RazorClipCommand(this, clip->info(), GenTime((int)(mapToScene(event->pos()).x()), m_document->fps()));
         m_document->renderer()->pause();
         m_commandStack->push(command);
         m_document->setModified(true);
@@ -1337,7 +1357,7 @@ void CustomTrackView::slotChangeEffectState(ClipItem *clip, int effectPos, bool
 
 void CustomTrackView::slotChangeEffectPosition(ClipItem *clip, int currentPos, int newPos)
 {
-    MoveEffectCommand *command = new MoveEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), currentPos, newPos, true);
+    MoveEffectCommand *command = new MoveEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), currentPos, newPos);
     m_commandStack->push(command);
     m_document->setModified(true);
 }
@@ -1640,6 +1660,7 @@ void CustomTrackView::dropEvent(QDropEvent * event)
             m_document->renderer()->mltInsertClip(info, item->xml(), item->baseClip()->producer(item->track()));
             item->setSelected(true);
         }
+        m_document->setModified(true);
         m_changeSpeedAction->setEnabled(hasVideoClip);
         m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
         groupSelectedItems(true);
@@ -1832,7 +1853,7 @@ void CustomTrackView::slotSwitchTrackAudio(int ix)
 void CustomTrackView::slotSwitchTrackLock(int ix)
 {
     int tracknumber = m_document->tracksCount() - ix - 1;
-    LockTrackCommand *command = new LockTrackCommand(this, ix, !m_document->trackInfoAt(tracknumber).isLocked, true);
+    LockTrackCommand *command = new LockTrackCommand(this, ix, !m_document->trackInfoAt(tracknumber).isLocked);
     m_commandStack->push(command);
 }
 
@@ -2033,7 +2054,7 @@ void CustomTrackView::deleteClip(const QString &clipId)
                 count++;
                 if (item->parentItem()) {
                     // Clip is in a group, destroy the group
-                    new GroupClipsCommand(this, QList<ItemInfo>() << item->info(), QList<ItemInfo>(), false, true, deleteCommand);
+                    new GroupClipsCommand(this, QList<ItemInfo>() << item->info(), QList<ItemInfo>(), false, deleteCommand);
                 }
                 new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), true, true, deleteCommand);
             }
@@ -2261,8 +2282,10 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                     m_commandStack->push(moveCommand);
                 } else {
                     // undo last move and emit error message
-                    MoveClipCommand *command = new MoveClipCommand(this, info, m_dragItemInfo, true);
-                    m_commandStack->push(command);
+                    bool snap = KdenliveSettings::snaptopoints();
+                    KdenliveSettings::setSnaptopoints(false);
+                    item->setPos((int) m_dragItemInfo.startPos.frames(m_document->fps()), (int)(m_dragItemInfo.track * m_tracksHeight + 1));
+                    KdenliveSettings::setSnaptopoints(snap);
                     emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(m_dragItemInfo.startPos.frames(m_document->fps()))), ErrorMessage);
                 }
                 m_document->setModified(true);
@@ -2614,6 +2637,7 @@ void CustomTrackView::deleteClip(ItemInfo info)
     scene()->removeItem(item);
     if (m_dragItem == item) m_dragItem = NULL;
     delete item;
+    m_document->setModified(true);
     m_document->renderer()->doRefresh();
 }
 
@@ -2648,7 +2672,7 @@ void CustomTrackView::deleteSelectedClips()
                 }
             }
             if (clipInfos.count() > 0) {
-                new GroupClipsCommand(this, clipInfos, transitionInfos, false, true, deleteSelected);
+                new GroupClipsCommand(this, clipInfos, transitionInfos, false, deleteSelected);
             }
         }
     }
@@ -2659,6 +2683,7 @@ void CustomTrackView::deleteSelectedClips()
             ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
             if (item->parentItem()) resetGroup = true;
             new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), true, true, deleteSelected);
+            emit clipItemSelected(NULL);
         } else if (itemList.at(i)->type() == TRANSITIONWIDGET) {
             Transition *item = static_cast <Transition *>(itemList.at(i));
             if (item->parentItem()) resetGroup = true;
@@ -2667,8 +2692,10 @@ void CustomTrackView::deleteSelectedClips()
             info.endPos = item->endPos();
             info.track = item->track();
             new AddTransitionCommand(this, info, item->transitionEndTrack(), item->toXML(), true, true, deleteSelected);
+            emit transitionItemSelected(NULL);
         }
     }
+
     m_commandStack->push(deleteSelected);
 }
 
@@ -2693,7 +2720,7 @@ void CustomTrackView::changeClipSpeed()
             double speed = (double) percent / 100.0;
             if (item->speed() != speed && (item->clipType() == VIDEO || item->clipType() == AV)) {
                 count++;
-                new ChangeSpeedCommand(this, info, item->speed(), speed, item->clipProducer(), true, changeSelected);
+                new ChangeSpeedCommand(this, info, item->speed(), speed, item->clipProducer(), changeSelected);
             }
         }
     }
@@ -2731,7 +2758,7 @@ void CustomTrackView::cutSelectedClips()
             if (item->parentItem() && item->parentItem() != m_selectionGroup) {
                 emit displayMessage(i18n("Cannot cut a clip in a group"), ErrorMessage);
             } else if (currentPos > item->startPos() && currentPos <  item->endPos()) {
-                RazorClipCommand *command = new RazorClipCommand(this, item->info(), currentPos, true);
+                RazorClipCommand *command = new RazorClipCommand(this, item->info(), currentPos);
                 m_commandStack->push(command);
             }
         }
@@ -2763,7 +2790,7 @@ void CustomTrackView::groupClips(bool group)
         }
     }
     if (clipInfos.count() > 0) {
-        GroupClipsCommand *command = new GroupClipsCommand(this, clipInfos, transitionInfos, group, true);
+        GroupClipsCommand *command = new GroupClipsCommand(this, clipInfos, transitionInfos, group);
         m_commandStack->push(command);
     }
 }
@@ -2824,6 +2851,8 @@ void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo i
     }
     ClipItem *item = new ClipItem(baseclip, info, m_document->fps(), xml.attribute("speed", "1").toDouble());
     item->setEffectList(effects);
+    if (xml.hasAttribute("audio_only")) item->setAudioOnly(true);
+    else if (xml.hasAttribute("video_only")) item->setVideoOnly(true);
     scene()->addItem(item);
 
     int tracknumber = m_document->tracksCount() - info.track - 1;
@@ -2865,7 +2894,7 @@ void CustomTrackView::slotUpdateClip(const QString &clipId)
         if (list.at(i)->type() == AVWIDGET) {
             clip = static_cast <ClipItem *>(list.at(i));
             if (clip->clipProducer() == clipId) {
-                clip->refreshClip();
+                clip->refreshClip(true);
                 ItemInfo info = clip->info();
                 info.track = m_document->tracksCount() - clip->track();
                 m_document->renderer()->mltUpdateClip(info, clip->xml(), clip->baseClip()->producer());
@@ -3398,13 +3427,13 @@ void CustomTrackView::clipEnd()
 void CustomTrackView::slotAddClipMarker(const QString &id, GenTime t, QString c)
 {
     QString oldcomment = m_document->clipManager()->getClipById(id)->markerComment(t);
-    AddMarkerCommand *command = new AddMarkerCommand(this, oldcomment, c, id, t, true);
+    AddMarkerCommand *command = new AddMarkerCommand(this, oldcomment, c, id, t);
     m_commandStack->push(command);
 }
 
 void CustomTrackView::slotDeleteClipMarker(const QString &comment, const QString &id, const GenTime &position)
 {
-    AddMarkerCommand *command = new AddMarkerCommand(this, comment, QString(), id, position, true);
+    AddMarkerCommand *command = new AddMarkerCommand(this, comment, QString(), id, position);
     m_commandStack->push(command);
 }
 
@@ -3421,7 +3450,7 @@ void CustomTrackView::slotDeleteAllClipMarkers(const QString &id)
     deleteMarkers->setText("Delete clip markers");
 
     for (int i = 0; i < markers.size(); i++) {
-        new AddMarkerCommand(this, markers.at(i).comment(), QString(), id, markers.at(i).time(), true, deleteMarkers);
+        new AddMarkerCommand(this, markers.at(i).comment(), QString(), id, markers.at(i).time(), deleteMarkers);
     }
     m_commandStack->push(deleteMarkers);
 }
@@ -3457,8 +3486,7 @@ void CustomTrackView::editGuide(const GenTime oldPos, const GenTime pos, const Q
         bool found = false;
         for (int i = 0; i < m_guides.count(); i++) {
             if (m_guides.at(i)->position() == oldPos) {
-                Guide *item = m_guides.takeAt(i);
-                delete item;
+                delete m_guides.takeAt(i);
                 found = true;
                 break;
             }
@@ -3557,14 +3585,10 @@ void CustomTrackView::setScale(double scaleFactor)
     m_scene->setScale(scaleFactor);
     //scale(scaleFactor, 1);
     m_animationTimer->stop();
-    if (m_visualTip) {
-        delete m_visualTip;
-        m_visualTip = NULL;
-    }
-    if (m_animation) {
-        delete m_animation;
-        m_animation = NULL;
-    }
+    delete m_visualTip;
+    m_visualTip = NULL;
+    delete m_animation;
+    m_animation = NULL;
 
     //setSceneRect(0, 0, m_projectDuration + 100 * scaleFactor, sceneRect().height());
     setMatrix(matrix);
@@ -3674,9 +3698,8 @@ void CustomTrackView::clearSearchStrings()
 
 void CustomTrackView::copyClip()
 {
-    while (m_copiedItems.count() > 0) {
-        delete m_copiedItems.takeFirst();
-    }
+    qDeleteAll(m_copiedItems);
+    m_copiedItems.clear();
     QList<QGraphicsItem *> itemList = scene()->selectedItems();
     if (itemList.count() == 0) {
         emit displayMessage(i18n("Select a clip before copying"), ErrorMessage);
@@ -3962,7 +3985,7 @@ void CustomTrackView::slotUpdateAllThumbs()
                     }
                 }
             }
-            item->refreshClip();
+            item->refreshClip(false);
             qApp->processEvents();
         }
     }
@@ -4032,7 +4055,7 @@ void CustomTrackView::slotInsertTrack(int ix)
             info.isBlind = true;
             info.isLocked = false;
         }
-        AddTrackCommand *addTrack = new AddTrackCommand(this, ix, info, true, true);
+        AddTrackCommand *addTrack = new AddTrackCommand(this, ix, info, true);
         m_commandStack->push(addTrack);
         m_document->setModified(true);
     }
@@ -4046,7 +4069,7 @@ void CustomTrackView::slotDeleteTrack(int ix)
         TrackInfo info = m_document->trackInfoAt(m_document->tracksCount() - ix - 1);
         deleteTimelineTrack(ix, info);
         m_document->setModified(true);
-        /*AddTrackCommand* command = new AddTrackCommand(this, ix, info, false, true);
+        /*AddTrackCommand* command = new AddTrackCommand(this, ix, info, false);
         m_commandStack->push(command);*/
     }
 }
@@ -4106,14 +4129,14 @@ void CustomTrackView::deleteTimelineTrack(int ix, TrackInfo trackinfo)
         }
     }
 
-    new AddTrackCommand(this, ix, trackinfo, false, true, deleteTrack);
+    new AddTrackCommand(this, ix, trackinfo, false, deleteTrack);
     m_commandStack->push(deleteTrack);
 }
 
 void CustomTrackView::changeTimelineTrack(int ix, TrackInfo trackinfo)
 {
     TrackInfo oldinfo = m_document->trackInfoAt(m_document->tracksCount() - ix - 1);
-    ChangeTrackCommand *changeTrack = new ChangeTrackCommand(this, ix, oldinfo, trackinfo, true);
+    ChangeTrackCommand *changeTrack = new ChangeTrackCommand(this, ix, oldinfo, trackinfo);
     m_commandStack->push(changeTrack);
 }
 
@@ -4236,7 +4259,7 @@ void CustomTrackView::splitAudio()
                 if (clip->parentItem()) {
                     emit displayMessage(i18n("Cannot split audio of grouped clips"), ErrorMessage);
                 } else {
-                    new SplitAudioCommand(this, clip->track(), clip->startPos(), true, splitCommand);
+                    new SplitAudioCommand(this, clip->track(), clip->startPos(), splitCommand);
                 }
             }
         }
@@ -4330,7 +4353,7 @@ void CustomTrackView::setVideoOnly()
                 if (clip->parentItem()) {
                     emit displayMessage(i18n("Cannot change grouped clips"), ErrorMessage);
                 } else {
-                    new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), true, false, clip->isVideoOnly(), clip->isAudioOnly(), true, videoCommand);
+                    new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), true, false, clip->isVideoOnly(), clip->isAudioOnly(), videoCommand);
                 }
             }
         }
@@ -4355,7 +4378,7 @@ void CustomTrackView::setAudioOnly()
                 if (clip->parentItem()) {
                     emit displayMessage(i18n("Cannot change grouped clips"), ErrorMessage);
                 } else {
-                    new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), false, true, clip->isVideoOnly(), clip->isAudioOnly(), true, videoCommand);
+                    new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), false, true, clip->isVideoOnly(), clip->isAudioOnly(), videoCommand);
                 }
             }
         }
@@ -4380,7 +4403,7 @@ void CustomTrackView::setAudioAndVideo()
                 if (clip->parentItem()) {
                     emit displayMessage(i18n("Cannot change grouped clips"), ErrorMessage);
                 } else {
-                    new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), false, false, clip->isVideoOnly(), clip->isAudioOnly(), true, videoCommand);
+                    new ChangeClipTypeCommand(this, clip->track(), clip->startPos(), false, false, clip->isVideoOnly(), clip->isAudioOnly(), videoCommand);
                 }
             }
         }
@@ -4434,4 +4457,5 @@ void CustomTrackView::updateClipTypeActions(ClipItem *clip)
     }
 }
 
+
 #include "customtrackview.moc"