]> git.sesse.net Git - kdenlive/blobdiff - src/customtrackview.cpp
Fix scripts with special chars in render name:
[kdenlive] / src / customtrackview.cpp
index 1701e96eb8caa7682390995f1096e2f0e14a836d..58e80084daaff6940c4906208745186fa7d0edca 100644 (file)
@@ -126,48 +126,48 @@ CustomTrackView::CustomTrackView(KdenliveDoc *doc, CustomTrackScene* projectscen
         m_selectedTrack(0),
         m_controlModifier(false)
 {
-    if (doc) m_commandStack = doc->commandStack();
-    else m_commandStack = NULL;
+    if (doc)
+        m_commandStack = doc->commandStack();
+    else
+        m_commandStack = NULL;
+
     setMouseTracking(true);
     setAcceptDrops(true);
     setFrameShape(QFrame::NoFrame);
     setLineWidth(0);
     //setCacheMode(QGraphicsView::CacheBackground);
-    //setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
     setAutoFillBackground(false);
     setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
+    setContentsMargins(0, 0, 0, 0);
+
     m_activeTrackBrush = KStatefulBrush(KColorScheme::View, KColorScheme::ActiveBackground, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
+
     pixmapCache = new KPixmapCache("kdenlive-thumbs");
-    KdenliveSettings::setTrackheight(m_tracksHeight);
+
     m_animationTimer = new QTimeLine(800);
     m_animationTimer->setFrameRange(0, 5);
     m_animationTimer->setUpdateInterval(100);
     m_animationTimer->setLoopCount(0);
+
     m_tipColor = QColor(0, 192, 0, 200);
-    QColor border = QColor(255, 255, 255, 100);
-    m_tipPen.setColor(border);
+    m_tipPen.setColor(QColor(255, 255, 255, 100));
     m_tipPen.setWidth(3);
-    setContentsMargins(0, 0, 0, 0);
+
     const int maxHeight = m_tracksHeight * m_document->tracksCount();
     setSceneRect(0, 0, sceneRect().width(), maxHeight);
     verticalScrollBar()->setMaximum(maxHeight);
+    verticalScrollBar()->setTracking(true);
+    // repaint guides when using vertical scroll
+    connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(slotRefreshGuides()));
+
     m_cursorLine = projectscene->addLine(0, 0, 0, maxHeight);
     m_cursorLine->setZValue(1000);
-
     QPen pen1 = QPen();
     pen1.setWidth(1);
     pen1.setColor(palette().text().color());
     m_cursorLine->setPen(pen1);
     m_cursorLine->setFlag(QGraphicsItem::ItemIgnoresTransformations, true);
 
-    KIcon razorIcon("edit-cut");
-    m_razorCursor = QCursor(razorIcon.pixmap(22, 22));
-
-    KIcon spacerIcon("kdenlive-spacer-tool");
-    m_spacerCursor = QCursor(spacerIcon.pixmap(22, 22));
-    verticalScrollBar()->setTracking(true);
-    // 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);
@@ -175,6 +175,12 @@ CustomTrackView::CustomTrackView(KdenliveDoc *doc, CustomTrackScene* projectscen
     connect(&m_thumbsTimer, SIGNAL(timeout()), this, SLOT(slotFetchNextThumbs()));
     m_thumbsTimer.setInterval(500);
     m_thumbsTimer.setSingleShot(true);
+
+    KIcon razorIcon("edit-cut");
+    m_razorCursor = QCursor(razorIcon.pixmap(22, 22));
+
+    KIcon spacerIcon("kdenlive-spacer-tool");
+    m_spacerCursor = QCursor(spacerIcon.pixmap(22, 22));
 }
 
 CustomTrackView::~CustomTrackView()
@@ -398,19 +404,26 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
                 if (!m_controlModifier && m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
                     AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(m_dragItem->parentItem());
                     if (parent)
-                        parent->resizeStart((int)(snappedPos) - m_dragItemInfo.startPos.frames(m_document->fps()));
+                        parent->resizeStart((int)(snappedPos - m_dragItemInfo.startPos.frames(m_document->fps())));
                 } else {
                     m_dragItem->resizeStart((int)(snappedPos));
                 }
+                QString crop = m_document->timecode().getDisplayTimecode(m_dragItem->cropStart(), KdenliveSettings::frametimecode());
+                QString duration = m_document->timecode().getDisplayTimecode(m_dragItem->cropDuration(), KdenliveSettings::frametimecode());
+                QString offset = m_document->timecode().getDisplayTimecode(m_dragItem->cropStart() - m_dragItemInfo.cropStart, KdenliveSettings::frametimecode());
+                emit displayMessage(i18n("Crop from start:") + ' ' + crop + ' ' + i18n("Duration:") + ' ' + duration + ' ' + i18n("Offset:") + ' ' + offset, InformationMessage);
             } else if (m_operationMode == RESIZEEND && move) {
                 m_document->renderer()->pause();
                 if (!m_controlModifier && m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
                     AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(m_dragItem->parentItem());
                     if (parent)
-                        parent->resizeEnd((int)(snappedPos) - m_dragItemInfo.endPos.frames(m_document->fps()));
+                        parent->resizeEnd((int)(snappedPos - m_dragItemInfo.endPos.frames(m_document->fps())));
                 } else {
                     m_dragItem->resizeEnd((int)(snappedPos));
                 }
+                QString duration = m_document->timecode().getDisplayTimecode(m_dragItem->cropDuration(), KdenliveSettings::frametimecode());
+                QString offset = m_document->timecode().getDisplayTimecode(m_dragItem->cropDuration() - m_dragItemInfo.cropDuration, KdenliveSettings::frametimecode());
+                emit displayMessage(i18n("Duration:") + ' ' + duration + ' ' + i18n("Offset:") + ' ' + offset, InformationMessage);
             } else if (m_operationMode == FADEIN && move) {
                 ((ClipItem*) m_dragItem)->setFadeIn((int)(mappedXPos - m_dragItem->startPos().frames(m_document->fps())));
             } else if (m_operationMode == FADEOUT && move) {
@@ -422,6 +435,8 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
                 double maxh = 100.0 / br.height();
                 pos = (br.bottom() - pos) * maxh;
                 m_dragItem->updateKeyFramePos(keyFramePos, pos);
+                QString position = m_document->timecode().getDisplayTimecodeFromFrames(m_dragItem->editedKeyFramePos(), KdenliveSettings::frametimecode());
+                emit displayMessage(position + " : " + QString::number(m_dragItem->editedKeyFrameValue()), InformationMessage);
             }
             removeTipAnimation();
             return;
@@ -1553,6 +1568,7 @@ void CustomTrackView::addEffect(int track, GenTime pos, QDomElement effect)
 {
     if (pos < GenTime()) {
         // Add track effect
+        clearSelection();
         m_document->addTrackEffect(track - 1, effect);
         m_document->renderer()->mltAddTrackEffect(track, getEffectArgs(effect));
         emit updateTrackEffectState(track - 1);
@@ -1588,8 +1604,10 @@ void CustomTrackView::deleteEffect(int track, GenTime pos, QDomElement effect)
     QString index = effect.attribute("kdenlive_ix");
     if (pos < GenTime()) {
         // Delete track effect
-        m_document->removeTrackEffect(track - 1, effect);
-        m_document->renderer()->mltRemoveTrackEffect(track, index, true);
+        if (m_document->renderer()->mltRemoveTrackEffect(track, index, true)) {
+           m_document->removeTrackEffect(track - 1, effect);
+       }
+       else emit displayMessage(i18n("Problem deleting effect"), ErrorMessage);
         emit updateTrackEffectState(track - 1);
         emit showTrackEffects(track, m_document->trackInfoAt(track - 1));
         return;
@@ -1735,6 +1753,21 @@ void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track)
     if (effectCommand->childCount() > 0) {
         m_commandStack->push(effectCommand);
         setDocumentModified();
+       if (effectCommand->childCount() == 1) {
+           // Display newly added clip effect
+           for (int i = 0; i < itemList.count(); i++) {
+               if (itemList.at(i)->type() == AVWIDGET) {
+                   ClipItem *clip = static_cast<ClipItem *>(itemList.at(i));
+                   if (!clip->isSelected()) {
+                       clearSelection();
+                       clip->setSelected(true);
+                   }
+                   clip->setSelectedEffect(clip->effectsCount() - 1);
+                   emit clipItemSelected(clip, clip->effectsCount() - 1);
+                   break;
+               }
+           }
+       }
     } else delete effectCommand;
 }
 
@@ -2338,8 +2371,12 @@ void CustomTrackView::dropEvent(QDropEvent * event)
         */
 
         m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
-        if (items.count() > 1) groupSelectedItems(true);
-        else if (items.count() == 1) m_dragItem = static_cast <ClipItem *>(items.at(0));
+        if (items.count() > 1) {
+            groupSelectedItems(true);
+        } else if (items.count() == 1) {
+            m_dragItem = static_cast <AbstractClipItem *>(items.at(0));
+            emit clipItemSelected((ClipItem*)m_dragItem);
+        }
         event->setDropAction(Qt::MoveAction);
         event->accept();
     } else QGraphicsView::dropEvent(event);
@@ -2658,8 +2695,8 @@ void CustomTrackView::configTracks(QList < TrackInfo > trackInfos)
         lockTrack(m_document->tracksCount() - i - 1, m_document->trackInfoAt(i).isLocked, false);
     }
 
-    QTimer::singleShot(300, this, SIGNAL(trackHeightChanged()));
     viewport()->update();
+    emit trackHeightChanged();
 }
 
 void CustomTrackView::slotSwitchTrackAudio(int ix)
@@ -3540,7 +3577,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
         int start = item->cropStart().frames(m_document->fps());
         int end = (item->cropStart() + item->cropDuration()).frames(m_document->fps()) - 1;
 
-        if ((val < -50 || val > 150) && item->editedKeyFramePos() != start && item->editedKeyFramePos() != end) {
+        if ((val < -50 || val > 150) && item->editedKeyFramePos() != start && item->editedKeyFramePos() != end && item->keyFrameNumber() > 1) {
             //delete keyframe
             item->movedKeyframe(item->getEffectAt(item->selectedEffectIndex()), item->selectedKeyFramePos(), -1, 0);
         } else {
@@ -4925,13 +4962,18 @@ bool CustomTrackView::addGuide(const GenTime pos, const QString &comment)
     return true;
 }
 
-void CustomTrackView::slotAddGuide()
+void CustomTrackView::slotAddGuide(bool dialog)
 {
     CommentedTime marker(GenTime(m_cursorPos, m_document->fps()), i18n("Guide"));
-    MarkerDialog d(NULL, marker, m_document->timecode(), i18n("Add Guide"), this);
-    if (d.exec() != QDialog::Accepted) return;
-    if (addGuide(d.newMarker().time(), d.newMarker().comment())) {
-        EditGuideCommand *command = new EditGuideCommand(this, GenTime(), QString(), d.newMarker().time(), d.newMarker().comment(), false);
+    if (dialog) {
+        MarkerDialog d(NULL, marker, m_document->timecode(), i18n("Add Guide"), this);
+        if (d.exec() != QDialog::Accepted) return;
+        marker.setComment(d.newMarker().comment());
+    } else {
+        marker.setComment(m_document->timecode().getDisplayTimecodeFromFrames(m_cursorPos, false));
+    }
+    if (addGuide(marker.time(), marker.comment())) {
+        EditGuideCommand *command = new EditGuideCommand(this, GenTime(), QString(), marker.time(), marker.comment(), false);
         m_commandStack->push(command);
     }
 }
@@ -5802,6 +5844,11 @@ void CustomTrackView::doSplitAudio(const GenTime &pos, int track, bool split)
     if (split) {
         int start = pos.frames(m_document->fps());
         int freetrack = m_document->tracksCount() - track - 1;
+
+        // do not split audio when we are on an audio track
+        if (m_document->trackInfoAt(freetrack).type == AUDIOTRACK)
+            return;
+
         for (; freetrack > 0; freetrack--) {
             kDebug() << "// CHK DOC TRK:" << freetrack << ", DUR:" << m_document->renderer()->mltTrackDuration(freetrack);
             if (m_document->trackInfoAt(freetrack - 1).type == AUDIOTRACK && !m_document->trackInfoAt(freetrack - 1).isLocked) {