]> git.sesse.net Git - kdenlive/blobdiff - src/customtrackview.cpp
Update transitions lumas when user installs a new one:
[kdenlive] / src / customtrackview.cpp
index 4813edfdcb5684fa388c8403e5b619871c0d0896..796ffa15910bec58dae61764f6e89e03cb9b3db7 100644 (file)
@@ -172,6 +172,15 @@ void CustomTrackView::setContextMenu(QMenu *timeline, QMenu *clip, QMenu *transi
             break;
         }
     }
+
+    m_timelineContextMenu->addSeparator();
+    m_deleteGuide = new KAction(KIcon("edit-delete"), i18n("Delete Guide"), this);
+    connect(m_deleteGuide, SIGNAL(triggered()), this, SLOT(slotDeleteTimeLineGuide()));
+    m_timelineContextMenu->addAction(m_deleteGuide);
+
+    m_editGuide = new KAction(KIcon("document-properties"), i18n("Edit Guide"), this);
+    connect(m_editGuide, SIGNAL(triggered()), this, SLOT(slotEditTimeLineGuide()));
+    m_timelineContextMenu->addAction(m_editGuide);
 }
 
 void CustomTrackView::checkAutoScroll()
@@ -563,8 +572,20 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
 void CustomTrackView::mousePressEvent(QMouseEvent * event)
 {
     kDebug() << "mousePressEvent STARTED";
+    setFocus(Qt::MouseFocusReason);
     m_menuPosition = QPoint();
+
+    // special cases (middle click button or ctrl / shift click
+    if (event->button() == Qt::MidButton) {
+        m_document->renderer()->switchPlay();
+        m_blockRefresh = false;
+        m_operationMode = NONE;
+        return;
+    }
+
     m_blockRefresh = true;
+    m_dragItem = NULL;
+    m_dragGuide = NULL;
     bool collision = false;
 
     if (m_tool != RAZORTOOL) activateMonitor();
@@ -574,16 +595,8 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
     }
     m_clickEvent = event->pos();
 
-    // special cases (middle click button or ctrl / shift click
-    if (event->button() == Qt::MidButton) {
-        m_document->renderer()->switchPlay();
-        m_blockRefresh = false;
-        m_operationMode = NONE;
-        return;
-    }
-
     // check item under mouse
-    QList<QGraphicsItem *> collisionList = items(event->pos());
+    QList<QGraphicsItem *> collisionList = items(m_clickEvent);
 
     if (event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL && collisionList.count() == 0) {
         setDragMode(QGraphicsView::ScrollHandDrag);
@@ -605,26 +618,30 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
         return;
     }
 
-    if (collisionList.count() == 1 && collisionList.at(0)->type() == GUIDEITEM) {
-        // a guide item was pressed
-        collisionList.at(0)->setFlag(QGraphicsItem::ItemIsMovable, true);
-        m_dragItem = NULL;
-        m_dragGuide = (Guide *) collisionList.at(0);
-        collision = true;
-        m_operationMode = MOVEGUIDE;
-        // deselect all clips so that only the guide will move
-        m_scene->clearSelection();
-        resetSelectionGroup();
-        updateSnapPoints(NULL);
-        QGraphicsView::mousePressEvent(event);
-        return;
+    // if a guide and a clip were pressed, just select the guide
+    for (int i = 0; i < collisionList.count(); ++i) {
+        if (collisionList.at(i)->type() == GUIDEITEM) {
+            // a guide item was pressed
+            m_dragGuide = (Guide *) collisionList.at(i);
+            if (event->button() == Qt::LeftButton) { // move it
+                m_dragGuide->setFlag(QGraphicsItem::ItemIsMovable, true);
+                collision = true;
+                m_operationMode = MOVEGUIDE;
+                // deselect all clips so that only the guide will move
+                m_scene->clearSelection();
+                resetSelectionGroup(false);
+                updateSnapPoints(NULL);
+                QGraphicsView::mousePressEvent(event);
+                return;
+            } else // show context menu
+                break;
+        }
     }
 
-    // Find first clip, transition or group under mouse
+    // Find first clip, transition or group under mouse (when no guides selected)
     int ct = 0;
-    m_dragItem = NULL;
     AbstractGroupItem *dragGroup = NULL;
-    while (ct < collisionList.count()) {
+    while (!m_dragGuide && ct < collisionList.count()) {
         if (collisionList.at(ct)->type() == AVWIDGET || collisionList.at(ct)->type() == TRANSITIONWIDGET) {
             m_dragItem = static_cast <AbstractClipItem *>(collisionList.at(ct));
             m_dragItemInfo = m_dragItem->info();
@@ -652,7 +669,23 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
                 m_scene->clearSelection();
                 m_dragItem->setSelected(true);
             }
+        } else if (!m_dragGuide) {
+            // check if there is a guide close to mouse click
+            QList<QGraphicsItem *> guidesCollisionList = items(event->pos().x() - 5, event->pos().y(), 10, 2); // a rect of height < 2 does not always collide with the guide
+            for (int i = 0; i < guidesCollisionList.count(); i++) {
+                if (guidesCollisionList.at(i)->type() == GUIDEITEM) {
+                    m_dragGuide = static_cast <Guide *>(guidesCollisionList.at(i));
+                    break;
+                }
+            }
+            // keep this to support multiple guides context menu in the future (?)
+            /*if (guidesCollisionList.at(0)->type() != GUIDEITEM)
+                guidesCollisionList.removeAt(0);
+            }
+            if (!guidesCollisionList.isEmpty())
+            m_dragGuide = static_cast <Guide *>(guidesCollisionList.at(0));*/
         }
+
         m_operationMode = NONE;
         displayContextMenu(event->globalPos(), m_dragItem, dragGroup);
         m_menuPosition = m_clickEvent;
@@ -749,12 +782,11 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
     if (m_dragItem->type() == AVWIDGET && !m_dragItem->isItemLocked()) emit clipItemSelected((ClipItem*) m_dragItem);
     else emit clipItemSelected(NULL);
 
-    if (event->modifiers() != Qt::ControlModifier && (m_dragItem->isSelected() || (dragGroup && dragGroup->isSelected()))) {
-        // If clicked item is selected, allow move
-        if (dragGroup) dragGroup->setSelected(true);
-        //event->accept();
-        if (m_operationMode == NONE) QGraphicsView::mousePressEvent(event);
-    } else {
+    bool itemSelected = false;
+    if (m_dragItem->isSelected()) itemSelected = true;
+    else if (m_dragItem->parentItem() && m_dragItem->parentItem()->isSelected()) itemSelected = true;
+    else if (dragGroup && dragGroup->isSelected()) itemSelected = true;
+    if (event->modifiers() == Qt::ControlModifier || itemSelected == false) {
         resetSelectionGroup();
         if (event->modifiers() != Qt::ControlModifier) m_scene->clearSelection();
         dragGroup = NULL;
@@ -773,6 +805,9 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
         m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
     }
 
+    // If clicked item is selected, allow move
+    if (event->modifiers() != Qt::ControlModifier && m_operationMode == NONE && (m_dragItem->isSelected() || (dragGroup && dragGroup->isSelected()))) QGraphicsView::mousePressEvent(event);
+
     m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps())), (int)(event->pos().y() - m_dragItem->pos().y()));
     m_operationMode = m_dragItem->operationMode(mapToScene(event->pos()));
 
@@ -819,7 +854,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
             info.startPos = transitionClip->startPos();
         } else info.startPos = info.endPos - GenTime(65, m_document->fps());
         if (info.endPos == info.startPos) info.startPos = info.endPos - GenTime(65, m_document->fps());
-        QDomElement transition = MainWindow::transitions.getEffectByName("Luma").cloneNode().toElement();
+        QDomElement transition = MainWindow::transitions.getEffectByTag("luma", "dissolve").cloneNode().toElement();
         EffectsList::setParameter(transition, "reverse", "1");
 
         // Check there is no other transition at that place
@@ -980,7 +1015,7 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event)
             m_commandStack->push(command);
             updateEffect(m_document->tracksCount() - item->track(), item->startPos(), item->selectedEffect(), item->selectedEffectIndex());
         }
-    } else if (m_dragItem) {
+    } else if (m_dragItem && !m_dragItem->isItemLocked()) {
         ClipDurationDialog d(m_dragItem, m_document->timecode(), this);
         GenTime minimum;
         GenTime maximum;
@@ -989,7 +1024,7 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event)
         } else {
             getClipAvailableSpace(m_dragItem, minimum, maximum);
         }
-        //kDebug()<<"// GOT MOVE POS: "<<minimum.frames(25)<<" - "<<maximum.frames(25);
+        //kDebug()<<"// GOT MOVE POS: "<<minimum.frames(25)<<" - "<<maximum.frames(25);
         d.setMargins(minimum, maximum);
         if (d.exec() == QDialog::Accepted) {
             if (m_dragItem->type() == TRANSITIONWIDGET) {
@@ -1009,13 +1044,21 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event)
                 QUndoCommand *moveCommand = new QUndoCommand();
                 moveCommand->setText(i18n("Edit clip"));
                 ItemInfo clipInfo = m_dragItem->info();
+                if (d.duration() < m_dragItem->duration() || d.cropStart() != clipInfo.cropStart) {
+                    // duration was reduced, so process it first
+                    ItemInfo startInfo = clipInfo;
+                    clipInfo.endPos = clipInfo.startPos + d.duration();
+                    clipInfo.cropStart = d.cropStart();
+                    new ResizeClipCommand(this, startInfo, clipInfo, true, moveCommand);
+                }
                 if (d.startPos() != clipInfo.startPos) {
                     ItemInfo startInfo = clipInfo;
                     clipInfo.startPos = d.startPos();
                     clipInfo.endPos = m_dragItem->endPos() + (clipInfo.startPos - startInfo.startPos);
                     new MoveClipCommand(this, startInfo, clipInfo, true, moveCommand);
                 }
-                if (d.duration() != m_dragItem->duration() || d.cropStart() != clipInfo.cropStart) {
+                if (d.duration() > m_dragItem->duration()) {
+                    // duration was increased, so process it after move
                     ItemInfo startInfo = clipInfo;
                     clipInfo.endPos = clipInfo.startPos + d.duration();
                     clipInfo.cropStart = d.cropStart();
@@ -1046,6 +1089,8 @@ void CustomTrackView::editKeyFrame(const GenTime pos, const int track, const int
 
 void CustomTrackView::displayContextMenu(QPoint pos, AbstractClipItem *clip, AbstractGroupItem *group)
 {
+    m_deleteGuide->setEnabled(m_dragGuide != NULL);
+    m_editGuide->setEnabled(m_dragGuide != NULL);
     if (clip == NULL) m_timelineContextMenu->popup(pos);
     else if (group != NULL) {
         m_changeSpeedAction->setEnabled(false);
@@ -1079,7 +1124,7 @@ void CustomTrackView::dragEnterEvent(QDragEnterEvent * event)
         m_selectionGroup = new AbstractGroupItem(m_document->fps());
         QPoint pos;
         DocClipBase *clip = m_document->getBaseClip(list.at(0));
-        if (clip == NULL) kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << list.at(0);
+        if (clip == NULL) kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << list.at(0);
         ItemInfo info;
         info.startPos = GenTime();
         info.cropStart = GenTime(list.at(1).toInt(), m_document->fps());
@@ -1107,7 +1152,7 @@ void CustomTrackView::dragEnterEvent(QDragEnterEvent * event)
         QList <GenTime> offsetList;
         for (int i = 0; i < ids.size(); ++i) {
             DocClipBase *clip = m_document->getBaseClip(ids.at(i));
-            if (clip == NULL) kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << ids.at(i);
+            if (clip == NULL) kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << ids.at(i);
             ItemInfo info;
             info.startPos = start;
             info.endPos = info.startPos + clip->duration();
@@ -1124,7 +1169,7 @@ void CustomTrackView::dragEnterEvent(QDragEnterEvent * event)
         scene()->addItem(m_selectionGroup);
         event->acceptProposedAction();
     } else {
-        // the drag is not a clip (may be effect, ...)
+        // the drag is not a clip (may be effect, ...)
         m_clipDrag = false;
         QGraphicsView::dragEnterEvent(event);
     }
@@ -1192,7 +1237,7 @@ void CustomTrackView::deleteEffect(int track, GenTime pos, QDomElement effect)
 {
     QString index = effect.attribute("kdenlive_ix");
     if (!m_document->renderer()->mltRemoveEffect(track, pos, index, true) && effect.attribute("disabled") != "1") {
-        kDebug() << "// ERROR REMOV EFFECT: " << index << ", DISABLE: " << effect.attribute("disabled");
+        kDebug() << "// ERROR REMOV EFFECT: " << index << ", DISABLE: " << effect.attribute("disabled");
         emit displayMessage(i18n("Problem deleting effect"), ErrorMessage);
         return;
     }
@@ -1255,7 +1300,7 @@ void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track)
         if (clip) itemList.append(clip);
         else emit displayMessage(i18n("Select a clip if you want to apply an effect"), ErrorMessage);
     }
-    kDebug() << "// REQUESTING EFFECT ON CLIP: " << pos.frames(25) << ", TRK: " << track << "SELECTED ITEMS: " << itemList.count();
+    kDebug() << "// REQUESTING EFFECT ON CLIP: " << pos.frames(25) << ", TRK: " << track << "SELECTED ITEMS: " << itemList.count();
     for (int i = 0; i < itemList.count(); i++) {
         if (itemList.at(i)->type() == AVWIDGET) {
             ClipItem *item = (ClipItem *)itemList.at(i);
@@ -1502,6 +1547,7 @@ void CustomTrackView::slotAddTransitionToSelectedClips(QDomElement transition)
                     info.startPos = transitionClip->startPos();
                 } else info.startPos = info.endPos - GenTime(65, m_document->fps());
                 if (transition.attribute("tag") == "luma") EffectsList::setParameter(transition, "reverse", "1");
+                else if (transition.attribute("id") == "slide") EffectsList::setParameter(transition, "invert", "1");
 
                 // Check there is no other transition at that place
                 double startY = info.track * m_tracksHeight + 1 + m_tracksHeight / 2;
@@ -1588,7 +1634,7 @@ void CustomTrackView::deleteTransition(ItemInfo transitionInfo, int endTrack, QD
 
 void CustomTrackView::slotTransitionUpdated(Transition *tr, QDomElement old)
 {
-    kDebug() << "TRANS UPDATE, TRACKS: " << old.attribute("transition_btrack") << ", NEW: " << tr->toXML().attribute("transition_btrack");
+    kDebug() << "TRANS UPDATE, TRACKS: " << old.attribute("transition_btrack") << ", NEW: " << tr->toXML().attribute("transition_btrack");
     EditTransitionCommand *command = new EditTransitionCommand(this, tr->track(), tr->startPos(), old, tr->toXML(), false);
     m_commandStack->push(command);
     m_document->setModified(true);
@@ -1602,9 +1648,19 @@ void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTr
         return;
     }
     m_document->renderer()->mltUpdateTransition(oldTransition.attribute("tag"), transition.attribute("tag"), transition.attribute("transition_btrack").toInt(), m_document->tracksCount() - transition.attribute("transition_atrack").toInt(), item->startPos(), item->endPos(), transition);
-    //kDebug() << "ORIGINAL TRACK: "<< oldTransition.attribute("transition_btrack") << ", NEW TRACK: "<<transition.attribute("transition_btrack");
+    //kDebug() << "ORIGINAL TRACK: "<< oldTransition.attribute("transition_btrack") << ", NEW TRACK: "<<transition.attribute("transition_btrack");
     item->setTransitionParameters(transition);
-    if (updateTransitionWidget) emit transitionItemSelected(item, true);
+    if (updateTransitionWidget) {
+        ItemInfo info = item->info();
+        QPoint p;
+        ClipItem *transitionClip = getClipItemAt(info.startPos, info.track);
+        if (transitionClip && transitionClip->baseClip()) {
+            QString size = transitionClip->baseClip()->getProperty("frame_size");
+            p.setX(size.section('x', 0, 0).toInt());
+            p.setY(size.section('x', 1, 1).toInt());
+        }
+        emit transitionItemSelected(item, p, true);
+    }
     m_document->setModified(true);
 }
 
@@ -1639,6 +1695,9 @@ void CustomTrackView::dropEvent(QDropEvent * event)
         resetSelectionGroup();
         m_scene->clearSelection();
         bool hasVideoClip = false;
+        QUndoCommand *addCommand = new QUndoCommand();
+        addCommand->setText(i18n("Add timeline clip"));
+
         for (int i = 0; i < items.count(); i++) {
             ClipItem *item = static_cast <ClipItem *>(items.at(i));
             if (!hasVideoClip && (item->clipType() == AV || item->clipType() == VIDEO)) hasVideoClip = true;
@@ -1647,8 +1706,8 @@ void CustomTrackView::dropEvent(QDropEvent * event)
             } else {
                 updateClipTypeActions(NULL);
             }
-            AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false);
-            m_commandStack->push(command);
+
+            new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), false, false, addCommand);
             item->baseClip()->addReference();
             m_document->updateClip(item->baseClip()->getId());
             ItemInfo info = item->info();
@@ -1657,25 +1716,19 @@ void CustomTrackView::dropEvent(QDropEvent * event)
             bool isLocked = m_document->trackInfoAt(tracknumber).isLocked;
             if (isLocked) item->setItemLocked(true);
 
-            if (item->baseClip()->isTransparent()) {
+            if (item->baseClip()->isTransparent() && getTransitionItemAtStart(info.startPos, info.track) == NULL) {
                 // add transparency transition
-                int endTrack = getPreviousVideoTrack(info.track);
-                Transition *tr = new Transition(info, endTrack, m_document->fps(), MainWindow::transitions.getEffectByTag("composite", "composite"), true);
-                if (m_document->renderer()->mltAddTransition(tr->transitionTag(), endTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML())) {
-                    scene()->addItem(tr);
-                } else {
-                    emit displayMessage(i18n("Cannot add transition"), ErrorMessage);
-                    delete tr;
-                }
+                new AddTransitionCommand(this, info, getPreviousVideoTrack(info.track), MainWindow::transitions.getEffectByTag("composite", "composite"), false, true, addCommand);
             }
             info.track = m_document->tracksCount() - item->track();
             m_document->renderer()->mltInsertClip(info, item->xml(), item->baseClip()->producer(item->track()));
             item->setSelected(true);
         }
+        m_commandStack->push(addCommand);
         m_document->setModified(true);
         m_changeSpeedAction->setEnabled(hasVideoClip);
         m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
-        groupSelectedItems(true);
+        if (items.count() > 1) groupSelectedItems(true);
     } else QGraphicsView::dropEvent(event);
     setFocus();
 }
@@ -2133,9 +2186,13 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
         setCursor(Qt::ArrowCursor);
         m_operationMode = NONE;
         m_dragGuide->setFlag(QGraphicsItem::ItemIsMovable, false);
-        EditGuideCommand *command = new EditGuideCommand(this, m_dragGuide->position(), m_dragGuide->label(), GenTime(m_dragGuide->pos().x(), m_document->fps()), m_dragGuide->label(), false);
-        m_commandStack->push(command);
-        m_dragGuide->updateGuide(GenTime(m_dragGuide->pos().x(), m_document->fps()));
+        GenTime newPos = GenTime(m_dragGuide->pos().x(), m_document->fps());
+        if (newPos != m_dragGuide->position()) {
+            EditGuideCommand *command = new EditGuideCommand(this, m_dragGuide->position(), m_dragGuide->label(), newPos, m_dragGuide->label(), false);
+            m_commandStack->push(command);
+            m_dragGuide->updateGuide(GenTime(m_dragGuide->pos().x(), m_document->fps()));
+            m_document->syncGuides(m_guides);
+        }
         m_dragGuide = NULL;
         m_dragItem = NULL;
         return;
@@ -2188,7 +2245,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
             InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, timeOffset, false);
             m_commandStack->push(command);
             if (track != -1) track = m_document->tracksCount() - track;
-            kDebug() << "SPACER TRACK:" << track;
+            kDebug() << "SPACER TRACK:" << track;
             m_document->renderer()->mltInsertSpace(trackClipStartList, trackTransitionStartList, track, timeOffset, GenTime());
         }
         resetSelectionGroup(false);
@@ -2220,6 +2277,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                 else prod = item->baseClip()->producer(m_dragItemInfo.track);
                 bool success = m_document->renderer()->mltMoveClip((int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItem->track()), (int) m_dragItemInfo.startPos.frames(m_document->fps()), (int)(m_dragItem->startPos().frames(m_document->fps())), prod);
                 if (success) {
+                    kDebug() << "// get trans info";
                     int tracknumber = m_document->tracksCount() - item->track() - 1;
                     bool isLocked = m_document->trackInfoAt(tracknumber).isLocked;
                     if (isLocked) item->setItemLocked(true);
@@ -2229,6 +2287,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                     new MoveClipCommand(this, m_dragItemInfo, info, false, moveCommand);
                     // Also move automatic transitions (on lower track)
                     Transition *tr = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track);
+                    kDebug() << "// get trans info2";
                     if (tr && tr->isAutomatic()) {
                         ItemInfo trInfo = tr->info();
                         ItemInfo newTrInfo = trInfo;
@@ -2408,7 +2467,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
         }
 
     } else if (m_operationMode == RESIZESTART && m_dragItem->startPos() != m_dragItemInfo.startPos) {
-        // resize start
+        // resize start
         if (m_dragItem->type() == AVWIDGET) {
             ItemInfo resizeinfo = m_dragItemInfo;
             resizeinfo.track = m_document->tracksCount() - resizeinfo.track;
@@ -2469,7 +2528,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
         }
         //m_document->renderer()->doRefresh();
     } else if (m_operationMode == RESIZEEND && m_dragItem->endPos() != m_dragItemInfo.endPos) {
-        // resize end
+        // resize end
         if (m_dragItem->type() == AVWIDGET) {
             ItemInfo resizeinfo = info;
             resizeinfo.track = m_document->tracksCount() - resizeinfo.track;
@@ -2530,7 +2589,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
         }
         //m_document->renderer()->doRefresh();
     } else if (m_operationMode == FADEIN) {
-        // resize fade in effect
+        // resize fade in effect
         ClipItem * item = (ClipItem *) m_dragItem;
         int ix = item->hasEffect("volume", "fadein");
         if (ix != -1) {
@@ -2569,7 +2628,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
             }
         }
     } else if (m_operationMode == FADEOUT) {
-        // resize fade in effect
+        // resize fade in effect
         ClipItem * item = (ClipItem *) m_dragItem;
         int ix = item->hasEffect("volume", "fadeout");
         if (ix != -1) {
@@ -2620,8 +2679,17 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
         m_commandStack->push(command);
         updateEffect(m_document->tracksCount() - item->track(), item->startPos(), item->selectedEffect(), item->selectedEffectIndex());
     }
-
-    emit transitionItemSelected((m_dragItem && m_dragItem->type() == TRANSITIONWIDGET && m_dragItem->isSelected()) ? static_cast <Transition *>(m_dragItem) : NULL);
+    if (m_dragItem && m_dragItem->type() == TRANSITIONWIDGET && m_dragItem->isSelected()) {
+        // A transition is selected
+        QPoint p;
+        ClipItem *transitionClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track);
+        if (transitionClip && transitionClip->baseClip()) {
+            QString size = transitionClip->baseClip()->getProperty("frame_size");
+            p.setX(size.section('x', 0, 0).toInt());
+            p.setY(size.section('x', 1, 1).toInt());
+        }
+        emit transitionItemSelected(static_cast <Transition *>(m_dragItem), p);
+    } else emit transitionItemSelected(NULL);
     if (m_operationMode != NONE && m_operationMode != MOVE) m_document->setModified(true);
     m_operationMode = NONE;
 }
@@ -2638,7 +2706,7 @@ void CustomTrackView::deleteClip(ItemInfo info)
     item->baseClip()->removeReference();
     m_document->updateClip(item->baseClip()->getId());
 
-    if (item->baseClip()->isTransparent()) {
+    /*if (item->baseClip()->isTransparent()) {
         // also remove automatic transition
         Transition *tr = getTransitionItemAt(info.startPos, info.track);
         if (tr && tr->isAutomatic()) {
@@ -2646,7 +2714,7 @@ void CustomTrackView::deleteClip(ItemInfo info)
             scene()->removeItem(tr);
             delete tr;
         }
-    }
+    }*/
     scene()->removeItem(item);
     if (m_dragItem == item) m_dragItem = NULL;
     delete item;
@@ -2690,7 +2758,6 @@ void CustomTrackView::deleteSelectedClips()
         }
     }
 
-
     for (int i = 0; i < itemList.count(); i++) {
         if (itemList.at(i)->type() == AVWIDGET) {
             ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
@@ -2700,11 +2767,7 @@ void CustomTrackView::deleteSelectedClips()
         } else if (itemList.at(i)->type() == TRANSITIONWIDGET) {
             Transition *item = static_cast <Transition *>(itemList.at(i));
             if (item->parentItem()) resetGroup = true;
-            ItemInfo info;
-            info.startPos = item->startPos();
-            info.endPos = item->endPos();
-            info.track = item->track();
-            new AddTransitionCommand(this, info, item->transitionEndTrack(), item->toXML(), true, true, deleteSelected);
+            new AddTransitionCommand(this, item->info(), item->transitionEndTrack(), item->toXML(), true, true, deleteSelected);
             emit transitionItemSelected(NULL);
         }
     }
@@ -2872,18 +2935,6 @@ void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo i
     bool isLocked = m_document->trackInfoAt(tracknumber).isLocked;
     if (isLocked) item->setItemLocked(true);
 
-    if (item->baseClip()->isTransparent()) {
-        // add transparency transition
-        int endTrack = getPreviousVideoTrack(info.track);
-        Transition *tr = new Transition(info, endTrack, m_document->fps(), MainWindow::transitions.getEffectByTag("composite", "composite"), true);
-        if (m_document->renderer()->mltAddTransition(tr->transitionTag(), endTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML())) scene()->addItem(tr);
-        else {
-            emit displayMessage(i18n("Cannot add transition"), ErrorMessage);
-            delete tr;
-        }
-
-    }
-
     baseclip->addReference();
     m_document->updateClip(baseclip->getId());
     info.track = m_document->tracksCount() - info.track;
@@ -3017,7 +3068,7 @@ void CustomTrackView::moveClip(const ItemInfo start, const ItemInfo end)
     ClipItem *item = getClipItemAt((int) start.startPos.frames(m_document->fps()) + 1, start.track);
     if (!item) {
         emit displayMessage(i18n("Cannot move clip at time: %1 on track %2", m_document->timecode().getTimecodeFromFrames(start.startPos.frames(m_document->fps())), start.track), ErrorMessage);
-        kDebug() << "----------------  ERROR, CANNOT find clip to move at.. ";
+        kDebug() << "----------------  ERROR, CANNOT find clip to move at.. ";
         return;
     }
     Mlt::Producer *prod;
@@ -3070,14 +3121,14 @@ void CustomTrackView::moveGroup(QList <ItemInfo> startClip, QList <ItemInfo> sta
             startClip[i].startPos = startClip.at(i).startPos - offset;
             startClip[i].track = startClip.at(i).track - trackOffset;
         }
-        //kDebug()<<"//LKING FR CLIP AT:"<<startClip.at(i).startPos.frames(25)<<", TK:"<<startClip.at(i).track;
+        //kDebug()<<"//LKING FR CLIP AT:"<<startClip.at(i).startPos.frames(25)<<", TK:"<<startClip.at(i).track;
         ClipItem *clip = getClipItemAt(startClip.at(i).startPos, startClip.at(i).track);
         if (clip) {
             clip->setItemLocked(false);
             if (clip->parentItem()) clip->parentItem()->setSelected(true);
             else clip->setSelected(true);
             m_document->renderer()->mltRemoveClip(m_document->tracksCount() - startClip.at(i).track, startClip.at(i).startPos);
-        } else kDebug() << "//MISSING CLIP AT: " << startClip.at(i).startPos.frames(25);
+        } else kDebug() << "//MISSING CLIP AT: " << startClip.at(i).startPos.frames(25);
     }
     for (int i = 0; i < startTransition.count(); i++) {
         if (reverseMove) {
@@ -3090,7 +3141,7 @@ void CustomTrackView::moveGroup(QList <ItemInfo> startClip, QList <ItemInfo> sta
             if (tr->parentItem()) tr->parentItem()->setSelected(true);
             else tr->setSelected(true);
             m_document->renderer()->mltDeleteTransition(tr->transitionTag(), tr->transitionEndTrack(), m_document->tracksCount() - startTransition.at(i).track, startTransition.at(i).startPos, startTransition.at(i).endPos, tr->toXML());
-        } else kDebug() << "//MISSING TRANSITION AT: " << startTransition.at(i).startPos.frames(25);
+        } else kDebug() << "//MISSING TRANSITION AT: " << startTransition.at(i).startPos.frames(25);
     }
     groupSelectedItems(true);
     if (m_selectionGroup) {
@@ -3130,7 +3181,7 @@ void CustomTrackView::moveGroup(QList <ItemInfo> startClip, QList <ItemInfo> sta
                 else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer();
                 else prod = clip->baseClip()->producer(info.track);
                 m_document->renderer()->mltInsertClip(info, clip->xml(), prod);
-                kDebug() << "// inserting new clp: " << info.startPos.frames(25);
+                kDebug() << "// inserting new clp: " << info.startPos.frames(25);
             } else if (item->type() == TRANSITIONWIDGET) {
                 Transition *tr = static_cast <Transition*>(item);
                 int newTrack = tr->transitionEndTrack();
@@ -3145,7 +3196,7 @@ void CustomTrackView::moveGroup(QList <ItemInfo> startClip, QList <ItemInfo> sta
             }
         }
         KdenliveSettings::setSnaptopoints(snap);
-    } else kDebug() << "///////// WARNING; NO GROUP TO MOVE";
+    } else kDebug() << "///////// WARNING; NO GROUP TO MOVE";
 }
 
 void CustomTrackView::moveTransition(const ItemInfo start, const ItemInfo end)
@@ -3153,13 +3204,13 @@ void CustomTrackView::moveTransition(const ItemInfo start, const ItemInfo end)
     Transition *item = getTransitionItemAt(start.startPos, start.track);
     if (!item) {
         emit displayMessage(i18n("Cannot move transition at time: %1 on track %2", m_document->timecode().getTimecodeFromFrames(start.startPos.frames(m_document->fps())), start.track), ErrorMessage);
-        kDebug() << "----------------  ERROR, CANNOT find transition to move... ";// << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2;
+        kDebug() << "----------------  ERROR, CANNOT find transition to move... ";// << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2;
         return;
     }
-    //kDebug() << "----------------  Move TRANSITION FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << oldtrack << " TO " << newtrack;
+    //kDebug() << "----------------  Move TRANSITION FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << oldtrack << " TO " << newtrack;
     bool snap = KdenliveSettings::snaptopoints();
     KdenliveSettings::setSnaptopoints(false);
-    //kDebug()<<"///  RESIZE TRANS START: ("<< startPos.x()<<"x"<< startPos.y()<<") / ("<<endPos.x()<<"x"<< endPos.y()<<")";
+    //kDebug()<<"///  RESIZE TRANS START: ("<< startPos.x()<<"x"<< startPos.y()<<") / ("<<endPos.x()<<"x"<< endPos.y()<<")";
     if (end.endPos - end.startPos == start.endPos - start.startPos) {
         // Transition was moved
         item->setPos((int) end.startPos.frames(m_document->fps()), (end.track) * m_tracksHeight + 1);
@@ -3191,7 +3242,7 @@ void CustomTrackView::resizeClip(const ItemInfo start, const ItemInfo end)
     ClipItem *item = getClipItemAt((int)(start.startPos.frames(m_document->fps())), start.track);
     if (!item) {
         emit displayMessage(i18n("Cannot move clip at time: %1 on track %2", m_document->timecode().getTimecodeFromFrames(start.startPos.frames(m_document->fps())), start.track), ErrorMessage);
-        kDebug() << "----------------  ERROR, CANNOT find clip to resize at... "; // << startPos;
+        kDebug() << "----------------  ERROR, CANNOT find clip to resize at... "; // << startPos;
         return;
     }
     if (item->parentItem()) {
@@ -3470,6 +3521,16 @@ bool sortGuidesList(const Guide *g1 , const Guide *g2)
     return (*g1).position() < (*g2).position();
 }
 
+int CustomTrackView::hasGuide(int pos, int offset)
+{
+    for (int i = 0; i < m_guides.count(); i++) {
+        int guidePos = m_guides.at(i)->position().frames(m_document->fps());
+        if (qAbs(guidePos - pos) <= offset) return guidePos;
+        else if (guidePos > pos) return -1;
+    }
+    return -1;
+}
+
 void CustomTrackView::editGuide(const GenTime oldPos, const GenTime pos, const QString &comment)
 {
     if (oldPos > GenTime() && pos > GenTime()) {
@@ -3525,9 +3586,11 @@ void CustomTrackView::slotAddGuide()
     }
 }
 
-void CustomTrackView::slotEditGuide()
+void CustomTrackView::slotEditGuide(int guidePos)
 {
-    GenTime pos = GenTime(m_cursorPos, m_document->fps());
+    GenTime pos;
+    if (guidePos == -1) pos = GenTime(m_cursorPos, m_document->fps());
+    else pos = GenTime(guidePos, m_document->fps());
     bool found = false;
     for (int i = 0; i < m_guides.count(); i++) {
         if (m_guides.at(i)->position() == pos) {
@@ -3549,9 +3612,22 @@ void CustomTrackView::slotEditGuide(CommentedTime guide)
 }
 
 
-void CustomTrackView::slotDeleteGuide()
+void CustomTrackView::slotEditTimeLineGuide()
 {
-    GenTime pos = GenTime(m_cursorPos, m_document->fps());
+    if (m_dragGuide == NULL) return;
+    CommentedTime guide = m_dragGuide->info();
+    MarkerDialog d(NULL, guide, m_document->timecode(), i18n("Edit Guide"), this);
+    if (d.exec() == QDialog::Accepted) {
+        EditGuideCommand *command = new EditGuideCommand(this, guide.time(), guide.comment(), d.newMarker().time(), d.newMarker().comment(), true);
+        m_commandStack->push(command);
+    }
+}
+
+void CustomTrackView::slotDeleteGuide(int guidePos)
+{
+    GenTime pos;
+    if (guidePos == -1) pos = GenTime(m_cursorPos, m_document->fps());
+    else pos = GenTime(guidePos, m_document->fps());
     bool found = false;
     for (int i = 0; i < m_guides.count(); i++) {
         if (m_guides.at(i)->position() == pos) {
@@ -3564,6 +3640,15 @@ void CustomTrackView::slotDeleteGuide()
     if (!found) emit displayMessage(i18n("No guide at cursor time"), ErrorMessage);
 }
 
+
+void CustomTrackView::slotDeleteTimeLineGuide()
+{
+    if (m_dragGuide == NULL) return;
+    EditGuideCommand *command = new EditGuideCommand(this, m_dragGuide->position(), m_dragGuide->label(), GenTime(), QString(), true);
+    m_commandStack->push(command);
+}
+
+
 void CustomTrackView::slotDeleteAllGuides()
 {
     QUndoCommand *deleteAll = new QUndoCommand();
@@ -4089,6 +4174,11 @@ void CustomTrackView::slotChangeTrack(int ix)
     view.track_nb->setValue(ix);
     d.setWindowTitle(i18n("Change Track Type"));
 
+    if (m_document->trackInfoAt(m_document->tracksCount() - ix - 1).type == VIDEOTRACK)
+        view.video_track->setChecked(true);
+    else
+        view.audio_track->setChecked(true);
+
     if (d.exec() == QDialog::Accepted) {
         TrackInfo info;
         info.isLocked = false;
@@ -4316,13 +4406,13 @@ void CustomTrackView::doSplitAudio(const GenTime &pos, int track, bool split)
     } else {
         // unsplit clip: remove audio part and change video part to normal clip
         if (clip->parentItem() == NULL || clip->parentItem()->type() != GROUPWIDGET) {
-            kDebug() << "//CANNOT FIND CLP GRP";
+            kDebug() << "//CANNOT FIND CLP GRP";
             return;
         }
         AbstractGroupItem *grp = static_cast <AbstractGroupItem *>(clip->parentItem());
         QList<QGraphicsItem *> children = grp->childItems();
         if (children.count() != 2) {
-            kDebug() << "//SOMETHING IS WRONG WITH CLP GRP";
+            kDebug() << "//SOMETHING IS WRONG WITH CLP GRP";
             return;
         }
         for (int i = 0; i < children.count(); i++) {
@@ -4335,6 +4425,7 @@ void CustomTrackView::doSplitAudio(const GenTime &pos, int track, bool split)
                 break;
             }
         }
+        clip->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
         m_document->clipManager()->removeGroup(grp);
         scene()->destroyItemGroup(grp);
     }
@@ -4461,5 +4552,53 @@ void CustomTrackView::updateClipTypeActions(ClipItem *clip)
     }
 }
 
+void CustomTrackView::reloadTransitionLumas()
+{
+    QString lumaNames;
+    QString lumaFiles;
+    QDomElement lumaTransition = MainWindow::transitions.getEffectByTag("luma", "luma");
+    QDomNodeList params = lumaTransition.elementsByTagName("parameter");
+    for (int i = 0; i < params.count(); i++) {
+        QDomElement e = params.item(i).toElement();
+        if (e.attribute("tag") == "resource") {
+            lumaNames = e.attribute("paramlistdisplay");
+            lumaFiles = e.attribute("paramlist");
+            break;
+        }
+    }
+  
+    QList<QGraphicsItem *> itemList = items();
+    Transition *transitionitem;
+    QDomElement transitionXml;
+    for (int i = 0; i < itemList.count(); i++) {
+        if (itemList.at(i)->type() == TRANSITIONWIDGET) {
+            transitionitem = static_cast <Transition*> (itemList.at(i));
+           transitionXml = transitionitem->toXML();
+           if (transitionXml.attribute("id") == "luma" && transitionXml.attribute("tag") == "luma") {
+               QDomNodeList params = transitionXml.elementsByTagName("parameter");
+               for (int i = 0; i < params.count(); i++) {
+                   QDomElement e = params.item(i).toElement();
+                   if (e.attribute("tag") == "resource") {
+                       e.setAttribute("paramlistdisplay", lumaNames);
+                       e.setAttribute("paramlist", lumaFiles);
+                       break;
+                   }
+               }
+           }
+           if (transitionXml.attribute("id") == "composite" && transitionXml.attribute("tag") == "composite") {
+               QDomNodeList params = transitionXml.elementsByTagName("parameter");
+               for (int i = 0; i < params.count(); i++) {
+                   QDomElement e = params.item(i).toElement();
+                   if (e.attribute("tag") == "luma") {
+                       e.setAttribute("paramlistdisplay", lumaNames);
+                       e.setAttribute("paramlist", lumaFiles);
+                       break;
+                   }
+               }
+           }
+        }
+    }
+    emit transitionItemSelected(NULL);
+}
 
 #include "customtrackview.moc"