X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcustomtrackview.cpp;h=1904cd76880447d038f29b48a411fc9e03489478;hb=c81ea474e3884d36d6b860775e56257dbc156f64;hp=d8a432acbecbc586c0c5252fc7d73f80d9866d20;hpb=1fbb8258f8389fa02aed16a1f7877d32240f52ab;p=kdenlive diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index d8a432ac..1904cd76 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -572,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(); @@ -583,14 +595,6 @@ 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 collisionList = items(m_clickEvent); @@ -614,31 +618,35 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) return; } - if (event->button() == Qt::LeftButton && 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 (collisionList.at(ct)); m_dragItemInfo = m_dragItem->info(); if (m_dragItem->parentItem() && m_dragItem->parentItem()->type() == GROUPWIDGET && m_dragItem->parentItem() != m_selectionGroup) { - //kDebug()<<"// KLIK FOUND GRP: "<sceneBoundingRect(); + // kDebug()<<"// KLIK FOUND GRP: "<sceneBoundingRect(); dragGroup = static_cast (m_dragItem->parentItem()); } break; @@ -654,7 +662,6 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) // context menu requested if (event->button() == Qt::RightButton) { - m_dragGuide = NULL; if (m_dragItem) { if (dragGroup) dragGroup->setSelected(true); else if (!m_dragItem->isSelected()) { @@ -662,16 +669,23 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) m_scene->clearSelection(); m_dragItem->setSelected(true); } - } - - // check if there is a guide close to mouse click - QList guidesCollisionList = items(event->pos().x() - 5, event->pos().y(), 10, 1); - for (int i = 0; i < guidesCollisionList.count(); i++) { - if (guidesCollisionList.at(0)->type() != GUIDEITEM) + } else if (!m_dragGuide) { + // check if there is a guide close to mouse click + QList 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 (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 (guidesCollisionList.at(0));*/ } - if (!guidesCollisionList.isEmpty()) - m_dragGuide = static_cast (guidesCollisionList.at(0)); + m_operationMode = NONE; displayContextMenu(event->globalPos(), m_dragItem, dragGroup); m_menuPosition = m_clickEvent; @@ -685,7 +699,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) resetSelectionGroup(); setCursor(Qt::ArrowCursor); m_scene->clearSelection(); - event->accept(); + //event->accept(); emit clipItemSelected(NULL); updateClipTypeActions(NULL); if (m_tool == SPACERTOOL) { @@ -713,6 +727,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) groupSelectedItems(true); m_operationMode = SPACER; } else setCursorPos((int)(mapToScene(event->x(), 0).x())); + QGraphicsView::mousePressEvent(event); kDebug() << "END mousePress EVENT "; return; } @@ -768,12 +783,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; @@ -792,6 +806,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())); @@ -838,7 +855,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 @@ -999,7 +1016,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; @@ -1008,7 +1025,7 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event) } else { getClipAvailableSpace(m_dragItem, minimum, maximum); } - //kDebug()<<"// GOT MOVE POS: "<type() == TRANSITIONWIDGET) { @@ -1028,13 +1045,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(); @@ -1100,7 +1125,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()); @@ -1128,7 +1153,7 @@ void CustomTrackView::dragEnterEvent(QDragEnterEvent * event) QList 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(); @@ -1145,7 +1170,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); } @@ -1213,7 +1238,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; } @@ -1236,7 +1261,15 @@ void CustomTrackView::slotAddGroupEffect(QDomElement effect, AbstractGroupItem * int count = 0; for (int i = 0; i < itemList.count(); i++) { if (itemList.at(i)->type() == AVWIDGET) { - ClipItem *item = (ClipItem *)itemList.at(i); + ClipItem *item = static_cast (itemList.at(i)); + if (effect.attribute("type") == "audio") { + // Don't add audio effects on video clips + if (item->isVideoOnly() || (item->clipType() != AUDIO && item->clipType() != AV && item->clipType() != PLAYLIST)) continue; + } else if (effect.hasAttribute("type") == false) { + // Don't add video effect on audio clips + if (item->isAudioOnly() || item->clipType() == AUDIO) continue; + } + if (item->hasEffect(effect.attribute("tag"), effect.attribute("id")) != -1 && effect.attribute("unique", "0") != "0") { emit displayMessage(i18n("Effect already present in clip"), ErrorMessage); continue; @@ -1276,10 +1309,17 @@ 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); + if (effect.attribute("type") == "audio") { + // Don't add audio effects on video clips + if (item->isVideoOnly() || (item->clipType() != AUDIO && item->clipType() != AV && item->clipType() != PLAYLIST)) continue; + } else if (effect.hasAttribute("type") == false) { + // Don't add video effect on audio clips + if (item->isAudioOnly() || item->clipType() == AUDIO) continue; + } if (item->hasEffect(effect.attribute("tag"), effect.attribute("id")) != -1 && effect.attribute("unique", "0") != "0") { emit displayMessage(i18n("Effect already present in clip"), ErrorMessage); continue; @@ -1523,6 +1563,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; @@ -1609,7 +1650,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); @@ -1623,9 +1664,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: "<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, getPreviousVideoTrack(info.track), p, true); + } m_document->setModified(true); } @@ -1660,6 +1711,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 (items.at(i)); if (!hasVideoClip && (item->clipType() == AV || item->clipType() == VIDEO)) hasVideoClip = true; @@ -1668,8 +1722,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(); @@ -1678,25 +1732,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(); } @@ -1805,7 +1853,7 @@ void CustomTrackView::removeTrack(int ix) m_document->renderer()->mltDeleteTrack(m_document->tracksCount() - ix); m_document->deleteTrack(m_document->tracksCount() - ix - 1); - double startY = ix * m_tracksHeight + 1 + m_tracksHeight / 2; + double startY = ix * (m_tracksHeight + 1) + m_tracksHeight / 2; QRectF r(0, startY, sceneRect().width(), sceneRect().height() - startY); QList selection = m_scene->items(r); @@ -1831,7 +1879,6 @@ void CustomTrackView::removeTrack(int ix) ClipItem *clip = static_cast (children.at(i)); clip->updateItem(); ItemInfo clipinfo = clip->info(); - kDebug() << "// CLIP TRK IS: " << clipinfo.track; // We add a move clip command so that we get the correct producer for new track number if (clip->clipType() == AV || clip->clipType() == AUDIO) { Mlt::Producer *prod; @@ -2159,6 +2206,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) 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; @@ -2212,7 +2260,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); @@ -2244,6 +2292,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); @@ -2253,6 +2302,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; @@ -2432,7 +2482,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; @@ -2493,7 +2543,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; @@ -2554,7 +2604,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) { @@ -2593,7 +2643,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) { @@ -2644,8 +2694,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 (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 (m_dragItem), getPreviousVideoTrack(m_dragItem->track()), p); + } else emit transitionItemSelected(NULL); if (m_operationMode != NONE && m_operationMode != MOVE) m_document->setModified(true); m_operationMode = NONE; } @@ -2662,7 +2721,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()) { @@ -2670,7 +2729,7 @@ void CustomTrackView::deleteClip(ItemInfo info) scene()->removeItem(tr); delete tr; } - } + }*/ scene()->removeItem(item); if (m_dragItem == item) m_dragItem = NULL; delete item; @@ -2714,7 +2773,6 @@ void CustomTrackView::deleteSelectedClips() } } - for (int i = 0; i < itemList.count(); i++) { if (itemList.at(i)->type() == AVWIDGET) { ClipItem *item = static_cast (itemList.at(i)); @@ -2724,11 +2782,7 @@ void CustomTrackView::deleteSelectedClips() } else if (itemList.at(i)->type() == TRANSITIONWIDGET) { Transition *item = static_cast (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); } } @@ -2896,18 +2950,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; @@ -2931,10 +2973,11 @@ void CustomTrackView::slotUpdateClip(const QString &clipId) if (list.at(i)->type() == AVWIDGET) { clip = static_cast (list.at(i)); if (clip->clipProducer() == clipId) { - clip->refreshClip(true); ItemInfo info = clip->info(); info.track = m_document->tracksCount() - clip->track(); m_document->renderer()->mltUpdateClip(info, clip->xml(), clip->baseClip()->producer()); + clip->refreshClip(true); + clip->update(); } } } @@ -3041,7 +3084,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; @@ -3094,14 +3137,14 @@ void CustomTrackView::moveGroup(QList startClip, QList sta startClip[i].startPos = startClip.at(i).startPos - offset; startClip[i].track = startClip.at(i).track - trackOffset; } - //kDebug()<<"//LKING FR CLIP AT:"<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) { @@ -3114,7 +3157,7 @@ void CustomTrackView::moveGroup(QList startClip, QList 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) { @@ -3154,7 +3197,7 @@ void CustomTrackView::moveGroup(QList startClip, QList 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 (item); int newTrack = tr->transitionEndTrack(); @@ -3169,7 +3212,7 @@ void CustomTrackView::moveGroup(QList startClip, QList 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) @@ -3177,13 +3220,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()<<") / ("<setPos((int) end.startPos.frames(m_document->fps()), (end.track) * m_tracksHeight + 1); @@ -3203,7 +3246,16 @@ void CustomTrackView::moveTransition(const ItemInfo start, const ItemInfo end) KdenliveSettings::setSnaptopoints(snap); item->updateTransitionEndTrack(getPreviousVideoTrack(end.track)); m_document->renderer()->mltMoveTransition(item->transitionTag(), m_document->tracksCount() - start.track, m_document->tracksCount() - end.track, item->transitionEndTrack(), start.startPos, start.endPos, end.startPos, end.endPos); - if (m_dragItem && m_dragItem == item) emit transitionItemSelected(item); + if (m_dragItem && m_dragItem == item) { + QPoint p; + ClipItem *transitionClip = getClipItemAt(item->startPos(), item->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, getPreviousVideoTrack(item->track()), p); + } } void CustomTrackView::resizeClip(const ItemInfo start, const ItemInfo end) @@ -3215,7 +3267,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()) { @@ -3498,7 +3550,7 @@ 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; + if (qAbs(guidePos - pos) <= offset) return guidePos; else if (guidePos > pos) return -1; } return -1; @@ -4147,6 +4199,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; @@ -4191,6 +4248,7 @@ void CustomTrackView::deleteTimelineTrack(int ix, TrackInfo trackinfo) } } + selection = m_scene->items(); new AddTrackCommand(this, ix, trackinfo, false, deleteTrack); m_commandStack->push(deleteTrack); } @@ -4374,13 +4432,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 (clip->parentItem()); QList 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++) { @@ -4393,6 +4451,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); } @@ -4497,6 +4556,7 @@ void CustomTrackView::doChangeClipType(const GenTime &pos, int track, bool video m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->producer(track)); } clip->update(); + m_document->setModified(true); } void CustomTrackView::updateClipTypeActions(ClipItem *clip) @@ -4519,5 +4579,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 itemList = items(); + Transition *transitionitem; + QDomElement transitionXml; + for (int i = 0; i < itemList.count(); i++) { + if (itemList.at(i)->type() == TRANSITIONWIDGET) { + transitionitem = static_cast (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"