m_dragItem->resizeStart((int)(snappedPos));
} else if (m_operationMode == RESIZEEND && move) {
m_document->renderer()->pause();
- m_dragItem->resizeEnd((int)(snappedPos));
+ if (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()));
+ } else {
+ m_dragItem->resizeEnd((int)(snappedPos));
+ }
} 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) {
getTransitionAvailableSpace(item, minimum, maximum);
else
getClipAvailableSpace(item, minimum, maximum);
- //kDebug()<<"// GOT MOVE POS: "<<minimum.frames(25)<<" - "<<maximum.frames(25);
+
ClipDurationDialog d(item, m_document->timecode(), minimum, maximum, this);
if (d.exec() == QDialog::Accepted) {
ItemInfo clipInfo = item->info();
prepareResizeClipStart(m_dragItem, m_dragItemInfo, m_dragItem->startPos().frames(m_document->fps()));
} else if (m_operationMode == RESIZEEND && m_dragItem->endPos() != m_dragItemInfo.endPos) {
// resize end
- prepareResizeClipEnd(m_dragItem, m_dragItemInfo, m_dragItem->endPos().frames(m_document->fps()));
+ if (m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
+ AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(m_dragItem->parentItem());
+ if (parent) {
+ QUndoCommand *resizeCommand = new QUndoCommand();
+ resizeCommand->setText(i18n("Resize group"));
+ QList <QGraphicsItem *> items = parent->childItems();
+ QList <ItemInfo> infos = parent->resizeInfos();
+ parent->clearResizeInfos();
+ int itemcount = 0;
+ for (int i = 0; i < items.count(); ++i) {
+ AbstractClipItem *item = static_cast<AbstractClipItem *>(items.at(i));
+ if (item && item->type() == AVWIDGET) {
+ ItemInfo info = infos.at(itemcount);
+ prepareResizeClipEnd(item, info, item->endPos().frames(m_document->fps()), false, resizeCommand);
+ ++itemcount;
+ }
+ }
+ m_commandStack->push(resizeCommand);
+ }
+ } else {
+ prepareResizeClipEnd(m_dragItem, m_dragItemInfo, m_dragItem->endPos().frames(m_document->fps()));
+ }
} else if (m_operationMode == FADEIN) {
// resize fade in effect
ClipItem * item = static_cast <ClipItem *>(m_dragItem);
setDocumentModified();
}
-void CustomTrackView::prepareResizeClipStart(AbstractClipItem* item, ItemInfo oldInfo, int pos, bool check)
+void CustomTrackView::prepareResizeClipStart(AbstractClipItem* item, ItemInfo oldInfo, int pos, bool check, QUndoCommand *command)
{
if (pos == oldInfo.startPos.frames(m_document->fps()))
return;
resizeinfo.track = m_document->tracksCount() - resizeinfo.track;
bool success = m_document->renderer()->mltResizeClipStart(resizeinfo, item->startPos() - oldInfo.startPos);
if (success) {
- QUndoCommand *resizeCommand = new QUndoCommand();
- resizeCommand->setText(i18n("Resize clip"));
+ bool hasParentCommand = false;
+ if (command) {
+ hasParentCommand = true;
+ } else {
+ command = new QUndoCommand();
+ command->setText(i18n("Resize clip start"));
+ }
// Check if there is an automatic transition on that clip (lower track)
Transition *transition = getTransitionItemAtStart(oldInfo.startPos, oldInfo.track);
ItemInfo newTrInfo = trInfo;
newTrInfo.startPos = item->startPos();
if (newTrInfo.startPos < newTrInfo.endPos)
- new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, command);
}
// Check if there is an automatic transition on that clip (upper track)
transition = getTransitionItemAtStart(oldInfo.startPos, oldInfo.track - 1);
newTrInfo.startPos = item->startPos();
ClipItem * upperClip = getClipItemAt(oldInfo.startPos, oldInfo.track - 1);
if ((!upperClip || !upperClip->baseClip()->isTransparent()) && newTrInfo.startPos < newTrInfo.endPos)
- new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, command);
}
ClipItem *clip = static_cast < ClipItem * >(item);
// put a resize command before & after checking keyframes so that
// we are sure the resize is performed before whenever we do or undo the action
- new ResizeClipCommand(this, oldInfo, info, false, true, resizeCommand);
+ new ResizeClipCommand(this, oldInfo, info, false, true, command);
for (int i = 0; i < indexes.count(); i++) {
- new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effs.at(i).cloneNode().toElement(), clip->effectAt(indexes.at(i)), indexes.at(i), false, resizeCommand);
+ new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effs.at(i).cloneNode().toElement(), clip->effectAt(indexes.at(i)), indexes.at(i), false, command);
updateEffect(m_document->tracksCount() - clip->track(), clip->startPos(), clip->effectAt(indexes.at(i)), indexes.at(i));
}
- new ResizeClipCommand(this, oldInfo, info, false, true, resizeCommand);
+ new ResizeClipCommand(this, oldInfo, info, false, true, command);
emit clipItemSelected(clip);
} else {
- new ResizeClipCommand(this, oldInfo, info, false, false, resizeCommand);
+ new ResizeClipCommand(this, oldInfo, info, false, false, command);
}
- m_commandStack->push(resizeCommand);
+ if (!hasParentCommand)
+ m_commandStack->push(command);
} else {
KdenliveSettings::setSnaptopoints(false);
item->resizeStart((int) oldInfo.startPos.frames(m_document->fps()));
KdenliveSettings::setSnaptopoints(snap);
emit displayMessage(i18n("Cannot resize transition"), ErrorMessage);
} else {
- MoveTransitionCommand *command = new MoveTransitionCommand(this, oldInfo, info, false);
- m_commandStack->push(command);
+ MoveTransitionCommand *moveCommand = new MoveTransitionCommand(this, oldInfo, info, false, command);
+ if (command == NULL)
+ m_commandStack->push(moveCommand);
}
}
rebuildGroup(static_cast <AbstractGroupItem *>(item->parentItem()));
}
-void CustomTrackView::prepareResizeClipEnd(AbstractClipItem* item, ItemInfo oldInfo, int pos, bool check)
+void CustomTrackView::prepareResizeClipEnd(AbstractClipItem* item, ItemInfo oldInfo, int pos, bool check, QUndoCommand *command)
{
if (pos == oldInfo.endPos.frames(m_document->fps()))
return;
resizeinfo.track = m_document->tracksCount() - resizeinfo.track;
bool success = m_document->renderer()->mltResizeClipEnd(resizeinfo, resizeinfo.endPos - resizeinfo.startPos);
if (success) {
- QUndoCommand *resizeCommand = new QUndoCommand();
- resizeCommand->setText(i18n("Resize clip"));
+ bool hasParentCommand = false;
+ if (command) {
+ hasParentCommand = true;
+ } else {
+ command = new QUndoCommand();
+ command->setText(i18n("Resize clip end"));
+ }
// Check if there is an automatic transition on that clip (lower track)
Transition *tr = getTransitionItemAtEnd(oldInfo.endPos, oldInfo.track);
ItemInfo newTrInfo = trInfo;
newTrInfo.endPos = item->endPos();
if (newTrInfo.endPos > newTrInfo.startPos)
- new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, command);
}
// Check if there is an automatic transition on that clip (upper track)
newTrInfo.endPos = item->endPos();
ClipItem * upperClip = getClipItemAtEnd(oldInfo.endPos, oldInfo.track - 1);
if ((!upperClip || !upperClip->baseClip()->isTransparent()) && newTrInfo.endPos > newTrInfo.startPos)
- new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, command);
}
// put a resize command before & after checking keyframes so that
// we are sure the resize is performed before whenever we do or undo the action
- new ResizeClipCommand(this, oldInfo, info, false, true, resizeCommand);
+ new ResizeClipCommand(this, oldInfo, info, false, true, command);
for (int i = 0; i < indexes.count(); i++) {
- new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effs.at(i).cloneNode().toElement(), clip->effectAt(indexes.at(i)), indexes.at(i), false, resizeCommand);
+ new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effs.at(i).cloneNode().toElement(), clip->effectAt(indexes.at(i)), indexes.at(i), false, command);
updateEffect(m_document->tracksCount() - clip->track(), clip->startPos(), clip->effectAt(indexes.at(i)), indexes.at(i));
}
- new ResizeClipCommand(this, oldInfo, info, false, true, resizeCommand);
+ new ResizeClipCommand(this, oldInfo, info, false, true, command);
emit clipItemSelected(clip);
} else {
- new ResizeClipCommand(this, oldInfo, info, false, false, resizeCommand);
+ new ResizeClipCommand(this, oldInfo, info, false, false, command);
}
- m_commandStack->push(resizeCommand);
+ if (!hasParentCommand)
+ m_commandStack->push(command);
updatePositionEffects(clip, oldInfo);
} else {
KdenliveSettings::setSnaptopoints(false);
KdenliveSettings::setSnaptopoints(true);
emit displayMessage(i18n("Cannot resize transition"), ErrorMessage);
} else {
- MoveTransitionCommand *command = new MoveTransitionCommand(this, oldInfo, info, false);
- m_commandStack->push(command);
+ MoveTransitionCommand *moveCommand = new MoveTransitionCommand(this, oldInfo, info, false, command);
+ if (command == NULL)
+ m_commandStack->push(moveCommand);
}
}
if (item->parentItem() && item->parentItem() != m_selectionGroup)