#include "changetrackcommand.h"
#include "movegroupcommand.h"
#include "ui_addtrack_ui.h"
+#include "initeffects.h"
//TODO:
// disable animation if user asked it in KDE's global settings
void CustomTrackView::addEffect(int track, GenTime pos, QDomElement effect) {
ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()) + 1, m_document->tracksCount() - track);
if (clip) {
- QHash <QString, QString> effectParams = clip->addEffect(effect);
- if (!m_document->renderer()->mltAddEffect(track, pos, effectParams))
+ if (!m_document->renderer()->mltAddEffect(track, pos, clip->addEffect(effect)))
emit displayMessage(i18n("Problem adding effect to clip"), ErrorMessage);
emit clipItemSelected(clip);
} else emit displayMessage(i18n("Cannot find clip to add effect"), ErrorMessage);
if (itemList.at(i)->type() == AVWIDGET) {
ClipItem *item = (ClipItem *)itemList.at(i);
item->initEffect(effect);
+ if (effect.attribute("tag") == "ladspa") {
+ QString ladpsaFile = m_document->getLadspaFile();
+ initEffects::ladspaEffectFile(ladpsaFile, effect.attribute("ladspaid").toInt(), getLadspaParams(effect));
+ effect.setAttribute("src", ladpsaFile);
+ }
AddEffectCommand *command = new AddEffectCommand(this, m_document->tracksCount() - item->track(), item->startPos(), effect, true);
m_commandStack->push(command);
}
void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement effect, int ix, bool triggeredByUser) {
ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()) + 1, m_document->tracksCount() - track);
if (clip) {
- QHash <QString, QString> effectParams = clip->getEffectArgs(effect);
+ EffectsParameterList effectParams = clip->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.contains("keyframes") && effectParams.value("keyframes").isEmpty()) {
+ if (effectParams.hasParam("keyframes") && effectParams.paramValue("keyframes").isEmpty()) {
clip->initEffect(effect);
clip->setEffectAt(ix, effect);
effectParams = clip->getEffectArgs(effect);
}
- if (effectParams.value("disabled") == "1") {
- if (m_document->renderer()->mltRemoveEffect(track, pos, effectParams.value("kdenlive_ix"))) {
+ if (effectParams.paramValue("disabled") == "1") {
+ if (m_document->renderer()->mltRemoveEffect(track, pos, effectParams.paramValue("kdenlive_ix"))) {
kDebug() << "////// DISABLING EFFECT: " << index << ", CURRENTLA: " << clip->selectedEffectIndex();
} else emit displayMessage(i18n("Problem deleting effect"), ErrorMessage);
} else if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - clip->track(), clip->startPos(), effectParams))
if (effect.attribute("tag") == "volume") {
// A fade effect was modified, update the clip
if (effect.attribute("id") == "fadein") {
- int pos = effectParams.value("out").toInt() - effectParams.value("in").toInt();
+ int pos = effectParams.paramValue("out").toInt() - effectParams.paramValue("in").toInt();
clip->setFadeIn(pos);
}
if (effect.attribute("id") == "fadeout") {
- int pos = effectParams.value("out").toInt() - effectParams.value("in").toInt();
+ int pos = effectParams.paramValue("out").toInt() - effectParams.paramValue("in").toInt();
clip->setFadeOut(pos);
}
m_cursorPos += delta;
m_cursorLine->setPos(m_cursorPos, 0);
m_document->renderer()->seek(GenTime(m_cursorPos, m_document->fps()));
- //if (m_autoScroll && m_scale < 50) checkScrolling();
+}
+
+void CustomTrackView::initCursorPos(int pos) {
+ emit cursorMoved((int)(m_cursorPos), (int)(pos));
+ m_cursorPos = pos;
+ m_cursorLine->setPos(pos, 0);
+ checkScrolling();
}
void CustomTrackView::checkScrolling() {
int vert = verticalScrollBar()->value();
int hor = cursorPos();
ensureVisible(hor, vert + 10, 2, 2, 50, 0);
- //centerOn(QPointF(cursorPos(), m_tracksHeight));
- /*QRect rectInView = viewport()->rect();
- int delta = rectInView.width() / 3;
- int max = rectInView.right() + horizontalScrollBar()->value() - delta;
- //kDebug() << "CURSOR POS: "<<m_cursorPos<< "Scale: "<<m_scale;
- if (m_cursorPos * m_scale >= max) horizontalScrollBar()->setValue((int)(horizontalScrollBar()->value() + 1 + m_scale));*/
}
void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
// Also move automatic transitions (on lower track)
Transition *tr = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track);
if (tr && tr->isAutomatic()) {
- tr->updateTransitionEndTrack(getPreviousVideoTrack(info.track));
ItemInfo trInfo = tr->info();
ItemInfo newTrInfo = trInfo;
+ newTrInfo.track = info.track;
newTrInfo.startPos = m_dragItem->startPos();
- if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && !getClipItemAtEnd(newTrInfo.endPos, m_document->tracksCount() - tr->transitionEndTrack())) {
- // transition end should be adjusted to clip on lower track
+ if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && getClipItemAtEnd(newTrInfo.endPos, m_document->tracksCount() - tr->transitionEndTrack())) {
+ // transition end should stay the same
+ } else {
+ // transition end should be adjusted to clip
newTrInfo.endPos = newTrInfo.endPos + (newTrInfo.startPos - trInfo.startPos);
}
new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
}
- if (tr == NULL || tr->endPos() < item->endPos()) {
+ if (tr == NULL || tr->endPos() < m_dragItemInfo.endPos) {
// Check if there is a transition at clip end
tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track);
if (tr && tr->isAutomatic()) {
- tr->updateTransitionEndTrack(getPreviousVideoTrack(info.track));
ItemInfo trInfo = tr->info();
ItemInfo newTrInfo = trInfo;
+ newTrInfo.track = info.track;
newTrInfo.endPos = m_dragItem->endPos();
- if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && !getClipItemAtStart(trInfo.startPos, m_document->tracksCount() - tr->transitionEndTrack())) {
- // transition end should be moved
+ if (m_dragItemInfo.track == info.track && !item->baseClip()->isTransparent() && getClipItemAtStart(trInfo.startPos, m_document->tracksCount() - tr->transitionEndTrack())) {
+ // transition start should stay the same
+ } else {
+ // transition start should be moved
newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos);
}
new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
ItemInfo newTrInfo = trInfo;
newTrInfo.startPos = m_dragItem->startPos();
ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
- if ((!upperClip || !upperClip->baseClip()->isTransparent()) && !getClipItemAtEnd(newTrInfo.endPos, tr->track())) {
- // transition end should be adjusted to clip on upper track
- newTrInfo.endPos = newTrInfo.endPos + (newTrInfo.startPos - trInfo.startPos);
+ if (!upperClip || !upperClip->baseClip()->isTransparent()) {
+ if (!getClipItemAtEnd(newTrInfo.endPos, tr->track())) {
+ // transition end should be adjusted to clip on upper track
+ newTrInfo.endPos = newTrInfo.endPos + (newTrInfo.startPos - trInfo.startPos);
+ }
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
}
- new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
}
- if (m_dragItemInfo.track == info.track && (tr == NULL || tr->endPos() < item->endPos())) {
+ if (m_dragItemInfo.track == info.track && (tr == NULL || tr->endPos() < m_dragItemInfo.endPos)) {
// Check if there is a transition at clip end
tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track - 1);
if (tr && tr->isAutomatic() && (m_document->tracksCount() - tr->transitionEndTrack()) == m_dragItemInfo.track) {
ItemInfo newTrInfo = trInfo;
newTrInfo.endPos = m_dragItem->endPos();
ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
- if ((!upperClip || !upperClip->baseClip()->isTransparent()) && !getClipItemAtStart(trInfo.startPos, tr->track())) {
- // transition start should be moved
- newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos);
+ if (!upperClip || !upperClip->baseClip()->isTransparent()) {
+ if (!getClipItemAtStart(trInfo.startPos, tr->track())) {
+ // transition start should be moved
+ newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos);
+ }
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
}
- new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
}
}
m_commandStack->push(moveCommand);
ItemInfo trInfo = transition->info();
ItemInfo newTrInfo = trInfo;
newTrInfo.startPos = m_dragItem->startPos();
- new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
+ if (!upperClip || !upperClip->baseClip()->isTransparent()) {
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ }
}
updateClipFade(static_cast <ClipItem *>(m_dragItem));
new ResizeClipCommand(this, m_dragItemInfo, info, false, resizeCommand);
ItemInfo trInfo = tr->info();
ItemInfo newTrInfo = trInfo;
newTrInfo.endPos = m_dragItem->endPos();
- if (!static_cast<ClipItem*>(m_dragItem)->baseClip()->isTransparent() && !getClipItemAtStart(trInfo.startPos, m_document->tracksCount() - tr->transitionEndTrack())) {
- // transition start should be moved
- newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos);
- }
new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
}
// Check if there is an automatic transition on that clip (upper track)
tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track - 1);
- if (tr) kDebug() << "TRANS TRK: " << tr->transitionEndTrack() << ", CLP TRK:" << m_dragItemInfo.track << ", CALC: " << m_document->tracksCount() - tr->transitionEndTrack();
if (tr && tr->isAutomatic() && (m_document->tracksCount() - tr->transitionEndTrack()) == m_dragItemInfo.track) {
- kDebug() << ".............. GOT TRANSITION";
ItemInfo trInfo = tr->info();
ItemInfo newTrInfo = trInfo;
newTrInfo.endPos = m_dragItem->endPos();
- if (!static_cast<ClipItem*>(m_dragItem)->baseClip()->isTransparent() && !getClipItemAtStart(trInfo.startPos, trInfo.track)) {
- // transition start should be moved
- newTrInfo.startPos = newTrInfo.startPos + (newTrInfo.endPos - trInfo.endPos);
+ ClipItem * upperClip = getClipItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track - 1);
+ if (!upperClip || !upperClip->baseClip()->isTransparent()) {
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
}
- new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
}
new ResizeClipCommand(this, m_dragItemInfo, info, false, resizeCommand);
}
ClipItem *CustomTrackView::getClipItemAtEnd(GenTime pos, int track) {
- QList<QGraphicsItem *> list = scene()->items(QPointF(pos.frames(m_document->fps()) - 1, track * m_tracksHeight + m_tracksHeight / 2));
+ int framepos = (int)(pos.frames(m_document->fps()));
+ QList<QGraphicsItem *> list = scene()->items(QPointF(framepos - 1, track * m_tracksHeight + m_tracksHeight / 2));
ClipItem *clip = NULL;
- for (int i = 0; i < list.size(); ++i) {
+ for (int i = 0; i < list.size(); i++) {
if (list.at(i)->type() == AVWIDGET) {
ClipItem *test = static_cast <ClipItem *>(list.at(i));
if (test->endPos() == pos) clip = test;
ClipItem *CustomTrackView::getClipItemAtStart(GenTime pos, int track) {
QList<QGraphicsItem *> list = scene()->items(QPointF(pos.frames(m_document->fps()), track * m_tracksHeight + m_tracksHeight / 2));
ClipItem *clip = NULL;
- for (int i = 0; i < list.size(); ++i) {
+ for (int i = 0; i < list.size(); i++) {
if (list.at(i)->type() == AVWIDGET) {
ClipItem *test = static_cast <ClipItem *>(list.at(i));
if (test->startPos() == pos) clip = test;
ClipItem *CustomTrackView::getClipItemAt(int pos, int track) {
QList<QGraphicsItem *> list = scene()->items(QPointF(pos , track * m_tracksHeight + m_tracksHeight / 2));
ClipItem *clip = NULL;
- for (int i = 0; i < list.size(); ++i) {
+ for (int i = 0; i < list.size(); i++) {
if (list.at(i)->type() == AVWIDGET) {
clip = static_cast <ClipItem *>(list.at(i));
break;
Transition *CustomTrackView::getTransitionItemAt(int pos, int track) {
QList<QGraphicsItem *> list = scene()->items(QPointF(pos, (track + 1) * m_tracksHeight));
Transition *clip = NULL;
- for (int i = 0; i < list.size(); ++i) {
+ for (int i = 0; i < list.size(); i++) {
if (list.at(i)->type() == TRANSITIONWIDGET) {
clip = static_cast <Transition *>(list.at(i));
break;
int framepos = (int)(pos.frames(m_document->fps()));
QList<QGraphicsItem *> list = scene()->items(QPointF(framepos - 1, (track + 1) * m_tracksHeight));
Transition *clip = NULL;
- for (int i = 0; i < list.size(); ++i) {
+ for (int i = 0; i < list.size(); i++) {
if (list.at(i)->type() == TRANSITIONWIDGET) {
Transition *test = static_cast <Transition *>(list.at(i));
if (test->endPos() == pos) clip = test;
end += start;
EffectsList::setParameter(oldeffect, "in", QString::number(start));
EffectsList::setParameter(oldeffect, "out", QString::number(end));
- QHash <QString, QString> effectParams = item->getEffectArgs(oldeffect);
- if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), effectParams))
+ if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->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));
- QHash <QString, QString> effectParams = item->getEffectArgs(oldeffect);
- if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), effectParams))
+ if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->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);
m_document->renderer()->mltUpdateTransition(transition.attribute("tag"), transition.attribute("tag"), transition.attribute("transition_btrack").toInt(), m_document->tracksCount() - transition.attribute("transition_atrack").toInt(), tr->startPos(), tr->endPos(), transition);
}
+
+QStringList CustomTrackView::getLadspaParams(QDomElement effect) const {
+ QStringList result;
+ QDomNodeList params = effect.elementsByTagName("parameter");
+ for (int i = 0; i < params.count(); i++) {
+ QDomElement e = params.item(i).toElement();
+ if (!e.isNull() && e.attribute("type") == "constant") {
+ if (e.hasAttribute("factor")) {
+ double factor = e.attribute("factor").toDouble();
+ double value = e.attribute("value").toDouble();
+ value = value / factor;
+ result.append(QString::number(value));
+ } else result.append(e.attribute("value"));
+ }
+ }
+ return result;
+}
+
#include "customtrackview.moc"