clipInfo.endPos = clipInfo.startPos + d.duration();
clipInfo.track = item->track();
MoveTransitionCommand *command = new MoveTransitionCommand(this, startInfo, clipInfo, true);
+ updateTrackDuration(clipInfo.track, command);
m_commandStack->push(command);
} else {
// move and resize clip
clipInfo.cropStart = d.cropStart();
new ResizeClipCommand(this, startInfo, clipInfo, true, false, moveCommand);
}
+ updateTrackDuration(clipInfo.track, moveCommand);
m_commandStack->push(moveCommand);
}
}
}
AddTimelineClipCommand *command = new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), pasteInfo, EffectsList(), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT, true, false);
+ updateTrackDuration(pasteInfo.track, command);
m_commandStack->push(command);
selectClip(true, false);
return;
}
EditTransitionCommand *command = new EditTransitionCommand(this, tr->track(), tr->startPos(), old, xml, false);
+ updateTrackDuration(tr->track(), command);
m_commandStack->push(command);
setDocumentModified();
}
adjustTimelineClips(m_scene->editMode(), item, ItemInfo(), addCommand);
new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT, false, false, addCommand);
+ updateTrackDuration(clipInfo.track, addCommand);
if (item->baseClip()->isTransparent() && getTransitionItemAtStart(info.startPos, info.track) == NULL) {
// add transparency transition
}
InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, GenTime(-length, m_document->fps()), true);
+ updateTrackDuration(track, command);
m_commandStack->push(command);
}
if (!clipsToMove.isEmpty() || !transitionsToMove.isEmpty()) {
InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, spaceDuration, true);
+ updateTrackDuration(track, command);
m_commandStack->push(command);
}
}
}
}
deleteCommand->setText(i18np("Delete timeline clip", "Delete timeline clips", count));
- if (count == 0) delete deleteCommand;
- else m_commandStack->push(deleteCommand);
+ if (count == 0) {
+ delete deleteCommand;
+ } else {
+ updateTrackDuration(-1, deleteCommand);
+ m_commandStack->push(deleteCommand);
+ }
}
void CustomTrackView::setCursorPos(int pos, bool seek)
}
if (!clipsToMove.isEmpty() || !transitionsToMove.isEmpty()) {
InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, timeOffset, false);
+ updateTrackDuration(track, command);
m_commandStack->push(command);
if (track != -1) track = m_document->tracksCount() - track;
kDebug() << "SPACER TRACK:" << track;
}
}
}
+ updateTrackDuration(info.track, moveCommand);
+ if (m_dragItemInfo.track != info.track)
+ updateTrackDuration(m_dragItemInfo.track, moveCommand);
m_commandStack->push(moveCommand);
//checkTrackSequence(m_dragItem->track());
} else {
moveCommand->setText(i18n("Move transition"));
adjustTimelineTransitions(m_scene->editMode(), transition, moveCommand);
new MoveTransitionCommand(this, m_dragItemInfo, info, false, moveCommand);
+ updateTrackDuration(info.track, moveCommand);
+ if (m_dragItemInfo.track != info.track)
+ updateTrackDuration(m_dragItemInfo.track, moveCommand);
m_commandStack->push(moveCommand);
setDocumentModified();
}
GenTime timeOffset = GenTime(m_dragItem->scenePos().x(), m_document->fps()) - m_dragItemInfo.startPos;
const int trackOffset = (int)(m_dragItem->scenePos().y() / m_tracksHeight) - m_dragItemInfo.track;
- //kDebug() << "// MOVED SEVERAL CLIPS" << timeOffset.frames(25);
+
QUndoCommand *moveGroup = new QUndoCommand();
moveGroup->setText(i18n("Move group"));
if (timeOffset != GenTime() || trackOffset != 0) {
}
}
new MoveGroupCommand(this, clipsToMove, transitionsToMove, timeOffset, trackOffset, false, moveGroup);
+ updateTrackDuration(-1, moveGroup);
m_commandStack->push(moveGroup);
//QPointF top = group->sceneBoundingRect().topLeft();
++itemcount;
}
}
+ updateTrackDuration(-1, resizeCommand);
m_commandStack->push(resizeCommand);
}
} else {
else if (transitionCount > 0 && groupCount == 0 && clipCount == 0)
deleteSelected->setText(i18np("Delete selected transition", "Delete selected transitions", transitionCount));
else deleteSelected->setText(i18n("Delete selected items"));
+ updateTrackDuration(-1, deleteSelected);
m_commandStack->push(deleteSelected);
}
emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(end.startPos.frames(m_document->fps()))), ErrorMessage);
}
if (refresh) m_document->renderer()->doRefresh();
- //kDebug() << " // MOVED CLIP TO: " << end.startPos.frames(25) << ", ITEM START: " << item->startPos().frames(25);
}
void CustomTrackView::moveGroup(QList <ItemInfo> startClip, QList <ItemInfo> startTransition, const GenTime offset, const int trackOffset, bool reverseMove)
{
// Group Items
- /*kDebug() << "//GRP MOVE, REVERS:" << reverseMove;
- kDebug() << "// GROUP MOV; OFFSET: " << offset.frames(25) << ", TK OFF: " << trackOffset;*/
resetSelectionGroup();
m_scene->clearSelection();
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;
ClipItem *clip = getClipItemAt(startClip.at(i).startPos, startClip.at(i).track);
if (clip) {
clip->setItemLocked(false);
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;
+
bool snap = KdenliveSettings::snaptopoints();
KdenliveSettings::setSnaptopoints(false);
- //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);
bool snap = KdenliveSettings::snaptopoints();
KdenliveSettings::setSnaptopoints(false);
+
if (resizeClipStart) {
ItemInfo clipinfo = item->info();
clipinfo.track = m_document->tracksCount() - clipinfo.track;
if (item->parentItem() && item->parentItem() != m_selectionGroup)
new RebuildGroupCommand(this, item->info().track, item->startPos(), command);
- if (!hasParentCommand)
+ if (!hasParentCommand) {
+ updateTrackDuration(oldInfo.track, command);
m_commandStack->push(command);
+ }
}
void CustomTrackView::updatePositionEffects(ClipItem * item, ItemInfo info)
} else emit displayMessage(i18n("Cannot paste transition to selected place"), ErrorMessage);
}
}
+ updateTrackDuration(-1, pasteClips);
m_commandStack->push(pasteClips);
}
}
}
-
for (int i = 0; i < clips.count(); ++i) {
if (clips.at(i)->type() == AVWIDGET) {
ClipItem *item = static_cast < ClipItem *>(clips.at(i));
if (d.before_select->currentIndex() == 1)
ix++;
TrackInfo info;
+ info.duration = 0;
info.isMute = false;
info.isLocked = false;
if (d.video_track->isChecked()) {
}
}
}
- if (splitCommand->childCount() > 0)
+ if (splitCommand->childCount()) {
+ updateTrackDuration(-1, splitCommand);
m_commandStack->push(splitCommand);
+ }
}
void CustomTrackView::doSplitAudio(const GenTime &pos, int track, bool split)
return;
for (; freetrack > 0; freetrack--) {
- kDebug() << "// CHK DOC TRK:" << freetrack << ", DUR:" << m_document->renderer()->mltTrackDuration(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) {
- kDebug() << "// CHK DOC TRK:" << freetrack << ", DUR:" << m_document->renderer()->mltTrackDuration(freetrack);
+ //kDebug() << "// CHK DOC TRK:" << freetrack << ", DUR:" << m_document->renderer()->mltTrackDuration(freetrack);
if (m_document->renderer()->mltTrackDuration(freetrack) < start || m_document->renderer()->mltGetSpaceLength(pos, freetrack, false) >= clip->cropDuration().frames(m_document->fps())) {
- kDebug() << "FOUND SPACE ON TRK: " << freetrack;
+ //kDebug() << "FOUND SPACE ON TRK: " << freetrack;
break;
}
}
addCommand->setText(i18n("Insert clip"));
adjustTimelineClips(OVERWRITEEDIT, NULL, info, addCommand);
new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), info, EffectsList(), true, false, true, false, addCommand);
+ updateTrackDuration(info.track, addCommand);
m_commandStack->push(addCommand);
selectClip(true, false, m_selectedTrack, in);
}
}
}
-
emit tracksChanged();
}
+void CustomTrackView::updateTrackDuration(int track, QUndoCommand *command)
+{
+ Q_UNUSED(command);
+
+ QList<int> tracks;
+ if (track >= 0) {
+ tracks << m_document->tracksCount() - track - 1;
+ } else {
+ // negative track number -> update all tracks
+ for (int i = 0; i < m_document->tracksCount(); ++i)
+ tracks << i;
+ }
+ int t, duration;
+ for (int i = 0; i < tracks.count(); ++i) {
+ t = tracks.at(i);
+ // t + 1 because of black background track
+ duration = m_document->renderer()->mltTrackDuration(t + 1);
+ if (duration != m_document->trackDuration(t)) {
+ m_document->setTrackDuration(t, duration);
+
+ // update effects
+ EffectsList effects = m_document->getTrackEffects(t);
+ for (int j = 0; j < effects.count(); ++j) {
+ /* TODO
+ * - lookout for keyframable parameters and update them so all keyframes are in the new range (0 - duration)
+ * - update the effectstack if necessary
+ */
+ }
+ }
+ }
+}
+
+