X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcustomtrackview.cpp;h=76e4bb1cecb3f927b12eab7e8fce2ebc91b5ab5b;hb=f41ee253ade9dfda45752f232ea0ff35e26dce95;hp=1af5532e65805319006ad32ba0236e4d90a21129;hpb=ce68de86827a11cd0dc96465fba021b2f7ceea55;p=kdenlive diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 1af5532e..76e4bb1c 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -48,6 +48,7 @@ #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" @@ -1298,7 +1299,7 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event) 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()) { @@ -1935,12 +1936,14 @@ void CustomTrackView::slotDeleteEffect(ClipItem *clip, int track, QDomElement ef 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: "<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(); @@ -1978,7 +1982,7 @@ void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement insertedE if (ix == clip->selectedEffectIndex()) { // make sure to update display of clip keyframes clip->setSelectedEffect(ix); - } else emit displayMessage(i18n("Problem editing effect"), ErrorMessage); + } return; } @@ -2018,69 +2022,128 @@ void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement insertedE setDocumentModified(); } -void CustomTrackView::moveEffect(int track, GenTime pos, int oldPos, int newPos) +void CustomTrackView::updateEffectState(int track, GenTime pos, QList effectIndexes, bool disable, bool updateEffectStack) { if (pos < GenTime()) { - // Moving track effect - if (newPos > m_document->getTrackEffects(m_document->tracksCount() - track - 1).count()) { - newPos = m_document->getTrackEffects(m_document->tracksCount() - track - 1).count(); + // editing a track effect + if (!m_document->renderer()->mltEnableEffects(m_document->tracksCount() - track, pos, effectIndexes, disable)) { + emit displayMessage(i18n("Problem editing effect"), ErrorMessage); + return; } - QDomElement act = m_document->getTrackEffect(m_document->tracksCount() - track - 1, newPos); - QDomElement before = m_document->getTrackEffect(m_document->tracksCount() - track - 1, oldPos); - if (!act.isNull() && !before.isNull()) { - //m_document->setTrackEffect(m_document->tracksCount() - track - 1, oldPos, act); - m_document->setTrackEffect(m_document->tracksCount() - track - 1, newPos, before); - m_document->renderer()->mltMoveEffect(m_document->tracksCount() - track, pos, oldPos, newPos); - emit showTrackEffects(m_document->tracksCount() - track, m_document->trackInfoAt(m_document->tracksCount() - track - 1)); - } else emit displayMessage(i18n("Cannot move effect"), ErrorMessage); + 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 (newPos > clip->effectsCount()) { - newPos = clip->effectsCount(); + 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 oldPos, QList newPos) +{ + if (pos < GenTime()) { + // Moving track effect + int documentTrack = m_document->tracksCount() - track - 1; + int max = m_document->getTrackEffects(documentTrack).count(); + int new_position = newPos.at(0); + if (new_position > max) { + new_position = max; + } + int old_position = oldPos.at(0); + for (int i = 0; i < newPos.count(); i++) { + QDomElement act = m_document->getTrackEffect(documentTrack, 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 = m_document->getTrackEffect(documentTrack, old_position); + if (!act.isNull() && !before.isNull()) { + m_document->setTrackEffect(documentTrack, new_position, before); + m_document->renderer()->mltMoveEffect(m_document->tracksCount() - track, pos, old_position, new_position); + } else emit displayMessage(i18n("Cannot move effect"), ErrorMessage); + } + emit showTrackEffects(m_document->tracksCount() - track, m_document->trackInfoAt(documentTrack)); + return; } + ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track); if (clip) { - QDomElement act = clip->effectAt(newPos); - QDomElement before = clip->effectAt(oldPos); - if (act.isNull() || before.isNull()) { - emit displayMessage(i18n("Cannot move effect"), ErrorMessage); - return; + int new_position = newPos.at(0); + if (new_position > clip->effectsCount()) { + new_position = clip->effectsCount(); } - //clip->moveEffect(act, oldPos); - clip->moveEffect(before, newPos); - // special case: speed effect, which is a pseudo-effect, not appearing in MLT's effects - if (act.attribute("id") == "speed") { - m_document->renderer()->mltUpdateEffectPosition(track, pos, oldPos, newPos); - } else if (before.attribute("id") == "speed") { - m_document->renderer()->mltUpdateEffectPosition(track, pos, newPos, oldPos); - } else m_document->renderer()->mltMoveEffect(track, pos, oldPos, newPos); - clip->setSelectedEffect(newPos); - emit clipItemSelected(clip); + int old_position = oldPos.at(0); + for (int i = 0; i < newPos.count(); i++) { + QDomElement act = clip->effectAt(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); + if (act.isNull() || before.isNull()) { + emit displayMessage(i18n("Cannot move effect"), ErrorMessage); + return; + } + clip->moveEffect(before, new_position); + // special case: speed effect, which is a pseudo-effect, not appearing in MLT's effects + if (act.attribute("id") == "speed") { + m_document->renderer()->mltUpdateEffectPosition(track, pos, old_position, new_position); + } else if (before.attribute("id") == "speed") { + m_document->renderer()->mltUpdateEffectPosition(track, pos, new_position, old_position); + } else m_document->renderer()->mltMoveEffect(track, pos, old_position, new_position); + } + clip->setSelectedEffect(newPos.at(0)); + emit clipItemSelected(clip); setDocumentModified(); } 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 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 speedEffectIndexes; + for (int i = 0; i < effectIndexes.count(); i++) { + QDomElement effect = clip->effectAt(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, int currentPos, int newPos) +void CustomTrackView::slotChangeEffectPosition(ClipItem *clip, int track, QList currentPos, int newPos) { MoveEffectCommand *command; if (clip == NULL) { @@ -3821,7 +3884,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) 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()) {