#include "commands/insertspacecommand.h"
#include "spacerdialog.h"
#include "commands/addtrackcommand.h"
+#include "commands/changeeffectstatecommand.h"
#include "commands/movegroupcommand.h"
#include "ui_addtrack_ui.h"
#include "initeffects.h"
// all other modes break the selection, so the user probably wants to move it
opMode = MOVE;
} else {
- opMode = clip->operationMode(mapToScene(event->pos()));
+ if (clip->rect().width() * transform().m11() < 15) {
+ // If the item is very small, only allow move
+ opMode = MOVE;
+ }
+ else opMode = clip->operationMode(mapToScene(event->pos()));
}
const double size = 5;
// all other modes break the selection, so the user probably wants to move it
m_operationMode = MOVE;
} else {
- m_operationMode = m_dragItem->operationMode(mapToScene(event->pos()));
+ if (m_dragItem->rect().width() * transform().m11() < 15) {
+ // If the item is very small, only allow move
+ m_operationMode = MOVE;
+ }
+ else m_operationMode = m_dragItem->operationMode(mapToScene(event->pos()));
}
m_controlModifier = (event->modifiers() == Qt::ControlModifier);
ClipItem * item = static_cast <ClipItem *>(m_dragItem);
//QString previous = item->keyframes(item->selectedEffectIndex());
QDomElement oldEffect = item->selectedEffect().cloneNode().toElement();
- item->insertKeyframe(item->getEffectAt(item->selectedEffectIndex()), keyFramePos.frames(m_document->fps()), val);
+ item->insertKeyframe(item->getEffectAtIndex(item->selectedEffectIndex()), keyFramePos.frames(m_document->fps()), val);
//item->updateKeyframeEffect();
//QString next = item->keyframes(item->selectedEffectIndex());
QDomElement newEffect = item->selectedEffect().cloneNode().toElement();
EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), oldEffect, newEffect, item->selectedEffectIndex(), false, false);
//EditKeyFrameCommand *command = new EditKeyFrameCommand(this, m_dragItem->track(), m_dragItem->startPos(), item->selectedEffectIndex(), previous, next, false);
m_commandStack->push(command);
- updateEffect(m_document->tracksCount() - item->track(), item->startPos(), item->selectedEffect(), item->selectedEffectIndex());
+ updateEffect(m_document->tracksCount() - item->track(), item->startPos(), item->selectedEffect());
emit clipItemSelected(item, item->selectedEffectIndex());
}
} else if (m_dragItem && !m_dragItem->isItemLocked()) {
}
bool success = true;
for (int i = 0; i < clip->effectsCount(); i++) {
- if (!m_document->renderer()->mltAddEffect(track, pos, getEffectArgs(clip->effectAt(i)), false)) success = false;
+ if (!m_document->renderer()->mltAddEffect(track, pos, getEffectArgs(clip->effect(i)), false)) success = false;
}
if (!success) emit displayMessage(i18n("Problem adding effect to clip"), ErrorMessage);
m_document->renderer()->doRefresh();
ClipItem *item = static_cast <ClipItem *>(items.at(i));
int ix = item->hasEffect(effect.attribute("tag"), effect.attribute("id"));
if (ix != -1) {
- QDomElement eff = item->effectAt(ix);
+ QDomElement eff = item->effectAtIndex(ix);
new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), eff, false, delCommand);
}
}
setDocumentModified();
}
-void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement insertedEffect, int ix, bool updateEffectStack)
+void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement insertedEffect, bool updateEffectStack)
{
if (insertedEffect.isNull()) {
+ kDebug()<<"// Trying to add null effect";
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
return;
}
+ int ix = insertedEffect.attribute("kdenlive_ix").toInt();
QDomElement effect = insertedEffect.cloneNode().toElement();
//kDebug() << "// update effect ix: " << effect.attribute("kdenlive_ix")<<", GAIN: "<<EffectsList::parameter(effect, "gain");
if (pos < GenTime()) {
clip->initEffect(effect);
effectParams = getEffectArgs(effect);
}*/
- if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - track, pos, effectParams))
+ if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - track, pos, effectParams)) {
emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
+ }
m_document->setTrackEffect(m_document->tracksCount() - track - 1, ix, effect);
emit updateTrackEffectState(track);
setDocumentModified();
if (ix == clip->selectedEffectIndex()) {
// make sure to update display of clip keyframes
clip->setSelectedEffect(ix);
- } else emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
+ }
return;
}
setDocumentModified();
}
+void CustomTrackView::updateEffectState(int track, GenTime pos, QList <int> effectIndexes, bool disable, bool updateEffectStack)
+{
+ if (pos < GenTime()) {
+ // editing a track effect
+ if (!m_document->renderer()->mltEnableEffects(m_document->tracksCount() - track, pos, effectIndexes, disable)) {
+ emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
+ return;
+ }
+ m_document->enableTrackEffects(m_document->tracksCount() - track - 1, effectIndexes, disable);
+ emit updateTrackEffectState(track);
+ setDocumentModified();
+ return;
+ }
+ // editing a clip effect
+ ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track);
+ if (clip) {
+ bool success = m_document->renderer()->mltEnableEffects(m_document->tracksCount() - clip->track(), clip->startPos(), effectIndexes, disable);
+ if (success) {
+ clip->enableEffects(effectIndexes, disable);
+ if (updateEffectStack && clip->isSelected()) {
+ emit clipItemSelected(clip);
+ }
+ if (effectIndexes.contains(clip->selectedEffectIndex())) {
+ // make sure to update display of clip keyframes
+ clip->setSelectedEffect(clip->selectedEffectIndex());
+ }
+ }
+ else emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
+ }
+ else emit displayMessage(i18n("Cannot find clip to update effect"), ErrorMessage);
+}
+
void CustomTrackView::moveEffect(int track, GenTime pos, QList <int> oldPos, QList <int> newPos)
{
if (pos < GenTime()) {
}
int old_position = oldPos.at(0);
for (int i = 0; i < newPos.count(); i++) {
- QDomElement act = clip->effectAt(new_position);
+ QDomElement act = clip->effectAtIndex(new_position);
if (old_position > new_position) {
// Moving up, we need to adjust index
old_position = oldPos.at(i);
new_position = newPos.at(i);
}
- QDomElement before = clip->effectAt(old_position);
+ QDomElement before = clip->effectAtIndex(old_position);
if (act.isNull() || before.isNull()) {
emit displayMessage(i18n("Cannot move effect"), ErrorMessage);
return;
} else emit displayMessage(i18n("Cannot move effect"), ErrorMessage);
}
-void CustomTrackView::slotChangeEffectState(ClipItem *clip, int track, int effectPos, bool disable)
+void CustomTrackView::slotChangeEffectState(ClipItem *clip, int track, QList <int> effectIndexes, bool disable)
{
- EditEffectCommand *command;
- QDomElement effect;
- if (clip == NULL) effect = m_document->getTrackEffect(track - 1, effectPos);
- else effect = clip->effectAt(effectPos);
- QDomElement oldEffect = effect.cloneNode().toElement();
- effect.setAttribute("disable", (int) disable);
-
-
+ ChangeEffectStateCommand *command;
if (clip == NULL) {
// editing track effect
- command = new EditEffectCommand(this, m_document->tracksCount() - track, GenTime(-1), oldEffect, effect, effectPos, false, true);
+ command = new ChangeEffectStateCommand(this, m_document->tracksCount() - track, GenTime(-1), effectIndexes, disable, false, true);
} else {
- command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldEffect, effect, effectPos, false, true);
+ // Check if we have a speed effect, disabling / enabling it needs a special procedure since it is a pseudoo effect
+ QList <int> speedEffectIndexes;
+ for (int i = 0; i < effectIndexes.count(); i++) {
+ QDomElement effect = clip->effectAtIndex(effectIndexes.at(i));
+ if (effect.attribute("id") == "speed") {
+ // speed effect
+ speedEffectIndexes << effectIndexes.at(i);
+ QDomElement newEffect = effect.cloneNode().toElement();
+ newEffect.setAttribute("disable", (int) disable);
+ EditEffectCommand *editcommand = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effect, newEffect, effectIndexes.at(i), false, true);
+ m_commandStack->push(editcommand);
+ }
+ }
+ for (int j = 0; j < speedEffectIndexes.count(); j++) {
+ effectIndexes.removeAll(speedEffectIndexes.at(j));
+ }
+ command = new ChangeEffectStateCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effectIndexes, disable, false, true);
}
m_commandStack->push(command);
- setDocumentModified();;
+ setDocumentModified();
}
void CustomTrackView::slotChangeEffectPosition(ClipItem *clip, int track, QList <int> currentPos, int newPos)
void CustomTrackView::slotUpdateClipRegion(ClipItem *clip, int ix, QString region)
{
- QDomElement effect = clip->getEffectAt(ix);
+ QDomElement effect = clip->getEffectAtIndex(ix);
QDomElement oldeffect = effect.cloneNode().toElement();
effect.setAttribute("region", region);
EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldeffect, effect, ix, true, true);
// fade in from 2nd part of the clip
int ix = dup->hasEffect(QString(), "fadein");
if (ix != -1) {
- QDomElement oldeffect = dup->effectAt(ix);
+ QDomElement oldeffect = dup->effectAtIndex(ix);
dup->deleteEffect(oldeffect.attribute("kdenlive_ix"));
}
ix = dup->hasEffect(QString(), "fade_from_black");
if (ix != -1) {
- QDomElement oldeffect = dup->effectAt(ix);
+ QDomElement oldeffect = dup->effectAtIndex(ix);
dup->deleteEffect(oldeffect.attribute("kdenlive_ix"));
}
// fade out from 1st part of the clip
ix = item->hasEffect(QString(), "fadeout");
if (ix != -1) {
- QDomElement oldeffect = item->effectAt(ix);
+ QDomElement oldeffect = item->effectAtIndex(ix);
item->deleteEffect(oldeffect.attribute("kdenlive_ix"));
}
ix = item->hasEffect(QString(), "fade_to_black");
if (ix != -1) {
- QDomElement oldeffect = item->effectAt(ix);
+ QDomElement oldeffect = item->effectAtIndex(ix);
item->deleteEffect(oldeffect.attribute("kdenlive_ix"));
}
// join fade effects again
int ix = dup->hasEffect(QString(), "fadeout");
if (ix != -1) {
- QDomElement effect = dup->effectAt(ix);
+ QDomElement effect = dup->effectAtIndex(ix);
item->addEffect(effect);
}
ix = dup->hasEffect(QString(), "fade_to_black");
if (ix != -1) {
- QDomElement effect = dup->effectAt(ix);
+ QDomElement effect = dup->effectAtIndex(ix);
item->addEffect(effect);
}
KdenliveSettings::setSnaptopoints(false);
item->setPos((int) m_dragItemInfo.startPos.frames(m_document->fps()), (int)(m_dragItemInfo.track * m_tracksHeight + 1));
KdenliveSettings::setSnaptopoints(snap);
- emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(m_dragItemInfo.startPos.frames(m_document->fps()))), ErrorMessage);
+ emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(info.startPos.frames(m_document->fps()))), ErrorMessage);
}
setDocumentModified();
} else if (m_dragItem->type() == TRANSITIONWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) {
adjustTimelineClips(m_scene->editMode(), clip, ItemInfo(), moveGroup);
m_document->renderer()->mltInsertClip(info, clip->xml(), clip->getProducer(trackProducer), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT);
for (int i = 0; i < clip->effectsCount(); i++) {
- m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(clip->effectAt(i)), false);
+ m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(clip->effect(i)), false);
}
} else {
Transition *tr = static_cast <Transition*>(item);
int ix = item->hasEffect("volume", "fadein");
int ix2 = item->hasEffect("", "fade_from_black");
if (ix != -1) {
- QDomElement oldeffect = item->effectAt(ix);
+ QDomElement oldeffect = item->effectAtIndex(ix);
int start = item->cropStart().frames(m_document->fps());
int end = item->fadeIn();
if (end == 0) {
slotAddEffect(effect, m_dragItem->startPos(), m_dragItem->track());
}
if (ix2 != -1) {
- QDomElement oldeffect = item->effectAt(ix2);
+ QDomElement oldeffect = item->effectAtIndex(ix2);
int start = item->cropStart().frames(m_document->fps());
int end = item->fadeIn();
if (end == 0) {
int ix = item->hasEffect("volume", "fadeout");
int ix2 = item->hasEffect("", "fade_to_black");
if (ix != -1) {
- QDomElement oldeffect = item->effectAt(ix);
+ QDomElement oldeffect = item->effectAtIndex(ix);
int end = (item->cropDuration() + item->cropStart()).frames(m_document->fps());
int start = item->fadeOut();
if (start == 0) {
slotAddEffect(effect, m_dragItem->startPos(), m_dragItem->track());
}
if (ix2 != -1) {
- QDomElement oldeffect = item->effectAt(ix2);
+ QDomElement oldeffect = item->effectAtIndex(ix2);
int end = (item->cropDuration() + item->cropStart()).frames(m_document->fps());
int start = item->fadeOut();
if (start == 0) {
if ((val < -50 || val > 150) && item->editedKeyFramePos() != start && item->editedKeyFramePos() != end && item->keyFrameNumber() > 1) {
//delete keyframe
- item->movedKeyframe(item->getEffectAt(item->selectedEffectIndex()), item->selectedKeyFramePos(), -1, 0);
+ item->movedKeyframe(item->getEffectAtIndex(item->selectedEffectIndex()), item->selectedKeyFramePos(), -1, 0);
} else {
- item->movedKeyframe(item->getEffectAt(item->selectedEffectIndex()), item->selectedKeyFramePos(), item->editedKeyFramePos(), item->editedKeyFrameValue());
+ item->movedKeyframe(item->getEffectAtIndex(item->selectedEffectIndex()), item->selectedKeyFramePos(), item->editedKeyFramePos(), item->editedKeyFrameValue());
}
QDomElement newEffect = item->selectedEffect().cloneNode().toElement();
EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), oldEffect, newEffect, item->selectedEffectIndex(), false, false);
m_commandStack->push(command);
- updateEffect(m_document->tracksCount() - item->track(), item->startPos(), item->selectedEffect(), item->selectedEffectIndex());
+ updateEffect(m_document->tracksCount() - item->track(), item->startPos(), item->selectedEffect());
emit clipItemSelected(item);
}
if (m_dragItem && m_dragItem->type() == TRANSITIONWIDGET && m_dragItem->isSelected()) {
info.track = m_document->tracksCount() - info.track;
m_document->renderer()->mltInsertClip(info, xml, item->getProducer(producerTrack), overwrite, push);
for (int i = 0; i < item->effectsCount(); i++) {
- m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(item->effectAt(i)), false);
+ m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(item->effect(i)), false);
}
setDocumentModified();
if (refresh)
info.track = m_document->tracksCount() - info.track;
m_document->renderer()->mltInsertClip(info, clip->xml(), clip->getProducer(trackProducer));
for (int i = 0; i < clip->effectsCount(); i++) {
- m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(clip->effectAt(i)), false);
+ m_document->renderer()->mltAddEffect(info.track, info.startPos, getEffectArgs(clip->effect(i)), false);
}
} else if (item->type() == TRANSITIONWIDGET) {
Transition *tr = static_cast <Transition*>(item);
// there is a fade in effect
int effectPos = item->hasEffect("volume", "fadein");
if (effectPos != -1) {
- QDomElement effect = item->getEffectAt(effectPos);
+ QDomElement effect = item->getEffectAtIndex(effectPos);
int start = item->cropStart().frames(m_document->fps());
int max = item->cropDuration().frames(m_document->fps());
if (end > max) {
}
effectPos = item->hasEffect("brightness", "fade_from_black");
if (effectPos != -1) {
- QDomElement effect = item->getEffectAt(effectPos);
+ QDomElement effect = item->getEffectAtIndex(effectPos);
int start = item->cropStart().frames(m_document->fps());
int max = item->cropDuration().frames(m_document->fps());
if (end > max) {
// there is a fade out effect
int effectPos = item->hasEffect("volume", "fadeout");
if (effectPos != -1) {
- QDomElement effect = item->getEffectAt(effectPos);
+ QDomElement effect = item->getEffectAtIndex(effectPos);
int max = item->cropDuration().frames(m_document->fps());
int end = max + item->cropStart().frames(m_document->fps());
if (start > max) {
}
effectPos = item->hasEffect("brightness", "fade_to_black");
if (effectPos != -1) {
- QDomElement effect = item->getEffectAt(effectPos);
+ QDomElement effect = item->getEffectAtIndex(effectPos);
int max = item->cropDuration().frames(m_document->fps());
int end = max + item->cropStart().frames(m_document->fps());
if (start > max) {
if (effectPos != -1) {
// Freeze effect needs to be adjusted with clip resize
int diff = (info.startPos - item->startPos()).frames(m_document->fps());
- QDomElement eff = item->getEffectAt(effectPos);
+ QDomElement eff = item->getEffectAtIndex(effectPos);
if (!eff.isNull() && diff != 0) {
int freeze_pos = EffectsList::parameter(eff, "frame").toInt() + diff;
EffectsList::setParameter(eff, "frame", QString::number(freeze_pos));
for (int i = 0; i < clips.count(); ++i) {
if (clips.at(i)->type() == AVWIDGET) {
ClipItem *item = static_cast < ClipItem *>(clips.at(i));
- for (int j = 1; j <= clip->effectsCount(); j++) {
- QDomElement eff = clip->effectAt(j);
+ for (int j = 0; j < clip->effectsCount(); j++) {
+ QDomElement eff = clip->effect(j);
if (eff.attribute("unique", "0") == "0" || item->hasEffect(eff.attribute("tag"), eff.attribute("id")) == -1) {
adjustKeyfames(clip->cropStart(), item->cropStart(), item->cropDuration(), eff);
new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), eff, true, paste);
AudioEnvelope *envelope = new AudioEnvelope(clip->getProducer(clip->track()));
m_audioCorrelator = new AudioCorrelation(envelope);
+
+#ifdef DEBUG
envelope->drawEnvelope().save("kdenlive-audio-reference-envelope.png");
envelope->dumpInfo();
+#endif
+
emit displayMessage(i18n("Audio align reference set."), InformationMessage);
}
int shift = m_audioCorrelator->getShift(index);
counter++;
+
+#ifdef DEBUG
m_audioCorrelator->info(index)->toImage().save("kdenlive-audio-align-cross-correlation.png");
envelope->drawEnvelope().save("kdenlive-audio-align-envelope.png");
envelope->dumpInfo();
-#ifdef DEBUG
int targetPos = m_audioAlignmentReference->startPos().frames(m_document->fps()) + shift;
qDebug() << "Reference starts at " << m_audioAlignmentReference->startPos().frames(m_document->fps());
qDebug() << "We will start at " << targetPos;
int audioIx = 0;
for (int i = 0; i < effects.count(); ++i) {
if (effects.at(i).attribute("type") == "audio") {
- deleteEffect(m_document->tracksCount() - track, pos, clip->effectAt(videoIx));
+ deleteEffect(m_document->tracksCount() - track, pos, clip->effect(videoIx));
audioIx++;
} else {
- deleteEffect(freetrack, pos, audioClip->effectAt(audioIx));
+ deleteEffect(freetrack, pos, audioClip->effect(audioIx));
videoIx++;
}
}
if (effects.count()) {
QMap<int, QDomElement>::const_iterator i = effects.constBegin();
while (i != effects.constEnd()) {
- new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), i.value(), item->effectAt(i.key()), i.key(), false, false, command);
+ new EditEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), i.value(), item->effect(i.key()), i.key(), false, false, command);
++i;
}
}
return;
}
QDomElement newEffect;
- QDomElement effect = clip->getEffectAt(clip->selectedEffectIndex());
+ QDomElement effect = clip->getEffectAtIndex(clip->selectedEffectIndex());
if (effect.attribute("id") == filter) {
newEffect = effect.cloneNode().toElement();
QMap<QString, QString>::const_iterator i = filterParams.constBegin();