#include "configtrackscommand.h"
#include "rebuildgroupcommand.h"
#include "razorgroupcommand.h"
+#include "profilesdialog.h"
#include <KDebug>
#include <KLocale>
emit mousePosition(mappedXPos);
if (event->buttons() & Qt::MidButton) return;
- if (dragMode() == QGraphicsView::RubberBandDrag || (event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL)) {
+ if (dragMode() == QGraphicsView::RubberBandDrag || (event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL && m_operationMode != RESIZESTART && m_operationMode != RESIZEEND)) {
event->setAccepted(true);
m_moveOpMode = NONE;
QGraphicsView::mouseMoveEvent(event);
}
} else if (m_operationMode == RESIZESTART && move) {
m_document->renderer()->pause();
- if (m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
+ if (event->modifiers() != Qt::ControlModifier && m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(m_dragItem->parentItem());
if (parent)
parent->resizeStart((int)(snappedPos) - m_dragItemInfo.startPos.frames(m_document->fps()));
}
} else if (m_operationMode == RESIZEEND && move) {
m_document->renderer()->pause();
- if (m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
+ if (event->modifiers() != Qt::ControlModifier && m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
AbstractGroupItem *parent = static_cast <AbstractGroupItem *>(m_dragItem->parentItem());
if (parent)
parent->resizeEnd((int)(snappedPos) - m_dragItemInfo.endPos.frames(m_document->fps()));
}
} else if (opMode == RESIZESTART) {
setCursor(KCursor("left_side", Qt::SizeHorCursor));
+ if (item->type() == AVWIDGET && item->parentItem() && item->parentItem() != m_selectionGroup)
+ emit displayMessage(i18n("Use Ctrl to resize only current item, otherwise all items in this group will be resized at once."), InformationMessage);
} else if (opMode == RESIZEEND) {
setCursor(KCursor("right_side", Qt::SizeHorCursor));
+ if (item->type() == AVWIDGET && item->parentItem() && item->parentItem() != m_selectionGroup)
+ emit displayMessage(i18n("Use Ctrl to resize only current item, otherwise all items in this group will be resized at once."), InformationMessage);
} else if (opMode == FADEIN || opMode == FADEOUT) {
setCursor(Qt::PointingHandCursor);
emit displayMessage(i18n("Drag to add or resize a fade effect."), InformationMessage);
// Razor tool
if (m_tool == RAZORTOOL && m_dragItem) {
+ GenTime cutPos = GenTime((int)(mapToScene(event->pos()).x()), m_document->fps());
if (m_dragItem->type() == TRANSITIONWIDGET) {
emit displayMessage(i18n("Cannot cut a transition"), ErrorMessage);
- event->accept();
- m_dragItem = NULL;
- return;
- } else if (m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
- emit displayMessage(i18n("Cannot cut a clip in a group"), ErrorMessage);
- event->accept();
- m_dragItem = NULL;
- return;
+ } else {
+ m_document->renderer()->pause();
+ if (m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
+ razorGroup((AbstractGroupItem *)m_dragItem->parentItem(), cutPos);
+ } else {
+ AbstractClipItem *clip = static_cast <AbstractClipItem *>(m_dragItem);
+ RazorClipCommand* command = new RazorClipCommand(this, clip->info(), cutPos);
+ m_commandStack->push(command);
+ }
+ setDocumentModified();
}
- AbstractClipItem *clip = static_cast <AbstractClipItem *>(m_dragItem);
- RazorClipCommand* command = new RazorClipCommand(this, clip->info(), GenTime((int)(mapToScene(event->pos()).x()), m_document->fps()));
- m_document->renderer()->pause();
- m_commandStack->push(command);
- setDocumentModified();
m_dragItem = NULL;
event->accept();
return;
}
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 (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) {
if (event->modifiers() != Qt::ControlModifier) {
dragGroup = static_cast <AbstractGroupItem *>(m_dragItem->parentItem());
}
bool selected = !m_dragItem->isSelected();
- if (dragGroup) dragGroup->setSelected(selected);
- else m_dragItem->setSelected(selected);
+ if (dragGroup)
+ dragGroup->setSelected(selected);
+ else
+ m_dragItem->setSelected(selected);
groupSelectedItems();
ClipItem *clip = static_cast <ClipItem *>(m_dragItem);
if (m_dragItem && m_dragItem->type() == AVWIDGET && !m_dragItem->isItemLocked()) {
ClipItem *selected = static_cast <ClipItem*>(m_dragItem);
emit clipItemSelected(selected);
- } else emit clipItemSelected(NULL);
+ } else {
+ emit clipItemSelected(NULL);
+ }
}
// If clicked item is selected, allow move
// Update snap points
if (m_selectionGroup == NULL) {
- if (m_operationMode == RESIZEEND || m_operationMode == RESIZESTART) updateSnapPoints(NULL);
- else updateSnapPoints(m_dragItem);
+ if (m_operationMode == RESIZEEND || m_operationMode == RESIZESTART)
+ updateSnapPoints(NULL);
+ else
+ updateSnapPoints(m_dragItem);
} else {
QList <GenTime> offsetList;
QList<QGraphicsItem *> children = m_selectionGroup->childItems();
info.endPos = transitionClip->endPos();
} else {
GenTime transitionDuration(65, m_document->fps());
- if (m_dragItem->cropDuration() < transitionDuration) info.endPos = m_dragItem->endPos();
- else info.endPos = info.startPos + transitionDuration;
+ if (m_dragItem->cropDuration() < transitionDuration)
+ info.endPos = m_dragItem->endPos();
+ else
+ info.endPos = info.startPos + transitionDuration;
}
if (info.endPos == info.startPos) info.endPos = info.startPos + GenTime(65, m_document->fps());
// Check there is no other transition at that place
}
bool success = true;
for (int i = 0; i < clip->effectsCount(); i++) {
- if (!m_document->renderer()->mltAddEffect(track, pos, clip->getEffectArgs(clip->effectAt(i)), false)) success = false;
+ if (!m_document->renderer()->mltAddEffect(track, pos, getEffectArgs(clip->effectAt(i)), false)) success = false;
}
if (!success) emit displayMessage(i18n("Problem adding effect to clip"), ErrorMessage);
m_document->renderer()->doRefresh();
void CustomTrackView::addEffect(int track, GenTime pos, QDomElement effect)
{
+ if (pos < GenTime()) {
+ // Add track effect
+ m_document->addTrackEffect(m_document->tracksCount() - track, effect);
+ m_document->renderer()->mltAddTrackEffect(track, getEffectArgs(effect));
+ emit showTrackEffects(track, m_document->getTrackEffects(m_document->tracksCount() - track));
+ return;
+ }
ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track);
if (clip) {
// Special case: speed effect
void CustomTrackView::deleteEffect(int track, GenTime pos, QDomElement effect)
{
QString index = effect.attribute("kdenlive_ix");
+ if (pos < GenTime()) {
+ // Delete track effect
+ m_document->removeTrackEffect(m_document->tracksCount() - track, effect);
+ m_document->renderer()->mltRemoveTrackEffect(track, index, true);
+ emit showTrackEffects(track, m_document->getTrackEffects(m_document->tracksCount() - track));
+ return;
+ }
// Special case: speed effect
if (effect.attribute("id") == "speed") {
ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track);
} else delete effectCommand;
}
-void CustomTrackView::slotDeleteEffect(ClipItem *clip, QDomElement effect, bool affectGroup)
+void CustomTrackView::slotDeleteEffect(ClipItem *clip, int track, QDomElement effect, bool affectGroup)
{
+ if (clip == NULL) {
+ // delete track effect
+ AddEffectCommand *command = new AddEffectCommand(this, track, GenTime(-1), effect, false);
+ m_commandStack->push(command);
+ setDocumentModified();
+ return;
+ }
if (affectGroup && clip->parentItem() && clip->parentItem() == m_selectionGroup) {
//clip is in a group, also remove the effect in other clips of the group
QList<QGraphicsItem *> items = m_selectionGroup->childItems();
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
return;
}
- ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track);
QDomElement effect = insertedEffect.cloneNode().toElement();
+ if (pos < GenTime()) {
+ // editing a track effect
+ EffectsParameterList effectParams = getEffectArgs(effect);
+ if (effect.attribute("tag") == "ladspa") {
+ // Update the ladspa affect file
+ initEffects::ladspaEffectFile(effect.attribute("src"), effect.attribute("ladspaid").toInt(), getLadspaParams(effect));
+ }
+ // check if we are trying to reset a keyframe effect
+ if (effectParams.hasParam("keyframes") && effectParams.paramValue("keyframes").isEmpty()) {
+ //clip->initEffect(effect);
+ effectParams = getEffectArgs(effect);
+ }
+ if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - track, pos, effectParams))
+ emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
+ m_document->setTrackEffect(track, ix, effect);
+ return;
+
+ }
+ ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track);
if (clip) {
// Special case: speed effect
if (effect.attribute("id") == "speed") {
return;
}
- EffectsParameterList effectParams = clip->getEffectArgs(effect);
+ EffectsParameterList effectParams = getEffectArgs(effect);
if (effect.attribute("tag") == "ladspa") {
// Update the ladspa affect file
initEffects::ladspaEffectFile(effect.attribute("src"), effect.attribute("ladspaid").toInt(), getLadspaParams(effect));
// check if we are trying to reset a keyframe effect
if (effectParams.hasParam("keyframes") && effectParams.paramValue("keyframes").isEmpty()) {
clip->initEffect(effect);
- effectParams = clip->getEffectArgs(effect);
+ effectParams = getEffectArgs(effect);
}
if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - clip->track(), clip->startPos(), effectParams))
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
void CustomTrackView::moveEffect(int track, GenTime pos, int oldPos, int newPos)
{
+ if (pos < GenTime()) {
+ // Moving track effect
+ kDebug() << "MOVING EFFECT IN TK: " << track;
+ QDomElement act = m_document->getTrackEffect(track, newPos - 1);
+ QDomElement before = m_document->getTrackEffect(track, oldPos - 1);
+
+ if (!act.isNull() && !before.isNull()) {
+ m_document->setTrackEffect(track, oldPos - 1, act);
+ m_document->setTrackEffect(track, newPos - 1, before);
+ m_document->renderer()->mltMoveEffect(m_document->tracksCount() - track, pos, oldPos, newPos);
+ emit showTrackEffects(m_document->tracksCount() - track, m_document->getTrackEffects(track));
+ } else emit displayMessage(i18n("Cannot move effect"), ErrorMessage);
+ return;
+ }
ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track);
if (clip && !clip->effectAt(newPos - 1).isNull() && !clip->effectAt(oldPos - 1).isNull()) {
QDomElement act = clip->effectAt(newPos - 1);
} else emit displayMessage(i18n("Cannot move effect"), ErrorMessage);
}
-void CustomTrackView::slotChangeEffectState(ClipItem *clip, int effectPos, bool disable)
+void CustomTrackView::slotChangeEffectState(ClipItem *clip, int track, int effectPos, bool disable)
{
- QDomElement effect = clip->effectAt(effectPos);
+ EditEffectCommand *command;
+ QDomElement effect;
+ if (clip == NULL) effect = m_document->getTrackEffect(m_document->tracksCount() - track, effectPos);
+ else effect = clip->effectAt(effectPos);
QDomElement oldEffect = effect.cloneNode().toElement();
-
effect.setAttribute("disable", (int) disable);
- EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldEffect, effect, effectPos, true);
+
+
+ if (clip == NULL) {
+ // editing track effect
+ command = new EditEffectCommand(this, m_document->tracksCount() - track, GenTime(-1), oldEffect, effect, effectPos, true);
+ } else {
+ command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldEffect, effect, effectPos, true);
+ }
m_commandStack->push(command);
setDocumentModified();;
}
-void CustomTrackView::slotChangeEffectPosition(ClipItem *clip, int currentPos, int newPos)
+void CustomTrackView::slotChangeEffectPosition(ClipItem *clip, int track, int currentPos, int newPos)
{
- MoveEffectCommand *command = new MoveEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), currentPos, newPos);
+ MoveEffectCommand *command;
+ if (clip == NULL) {
+ // editing track effect
+ command = new MoveEffectCommand(this, m_document->tracksCount() - track, GenTime(-1), currentPos, newPos);
+ } else command = new MoveEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), currentPos, newPos);
m_commandStack->push(command);
setDocumentModified();
}
-void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, QDomElement oldeffect, QDomElement effect, int ix)
+void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, int track, QDomElement oldeffect, QDomElement effect, int ix)
{
- EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldeffect, effect, ix, true);
+ EditEffectCommand *command;
+ if (clip) command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldeffect, effect, ix, true);
+ else command = new EditEffectCommand(this, m_document->tracksCount() - track, GenTime(-1), oldeffect, effect, ix, true);
m_commandStack->push(command);
}
m_blockRefresh = false;
return NULL;
}
- if (item->parentItem()) {
- // Item is part of a group, reset group
- resetSelectionGroup();
- }
+
kDebug() << "///////// CUTTING CLIP : (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), INFO: (" << info.startPos.frames(25) << "-" << info.endPos.frames(25) << ")" << ", CUT: " << cutTime.frames(25);
if (execute) m_document->renderer()->mltCutClip(m_document->tracksCount() - info.track, cutTime);
trackTransitionStartList[m_document->tracksCount() - info.track] = info.startPos.frames(m_document->fps());
}
}
-
- 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;
- m_document->renderer()->mltInsertSpace(trackClipStartList, trackTransitionStartList, track, timeOffset, GenTime());
+ if (!clipsToMove.isEmpty() || !transitionsToMove.isEmpty()) {
+ 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;
+ m_document->renderer()->mltInsertSpace(trackClipStartList, trackTransitionStartList, track, timeOffset, GenTime());
+ setDocumentModified();
+ }
}
resetSelectionGroup(false);
m_operationMode = NONE;
if (m_dragItem->type() == AVWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) {
ClipItem *item = static_cast <ClipItem *>(m_dragItem);
Mlt::Producer *prod;
- if (item->isAudioOnly()) prod = item->baseClip()->audioProducer(m_dragItemInfo.track);
+ if (item->isAudioOnly()) prod = item->baseClip()->audioProducer(info.track);
else if (item->isVideoOnly()) prod = item->baseClip()->videoProducer();
- 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, m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT);
+ else prod = item->baseClip()->producer(info.track);
+ bool success = m_document->renderer()->mltMoveClip((int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - info.track), (int) m_dragItemInfo.startPos.frames(m_document->fps()), (int)(info.startPos.frames(m_document->fps())), prod, m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT);
if (success) {
QUndoCommand *moveCommand = new QUndoCommand();
adjustTimelineTransitions(m_scene->editMode(), transition, moveCommand);
new MoveTransitionCommand(this, m_dragItemInfo, info, false, moveCommand);
m_commandStack->push(moveCommand);
+ setDocumentModified();
}
}
} else {
prod = clip->baseClip()->producer(info.track);
m_document->renderer()->mltInsertClip(info, clip->xml(), prod, m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT);
for (int i = 0; i < clip->effectsCount(); i++) {
- m_document->renderer()->mltAddEffect(info.track, info.startPos, clip->getEffectArgs(clip->effectAt(i)), false);
+ m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(clip->effectAt(i)), false);
}
} else {
Transition *tr = static_cast <Transition*>(item);
m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
}
}
- rebuildGroup((AbstractGroupItem *)group);
new MoveGroupCommand(this, clipsToMove, transitionsToMove, timeOffset, trackOffset, false, moveGroup);
m_commandStack->push(moveGroup);
if (m_selectionGroup) {
m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps());
m_selectionGroupInfo.track = m_selectionGroup->track();
+ } else {
+ rebuildGroup((AbstractGroupItem *)group);
}
setDocumentModified();
}
m_document->renderer()->doRefresh();
} else if (m_operationMode == RESIZESTART && m_dragItem->startPos() != m_dragItemInfo.startPos) {
// resize start
- if (m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
+ if (event->modifiers() != Qt::ControlModifier && 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();
}
} else if (m_operationMode == RESIZEEND && m_dragItem->endPos() != m_dragItemInfo.endPos) {
// resize end
- if (m_dragItem->type() == AVWIDGET && m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
+ if (event->modifiers() != Qt::ControlModifier && 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();
int start = item->cropStart().frames(m_document->fps());
int end = item->fadeIn();
if (end == 0) {
- slotDeleteEffect(item, oldeffect, false);
+ slotDeleteEffect(item, -1, oldeffect, false);
} else {
end += start;
QDomElement effect = oldeffect.cloneNode().toElement();
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
- slotUpdateClipEffect(item, effect, oldeffect, ix);
+ slotUpdateClipEffect(item, -1, effect, oldeffect, ix);
emit clipItemSelected(item, ix);
}
} else if (item->fadeIn() != 0 && ix2 == -1) {
int start = item->cropStart().frames(m_document->fps());
int end = item->fadeIn();
if (end == 0) {
- slotDeleteEffect(item, oldeffect, false);
+ slotDeleteEffect(item, -1, oldeffect, false);
} else {
end += start;
QDomElement effect = oldeffect.cloneNode().toElement();
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
- slotUpdateClipEffect(item, effect, oldeffect, ix2);
+ slotUpdateClipEffect(item, -1, effect, oldeffect, ix2);
emit clipItemSelected(item, ix2);
}
}
int end = (item->cropDuration() + item->cropStart()).frames(m_document->fps());
int start = item->fadeOut();
if (start == 0) {
- slotDeleteEffect(item, oldeffect, false);
+ slotDeleteEffect(item, -1, oldeffect, false);
} else {
start = end - start;
QDomElement effect = oldeffect.cloneNode().toElement();
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
// kDebug()<<"EDIT FADE OUT : "<<start<<"x"<<end;
- slotUpdateClipEffect(item, effect, oldeffect, ix);
+ slotUpdateClipEffect(item, -1, effect, oldeffect, ix);
emit clipItemSelected(item, ix);
}
} else if (item->fadeOut() != 0 && ix2 == -1) {
int end = (item->cropDuration() + item->cropStart()).frames(m_document->fps());
int start = item->fadeOut();
if (start == 0) {
- slotDeleteEffect(item, oldeffect, false);
+ slotDeleteEffect(item, -1, oldeffect, false);
} else {
start = end - start;
QDomElement effect = oldeffect.cloneNode().toElement();
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
// kDebug()<<"EDIT FADE OUT : "<<start<<"x"<<end;
- slotUpdateClipEffect(item, effect, oldeffect, ix2);
+ slotUpdateClipEffect(item, -1, effect, oldeffect, ix2);
emit clipItemSelected(item, ix2);
}
}
}
info.track = m_document->tracksCount() - item->track();
int endPos;
- if (item->isVideoOnly()) endPos = m_document->renderer()->mltChangeClipSpeed(info, speedIndependantInfo, speed, oldspeed, strobe, baseclip->videoProducer());
- else if (item->isAudioOnly()) endPos = m_document->renderer()->mltChangeClipSpeed(info, speedIndependantInfo, speed, oldspeed, strobe, baseclip->audioProducer(item->track()));
- else endPos = m_document->renderer()->mltChangeClipSpeed(info, speedIndependantInfo, speed, oldspeed, strobe, baseclip->producer());
+ if (item->isVideoOnly())
+ endPos = m_document->renderer()->mltChangeClipSpeed(info, speedIndependantInfo, speed, oldspeed, strobe, baseclip->videoProducer());
+ else if (item->isAudioOnly())
+ endPos = m_document->renderer()->mltChangeClipSpeed(info, speedIndependantInfo, speed, oldspeed, strobe, baseclip->audioProducer(item->track()));
+ else
+ endPos = m_document->renderer()->mltChangeClipSpeed(info, speedIndependantInfo, speed, oldspeed, strobe, baseclip->producer());
if (endPos >= 0) {
item->setSpeed(speed, strobe);
item->updateRectGeometry();
{
QList<QGraphicsItem *> itemList = scene()->selectedItems();
GenTime currentPos = GenTime(m_cursorPos, m_document->fps());
- for (int i = 0; i < itemList.count(); i++) {
+ for (int i = 0; i < itemList.count(); ++i) {
+ if (!itemList.at(i))
+ continue;
if (itemList.at(i)->type() == AVWIDGET) {
ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
if (item->parentItem() && item->parentItem() != m_selectionGroup) {
+ // remove all group children from itemList so we do not attempt to cut them twice
+ QList <QGraphicsItem *> children = item->parentItem()->childItems();
+ QList <int> toRemove;
+ for (int j = 0; j < children.count(); ++j) {
+ for (int k = 0; k < itemList.count(); ++k) {
+ if (children.at(j)->pos() == itemList.at(k)->pos()
+ && children.at(j)->boundingRect() == itemList.at(k)->boundingRect()) {
+ toRemove.append(k);
+ }
+ }
+ }
+ for (int j = 0; j < toRemove.count(); ++j)
+ itemList.removeAt(toRemove.at(j));
+
razorGroup((AbstractGroupItem *)item->parentItem(), currentPos);
- return;
} else if (currentPos > item->startPos() && currentPos < item->endPos()) {
RazorClipCommand *command = new RazorClipCommand(this, item->info(), currentPos);
m_commandStack->push(command);
}
} else if (itemList.at(i)->type() == GROUPWIDGET && itemList.at(i) != m_selectionGroup) {
- razorGroup((AbstractGroupItem *)itemList.at(i), currentPos);
+ // remove all group children from itemList so we do not attempt to cut them twice
+ AbstractGroupItem *group = static_cast<AbstractGroupItem *>(itemList.at(i));
+
+ QList <QGraphicsItem *> children = itemList.at(i)->childItems();
+ QList <int> toRemove;
+ for (int j = 0; j < children.count(); ++j) {
+ for (int k = 0; k < itemList.count(); ++k) {
+ if (children.at(j)->pos() == itemList.at(k)->pos()
+ && children.at(j)->boundingRect() == itemList.at(k)->boundingRect()) {
+ toRemove.append(k);
+ }
+ }
+ }
+ for (int j = 0; j < toRemove.count(); ++j)
+ itemList.removeAt(toRemove.at(j));
+
+ razorGroup(group, currentPos);
}
}
}
{
if (group) {
QList <QGraphicsItem *> children = group->childItems();
- QList <ItemInfo> clips1;
- QList <ItemInfo> transitions1;
- QList <ItemInfo> clipsCut;
- QList <ItemInfo> transitionsCut;
- QList <ItemInfo> clips2;
- QList <ItemInfo> transitions2;
+ QList <ItemInfo> clips1, transitions1;
+ QList <ItemInfo> clipsCut, transitionsCut;
+ QList <ItemInfo> clips2, transitions2;
for (int i = 0; i < children.count(); ++i) {
children.at(i)->setSelected(false);
AbstractClipItem *child = static_cast <AbstractClipItem *>(children.at(i));
transitionsCut << child->info();
}
}
+ if (clipsCut.isEmpty() && transitionsCut.isEmpty() && ((clips1.isEmpty() && transitions1.isEmpty()) || (clips2.isEmpty() && transitions2.isEmpty())))
+ return;
RazorGroupCommand *command = new RazorGroupCommand(this, clips1, transitions1, clipsCut, transitionsCut, clips2, transitions2, cutPos);
m_commandStack->push(command);
}
if (clip) {
ClipItem *clipBehind = cutClip(clipsCut.at(i), cutPos, true);
clips1 << clip->info();
- clips2 << clipBehind->info();
+ if (clipBehind != NULL)
+ clips2 << clipBehind->info();
}
}
- // TODO: cut transitionsCut
+ /* TODO: cut transitionsCut
+ * For now just append them to group1 */
+ transitions1 << transitionsCut;
doGroupClips(clips1, transitions1, true);
doGroupClips(clips2, transitions2, true);
} else {
+ /* we might also just use clipsCut.at(0)->parentItem().
+ * Do this loop just in case something went wrong during cut */
for (int i = 0; i < clipsCut.count(); ++i) {
ClipItem *clip = getClipItemAt(cutPos.frames(m_document->fps()), clipsCut.at(i).track);
if (clip && clip->parentItem() && clip->parentItem()->type() == GROUPWIDGET) {
groupTrans << ((AbstractClipItem *)children.at(j))->info();
}
doGroupClips(groupClips, groupTrans, false);
+ break;
}
}
- for(int i = 0; i < clipsCut.count(); ++i)
+ for (int i = 0; i < clipsCut.count(); ++i)
cutClip(clipsCut.at(i), cutPos, false);
// TODO: uncut transitonsCut
doGroupClips(QList <ItemInfo>() << clips1 << clipsCut << clips2, QList <ItemInfo>() << transitions1 << transitionsCut << transitions2, true);
emit displayMessage(i18n("No clip copied"), ErrorMessage);
return;
}
+
+ if (baseclip->producer() == NULL) {
+ // If the clip has no producer, we must wait until it is created...
+ m_mutex.lock();
+ emit displayMessage(i18n("Waiting for clip..."), InformationMessage);
+ emit forceClipProcessing(clipId);
+ qApp->processEvents();
+ for (int i = 0; i < 3; i++) {
+ if (baseclip->producer() == NULL) {
+ m_producerNotReady.wait(&m_mutex, 500 + 500 * i);
+ } else break;
+ }
+ if (baseclip->producer() == NULL) {
+ emit displayMessage(i18n("Cannot insert clip..."), ErrorMessage);
+ m_mutex.unlock();
+ return;
+ }
+ emit displayMessage(QString(), InformationMessage);
+ m_mutex.unlock();
+ }
+
ClipItem *item = new ClipItem(baseclip, info, m_document->fps(), xml.attribute("speed", "1").toDouble(), xml.attribute("strobe", "1").toInt());
item->setEffectList(effects);
if (xml.hasAttribute("audio_only")) item->setAudioOnly(true);
else prod = baseclip->producer(info.track);
m_document->renderer()->mltInsertClip(info, xml, prod, overwrite, push);
for (int i = 0; i < item->effectsCount(); i++) {
- m_document->renderer()->mltAddEffect(info.track, info.startPos, item->getEffectArgs(item->effectAt(i)), false);
+ m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(item->effectAt(i)), false);
}
setDocumentModified();
if (refresh) m_document->renderer()->doRefresh();
m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
}
}
- if (!reverseMove)
- rebuildGroup(m_selectionGroup);
+
resetSelectionGroup(false);
+
+ for (int i = 0; i < children.count(); i++) {
+ if (children.at(i)->parentItem())
+ rebuildGroup((AbstractGroupItem*)children.at(i)->parentItem());
+ }
+
KdenliveSettings::setSnaptopoints(snap);
m_document->renderer()->doRefresh();
} else kDebug() << "///////// WARNING; NO GROUP TO MOVE";
KdenliveSettings::setSnaptopoints(snap);
}
+ bool hasParentCommand = false;
+ if (command) {
+ hasParentCommand = true;
+ } else {
+ command = new QUndoCommand();
+ command->setText(i18n("Resize clip start"));
+ }
+
// do this here, too, because otherwise undo won't update the group
if (item->parentItem() && item->parentItem() != m_selectionGroup)
new RebuildGroupCommand(this, item->info().track, item->endPos() - GenTime(1, m_document->fps()), command);
resizeinfo.track = m_document->tracksCount() - resizeinfo.track;
bool success = m_document->renderer()->mltResizeClipStart(resizeinfo, item->startPos() - oldInfo.startPos);
if (success) {
- 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);
if (transition && transition->isAutomatic()) {
} else {
new ResizeClipCommand(this, oldInfo, info, false, false, command);
}
-
- if (!hasParentCommand)
- m_commandStack->push(command);
} else {
KdenliveSettings::setSnaptopoints(false);
item->resizeStart((int) oldInfo.startPos.frames(m_document->fps()));
}
if (item->parentItem() && item->parentItem() != m_selectionGroup)
new RebuildGroupCommand(this, item->info().track, item->endPos() - GenTime(1, m_document->fps()), command);
+
+ if (!hasParentCommand)
+ m_commandStack->push(command);
}
void CustomTrackView::prepareResizeClipEnd(AbstractClipItem* item, ItemInfo oldInfo, int pos, bool check, QUndoCommand *command)
KdenliveSettings::setSnaptopoints(snap);
}
+ bool hasParentCommand = false;
+ if (command) {
+ hasParentCommand = true;
+ } else {
+ command = new QUndoCommand();
+ command->setText(i18n("Resize clip end"));
+ }
+
// do this here, too, because otherwise undo won't update the group
if (item->parentItem() && item->parentItem() != m_selectionGroup)
new RebuildGroupCommand(this, item->info().track, item->startPos(), command);
resizeinfo.track = m_document->tracksCount() - resizeinfo.track;
bool success = m_document->renderer()->mltResizeClipEnd(resizeinfo, resizeinfo.endPos - resizeinfo.startPos);
if (success) {
- 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);
if (tr && tr->isAutomatic()) {
new ResizeClipCommand(this, oldInfo, info, false, false, command);
}
- if (!hasParentCommand)
- m_commandStack->push(command);
updatePositionEffects(clip, oldInfo);
} else {
KdenliveSettings::setSnaptopoints(false);
}
if (item->parentItem() && item->parentItem() != m_selectionGroup)
new RebuildGroupCommand(this, item->info().track, item->startPos(), command);
+
+ if (!hasParentCommand)
+ m_commandStack->push(command);
}
void CustomTrackView::updatePositionEffects(ClipItem * item, ItemInfo info)
end += start;
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
- if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
+ if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), getEffectArgs(oldeffect)))
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
// if fade effect is displayed, update the effect edit widget with new clip duration
if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
end += start;
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
- if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
+ if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), getEffectArgs(oldeffect)))
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
// if fade effect is displayed, update the effect edit widget with new clip duration
if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
start = end - start;
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
- if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
+ if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), getEffectArgs(oldeffect)))
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
// if fade effect is displayed, update the effect edit widget with new clip duration
if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
start = end - start;
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
- if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
+ if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), getEffectArgs(oldeffect)))
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
// if fade effect is displayed, update the effect edit widget with new clip duration
if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
}
oldeffect.setAttribute("in", start);
oldeffect.setAttribute("out", max);
- if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
+ if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), getEffectArgs(oldeffect)))
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
// if effect is displayed, update the effect edit widget with new clip duration
if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
item = static_cast <ClipItem *>(itemList.at(i));
- if (item->clipType() != COLOR && item->clipType() != AUDIO) {
+ if (item && item->isEnabled() && item->clipType() != COLOR && item->clipType() != AUDIO) {
// Check if we have a cached thumbnail
if (item->clipType() == IMAGE || item->clipType() == TEXT) {
QString thumb = thumbBase + item->baseClip()->getClipHash() + "_0.png";
item->slotSetEndThumb(pix);
}
}
+ item->refreshClip(false);
}
- item->refreshClip(false);
- //qApp->processEvents();
}
}
viewport()->update();
m_animationTimer->start();
}
}
+
+bool CustomTrackView::hasAudio(int track) const
+{
+ QRectF rect(0, (double)(track * m_tracksHeight + 1), (double) sceneRect().width(), (double)(m_tracksHeight - 1));
+ QList<QGraphicsItem *> collisions = scene()->items(rect, Qt::IntersectsItemBoundingRect);
+ QGraphicsItem *item;
+ for (int i = 0; i < collisions.count(); i++) {
+ item = collisions.at(i);
+ if (!item->isEnabled()) continue;
+ if (item->type() == AVWIDGET) {
+ ClipItem *clip = static_cast <ClipItem *>(item);
+ if (!clip->isVideoOnly() && (clip->clipType() == AUDIO || clip->clipType() == AV || clip->clipType() == PLAYLIST)) return true;
+ }
+ }
+ return false;
+}
+
+void CustomTrackView::slotAddTrackEffect(const QDomElement effect, int ix)
+{
+ AddEffectCommand *command = new AddEffectCommand(this, m_document->tracksCount() - ix, GenTime(-1), effect, true);
+ m_commandStack->push(command);
+}
+
+
+EffectsParameterList CustomTrackView::getEffectArgs(const QDomElement effect)
+{
+ EffectsParameterList parameters;
+ parameters.addParam("tag", effect.attribute("tag"));
+ if (effect.hasAttribute("region")) parameters.addParam("region", effect.attribute("region"));
+ parameters.addParam("kdenlive_ix", effect.attribute("kdenlive_ix"));
+ parameters.addParam("id", effect.attribute("id"));
+ if (effect.hasAttribute("src")) parameters.addParam("src", effect.attribute("src"));
+ if (effect.hasAttribute("disable")) parameters.addParam("disable", effect.attribute("disable"));
+ if (effect.hasAttribute("in")) parameters.addParam("in", effect.attribute("in"));
+ if (effect.hasAttribute("out")) parameters.addParam("out", effect.attribute("out"));
+
+ QDomNodeList params = effect.elementsByTagName("parameter");
+ for (int i = 0; i < params.count(); i++) {
+ QDomElement e = params.item(i).toElement();
+ //kDebug() << "/ / / /SENDING EFFECT PARAM: " << e.attribute("type") << ", NAME_ " << e.attribute("tag");
+ if (e.attribute("type") == "simplekeyframe") {
+
+ QStringList values = e.attribute("keyframes").split(";", QString::SkipEmptyParts);
+ double factor = e.attribute("factor", "1").toDouble();
+ for (int j = 0; j < values.count(); j++) {
+ QString pos = values.at(j).section(":", 0, 0);
+ double val = values.at(j).section(":", 1, 1).toDouble() / factor;
+ values[j] = pos + "=" + QString::number(val);
+ }
+ // kDebug() << "/ / / /SENDING KEYFR:" << values;
+ parameters.addParam(e.attribute("name"), values.join(";"));
+ /*parameters.addParam(e.attribute("name"), e.attribute("keyframes").replace(":", "="));
+ parameters.addParam("max", e.attribute("max"));
+ parameters.addParam("min", e.attribute("min"));
+ parameters.addParam("factor", e.attribute("factor", "1"));*/
+ } else if (e.attribute("type") == "keyframe") {
+ kDebug() << "/ / / /SENDING KEYFR EFFECT TYPE";
+ parameters.addParam("keyframes", e.attribute("keyframes"));
+ parameters.addParam("max", e.attribute("max"));
+ parameters.addParam("min", e.attribute("min"));
+ parameters.addParam("factor", e.attribute("factor", "1"));
+ parameters.addParam("starttag", e.attribute("starttag", "start"));
+ parameters.addParam("endtag", e.attribute("endtag", "end"));
+ } else if (e.attribute("namedesc").contains(';')) {
+ QString format = e.attribute("format");
+ QStringList separators = format.split("%d", QString::SkipEmptyParts);
+ QStringList values = e.attribute("value").split(QRegExp("[,:;x]"));
+ QString neu;
+ QTextStream txtNeu(&neu);
+ if (values.size() > 0)
+ txtNeu << (int)values[0].toDouble();
+ for (int i = 0; i < separators.size() && i + 1 < values.size(); i++) {
+ txtNeu << separators[i];
+ txtNeu << (int)(values[i+1].toDouble());
+ }
+ parameters.addParam("start", neu);
+ } else {
+ if (e.attribute("factor", "1") != "1") {
+ double fact;
+ if (e.attribute("factor").startsWith('%')) {
+ fact = ProfilesDialog::getStringEval(m_document->mltProfile(), e.attribute("factor"));
+ } else fact = e.attribute("factor", "1").toDouble();
+ parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / fact));
+ } else {
+ parameters.addParam(e.attribute("name"), e.attribute("value"));
+ }
+ }
+ }
+ return parameters;
+}
\ No newline at end of file