#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
m_timelineContextMenu = timeline;
m_timelineContextClipMenu = clip;
m_timelineContextTransitionMenu = transition;
+ QList <QAction *> list = m_timelineContextTransitionMenu->actions();
+ for (int i = 0; i < list.count(); i++)
+ if (list.at(i)->data().toString() == "auto") m_autoTransition = list.at(i);
}
void CustomTrackView::checkAutoScroll() {
QList<QGraphicsItem *> itemList = items();
ClipItem *item;
Transition *transitionitem;
+ bool snap = KdenliveSettings::snaptopoints();
+ KdenliveSettings::setSnaptopoints(false);
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
item = (ClipItem*) itemList.at(i);
}
setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
- verticalScrollBar()->setMaximum(m_tracksHeight * m_document->tracksCount());
+// verticalScrollBar()->setMaximum(m_tracksHeight * m_document->tracksCount());
+ KdenliveSettings::setSnaptopoints(snap);
update();
}
} else if (m_operationMode == SPACER && move) {
// spacer tool
int mappedClick = (int)(mapToScene(m_clickEvent).x() + 0.5);
- m_selectionGroup->setPos(mappedXPos + (m_spacerStart - mappedClick) , m_selectionGroup->pos().y());
+ m_selectionGroup->setPos(mappedXPos + (((int) m_selectionGroup->boundingRect().topLeft().x() + 0.5) - mappedClick) , m_selectionGroup->pos().y());
}
}
i++;
}
+ if (m_dragItem && m_dragItem->type() == TRANSITIONWIDGET) {
+ // update transition menu action
+ m_autoTransition->setChecked(static_cast<Transition *>(m_dragItem)->isAutomatic());
+ m_autoTransition->setEnabled(true);
+ } else m_autoTransition->setEnabled(false);
+
// context menu requested
if (event->button() == Qt::RightButton) {
if (m_dragItem) {
}
m_selectionGroup = new AbstractGroupItem(m_document->fps());
scene()->addItem(m_selectionGroup);
- m_spacerStart = -1;
- int itemStart;
+
for (int i = 0; i < selection.count(); i++) {
if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET) {
m_selectionGroup->addToGroup(selection.at(i));
selection.at(i)->setFlags(QGraphicsItem::ItemIsSelectable);
- AbstractClipItem *item = static_cast <AbstractClipItem *>(selection.at(i));
- itemStart = item->startPos().frames(m_document->fps());
- if (m_spacerStart == -1 || itemStart < m_spacerStart)
- m_spacerStart = itemStart;
}
}
QPointF top = m_selectionGroup->boundingRect().topLeft();
QDomElement transition = MainWindow::transitions.getEffectByName("Luma").cloneNode().toElement();
EffectsList::setParameter(transition, "reverse", "1");
slotAddTransition((ClipItem *) m_dragItem, info, transitiontrack, transition);
+ } else if ((m_operationMode == RESIZESTART || m_operationMode == RESIZEEND) && m_selectionGroup) {
+ resetSelectionGroup(false);
+ m_dragItem->setSelected(true);
}
m_blockRefresh = false;
void CustomTrackView::resetSelectionGroup(bool selectItems) {
if (m_selectionGroup) {
// delete selection group
+ bool snap = KdenliveSettings::snaptopoints();
+ KdenliveSettings::setSnaptopoints(false);
QList<QGraphicsItem *> children = m_selectionGroup->childItems();
for (int i = 0; i < children.count(); i++) {
children.at(i)->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
}
scene()->destroyItemGroup(m_selectionGroup);
m_selectionGroup = NULL;
+ KdenliveSettings::setSnaptopoints(snap);
}
}
void CustomTrackView::groupSelectedItems() {
- if (m_selectionGroup) kDebug() << "///// ERROR, TRYING TO OVERRIDE EXISTING GROUP";
+ if (m_selectionGroup) {
+ kDebug() << "///// ERROR, TRYING TO OVERRIDE EXISTING GROUP";
+ return;
+ }
QList<QGraphicsItem *> selection = m_scene->selectedItems();
if (selection.count() > 1) {
m_selectionGroup = new AbstractGroupItem(m_document->fps());
}
if (m_selectionGroup) {
- QPointF top = m_selectionGroup->boundingRect().topLeft();
- m_selectionGroup->setPos(top);
+ bool snap = KdenliveSettings::snaptopoints();
+ KdenliveSettings::setSnaptopoints(false);
+ QPointF top = m_selectionGroup->sceneBoundingRect().topLeft();
m_selectionGroup->translate(-top.x(), -top.y() + 1);
+ m_selectionGroup->setPos(top);
m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps());
m_selectionGroupInfo.track = m_selectionGroup->track();
+ KdenliveSettings::setSnaptopoints(snap);
}
} else resetSelectionGroup();
}
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);
}
}
void CustomTrackView::addTransition(ItemInfo transitionInfo, int endTrack, QDomElement params) {
- Transition *tr = new Transition(transitionInfo, endTrack, m_document->fps(), params);
+ Transition *tr = new Transition(transitionInfo, endTrack, m_document->fps(), params, true);
scene()->addItem(tr);
//kDebug() << "---- ADDING transition " << params.attribute("value");
resetSelectionGroup(false);
}
- m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), m_tracksHeight * m_document->tracksCount());
- setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
- verticalScrollBar()->setMaximum(m_tracksHeight * m_document->tracksCount());
+ int maxHeight = m_tracksHeight * m_document->tracksCount();
+ for (int i = 0; i < m_guides.count(); i++) {
+ QLineF l = m_guides.at(i)->line();
+ l.setP2(QPointF(l.x2(), maxHeight));
+ m_guides.at(i)->setLine(l);
+ }
+ m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), maxHeight);
+ setSceneRect(0, 0, sceneRect().width(), maxHeight);
QTimer::singleShot(300, this, SIGNAL(trackHeightChanged()));
-
+ viewport()->update();
//setFixedHeight(50 * m_tracksCount);
}
m_selectionGroup = new AbstractGroupItem(m_document->fps());
scene()->addItem(m_selectionGroup);
for (int i = 0; i < selection.count(); i++) {
- if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET)
+ if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET) {
m_selectionGroup->addToGroup(selection.at(i));
- selection.at(i)->setFlags(QGraphicsItem::ItemIsSelectable);
+ selection.at(i)->setFlags(QGraphicsItem::ItemIsSelectable);
+ }
}
// Move graphic items
qreal ydiff = 0 - (int) m_tracksHeight;
}
resetSelectionGroup(false);
- m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), m_tracksHeight * m_document->tracksCount());
- setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_document->tracksCount());
- verticalScrollBar()->setMaximum(m_tracksHeight * m_document->tracksCount());
+ int maxHeight = m_tracksHeight * m_document->tracksCount();
+ for (int i = 0; i < m_guides.count(); i++) {
+ QLineF l = m_guides.at(i)->line();
+ l.setP2(QPointF(l.x2(), maxHeight));
+ m_guides.at(i)->setLine(l);
+ }
+ m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), maxHeight);
+ setSceneRect(0, 0, sceneRect().width(), maxHeight);
QTimer::singleShot(300, this, SIGNAL(trackHeightChanged()));
viewport()->update();
}
emit displayMessage(i18n("You must be in an empty space to remove space (time=%1, track:%2)", m_document->timecode().getTimecodeFromFrames(mapToScene(m_menuPosition).x()), track), ErrorMessage);
return;
}
- int length = m_document->renderer()->mltGetSpaceLength(pos, m_document->tracksCount() - track);
+ int length = m_document->renderer()->mltGetSpaceLength(pos, m_document->tracksCount() - track, true);
//kDebug() << "// GOT LENGT; " << length;
if (length <= 0) {
emit displayMessage(i18n("You must be in an empty space to remove space (time=%1, track:%2)", m_document->timecode().getTimecodeFromFrames(mapToScene(m_menuPosition).x()), track), ErrorMessage);
return;
}
- InsertSpaceCommand *command = new InsertSpaceCommand(this, pos, track, GenTime(-length, m_document->fps()), true);
+
+ QRectF r(pos.frames(m_document->fps()), track * m_tracksHeight + m_tracksHeight / 2, sceneRect().width() - pos.frames(m_document->fps()), m_tracksHeight / 2 - 1);
+ QList<QGraphicsItem *> items = m_scene->items(r);
+
+ QList<ItemInfo> clipsToMove = QList<ItemInfo> ();
+ QList<ItemInfo> transitionsToMove = QList<ItemInfo> ();
+
+ for (int i = 0; i < items.count(); i++) {
+ if (items.at(i)->type() == AVWIDGET || items.at(i)->type() == TRANSITIONWIDGET) {
+ AbstractClipItem *item = static_cast <AbstractClipItem *>(items.at(i));
+ ItemInfo info = item->info();
+ if (item->type() == AVWIDGET) {
+ clipsToMove.append(info);
+ } else if (item->type() == TRANSITIONWIDGET) {
+ transitionsToMove.append(info);
+ }
+ }
+ }
+
+ InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, GenTime(-length, m_document->fps()), true);
m_commandStack->push(command);
}
ClipItem *item = getClipItemAt(pos, track);
if (item) pos = item->startPos();
- InsertSpaceCommand *command = new InsertSpaceCommand(this, pos, track, spaceDuration, true);
+ int minh = 0;
+ int maxh = sceneRect().height();
+ if (track != -1) {
+ minh = track * m_tracksHeight + m_tracksHeight / 2;
+ maxh = m_tracksHeight / 2 - 1;
+ }
+
+ QRectF r(pos.frames(m_document->fps()), minh, sceneRect().width() - pos.frames(m_document->fps()), maxh);
+ QList<QGraphicsItem *> items = m_scene->items(r);
+
+ QList<ItemInfo> clipsToMove = QList<ItemInfo> ();
+ QList<ItemInfo> transitionsToMove = QList<ItemInfo> ();
+
+ for (int i = 0; i < items.count(); i++) {
+ if (items.at(i)->type() == AVWIDGET || items.at(i)->type() == TRANSITIONWIDGET) {
+ AbstractClipItem *item = static_cast <AbstractClipItem *>(items.at(i));
+ ItemInfo info = item->info();
+ if (item->type() == AVWIDGET) {
+ clipsToMove.append(info);
+ } else if (item->type() == TRANSITIONWIDGET) {
+ transitionsToMove.append(info);
+ }
+ }
+ }
+
+ InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, spaceDuration, true);
m_commandStack->push(command);
}
-void CustomTrackView::insertSpace(const GenTime &pos, int track, const GenTime duration) {
+void CustomTrackView::insertSpace(QList<ItemInfo> clipsToMove, QList<ItemInfo> transToMove, int track, const GenTime duration, const GenTime offset) {
int diff = duration.frames(m_document->fps());
- QList<QGraphicsItem *> itemList;
- if (track == -1) itemList = scene()->items(pos.frames(m_document->fps()) , 1, sceneRect().width() - pos.frames(m_document->fps()), sceneRect().height());
- else itemList = scene()->items(pos.frames(m_document->fps()) , track * m_tracksHeight + 1, sceneRect().width() - pos.frames(m_document->fps()), m_tracksHeight - 2);
resetSelectionGroup();
m_selectionGroup = new AbstractGroupItem(m_document->fps());
scene()->addItem(m_selectionGroup);
- for (int i = 0; i < itemList.count(); i++) {
- if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) {
- m_selectionGroup->addToGroup(itemList.at(i));
- itemList.at(i)->setFlags(QGraphicsItem::ItemIsSelectable);
- }
- }
-
+ ClipItem *clip;
+ Transition *transition;
+
+ kDebug() << "/// STARTING SPACE INSERT";
+
+
+ // Create lists with start pos for each track
+ QMap <int, int> trackClipStartList;
+ QMap <int, int> trackTransitionStartList;
+
+ for (int i = 1; i < m_document->tracksCount() + 1; i++) {
+ trackClipStartList[i] = -1;
+ trackTransitionStartList[i] = -1;
+ }
+
+ if (!clipsToMove.isEmpty()) for (int i = 0; i < clipsToMove.count(); i++) {
+ kDebug() << "/// FETCHING CLIP: " << i;
+ clip = getClipItemAtStart(clipsToMove.at(i).startPos + offset, clipsToMove.at(i).track);
+ if (clip) {
+ m_selectionGroup->addToGroup(clip);
+ if (trackClipStartList.value(m_document->tracksCount() - clipsToMove.at(i).track) == -1 || clipsToMove.at(i).startPos.frames(m_document->fps()) < trackClipStartList.value(m_document->tracksCount() - clipsToMove.at(i).track))
+ trackClipStartList[m_document->tracksCount() - clipsToMove.at(i).track] = clipsToMove.at(i).startPos.frames(m_document->fps());
+ clip->setFlags(QGraphicsItem::ItemIsSelectable);
+ } else emit displayMessage(i18n("Cannot move clip at position %1, track %2", m_document->timecode().getTimecodeFromFrames(clipsToMove.at(i).startPos.frames(m_document->fps())), clipsToMove.at(i).track), ErrorMessage);
+ }
+ if (!transToMove.isEmpty()) for (int i = 0; i < transToMove.count(); i++) {
+ kDebug() << "/// FETCHING TRANS: " << i;
+ transition = getTransitionItemAtStart(transToMove.at(i).startPos + offset, transToMove.at(i).track);
+ if (transition) {
+ m_selectionGroup->addToGroup(transition);
+ if (trackTransitionStartList.value(m_document->tracksCount() - transToMove.at(i).track) == -1 || transToMove.at(i).startPos.frames(m_document->fps()) < trackTransitionStartList.value(m_document->tracksCount() - transToMove.at(i).track))
+ trackTransitionStartList[m_document->tracksCount() - transToMove.at(i).track] = transToMove.at(i).startPos.frames(m_document->fps());
+ transition->setFlags(QGraphicsItem::ItemIsSelectable);
+ } else emit displayMessage(i18n("Cannot move transition at position %1, track %2", m_document->timecode().getTimecodeFromFrames(transToMove.at(i).startPos.frames(m_document->fps())), transToMove.at(i).track), ErrorMessage);
+ }
+ kDebug() << "/// STARTING SPACE DONE";
m_selectionGroup->translate(diff, 0);
resetSelectionGroup(false);
+ kDebug() << "/// STARTING SPACE DONE2";
if (track != -1) track = m_document->tracksCount() - track;
- m_document->renderer()->mltInsertSpace(pos, track, duration);
+ m_document->renderer()->mltInsertSpace(trackClipStartList, trackTransitionStartList, track, duration, offset);
}
void CustomTrackView::deleteClip(const QString &clipId) {
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) {
- kDebug() << "// MOUSE RELEASED, MODE: " << m_moveOpMode;
if (m_moveOpMode == SEEK) m_moveOpMode = NONE;
QGraphicsView::mouseReleaseEvent(event);
if (m_scrollTimer.isActive()) m_scrollTimer.stop();
// We are moving all tracks
track = -1;
}
- ClipItem *item = getClipItemAt(mappedClick, track);
- if (item) mappedClick = item->startPos().frames(m_document->fps());
- int diff = m_selectionGroup->pos().x() - m_spacerStart;//endClick - mappedClick;
- kDebug() << "// MOVING SPACER DIFF:" << diff;
- if (diff < 0) mappedClick += diff;
- InsertSpaceCommand *command = new InsertSpaceCommand(this, GenTime(mappedClick, m_document->fps()), track, GenTime(diff, m_document->fps()), false);
- m_commandStack->push(command);
- if (track != -1) track = m_document->tracksCount() - track;
- m_document->renderer()->mltInsertSpace(GenTime(mappedClick, m_document->fps()), track, GenTime(diff, m_document->fps()));
+
+ int startPos = (int) m_selectionGroup->boundingRect().topLeft().x();
+ int diff = ((int) m_selectionGroup->pos().x()) - startPos;
+ //kDebug()<<"//////// SPACER DIFF: "<<diff<<<<m_selectionGroup->boundingRect().topLeft();
+ if (diff != 0) {
+ QList<QGraphicsItem *> items = m_selectionGroup->childItems();
+
+ QList<ItemInfo> clipsToMove = QList<ItemInfo> ();
+ QList<ItemInfo> transitionsToMove = QList<ItemInfo> ();
+
+ // Create lists with start pos for each track
+ QMap <int, int> trackClipStartList;
+ QMap <int, int> trackTransitionStartList;
+
+ for (int i = 1; i < m_document->tracksCount() + 1; i++) {
+ trackClipStartList[i] = -1;
+ trackTransitionStartList[i] = -1;
+ }
+
+ for (int i = 0; i < items.count(); i++) {
+ AbstractClipItem *item = static_cast <AbstractClipItem *>(items.at(i));
+ ItemInfo info = item->info();
+ if (item->type() == AVWIDGET) {
+ clipsToMove.append(info);
+ if (trackClipStartList.value(m_document->tracksCount() - info.track) == -1 || info.startPos.frames(m_document->fps()) < trackClipStartList.value(m_document->tracksCount() - info.track))
+ trackClipStartList[m_document->tracksCount() - info.track] = info.startPos.frames(m_document->fps());
+ } else if (item->type() == TRANSITIONWIDGET) {
+ transitionsToMove.append(info);
+ if (trackClipStartList.value(m_document->tracksCount() - info.track) == -1 || info.startPos.frames(m_document->fps()) < trackTransitionStartList.value(m_document->tracksCount() - info.track))
+ trackTransitionStartList[m_document->tracksCount() - info.track] = info.startPos.frames(m_document->fps());
+ }
+ }
+
+ InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, GenTime(diff, m_document->fps()), false);
+ m_commandStack->push(command);
+ if (track != -1) track = m_document->tracksCount() - track;
+ m_document->renderer()->mltInsertSpace(trackClipStartList, trackTransitionStartList, track, GenTime(diff, m_document->fps()), GenTime());
+ }
resetSelectionGroup(false);
m_operationMode = NONE;
} else if (m_operationMode == RUBBERSELECTION) {
+ kDebug() << "// END RUBBER SELECT";
resetSelectionGroup();
groupSelectedItems();
m_operationMode = NONE;
ClipItem *item = static_cast <ClipItem *>(m_dragItem);
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())), item->baseClip()->producer(info.track));
if (success) {
- MoveClipCommand *command = new MoveClipCommand(this, m_dragItemInfo, info, false, false);
- m_commandStack->push(command);
- if (item->baseClip()->isTransparent()) {
- // Also move automatic transition
- Transition *tr = getTransitionItemAt((int) m_dragItemInfo.startPos.frames(m_document->fps()), m_dragItemInfo.track);
+ QUndoCommand *moveCommand = new QUndoCommand();
+ moveCommand->setText(i18n("Move clip"));
+ new MoveClipCommand(this, m_dragItemInfo, info, false, moveCommand);
+ // Also move automatic transitions (on lower track)
+ Transition *tr = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track);
+ if (tr && tr->isAutomatic()) {
+ 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 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() < 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));
- m_document->renderer()->mltMoveTransition(tr->transitionTag(), m_document->tracksCount() - m_dragItemInfo.track, m_document->tracksCount() - info.track, tr->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
- tr->setPos((int) info.startPos.frames(m_document->fps()), (int)(info.track * m_tracksHeight + 1));
+ 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 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);
+ }
+ }
+ // Also move automatic transitions (on upper track)
+ tr = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
+ if (m_dragItemInfo.track == info.track && tr && tr->isAutomatic() && (m_document->tracksCount() - tr->transitionEndTrack()) == m_dragItemInfo.track) {
+ ItemInfo trInfo = tr->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.startPos = m_dragItem->startPos();
+ ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
+ 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);
+ }
+ }
+ 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 trInfo = tr->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.endPos = m_dragItem->endPos();
+ ClipItem * upperClip = getClipItemAt(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
+ 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);
+ }
}
}
+ m_commandStack->push(moveCommand);
} else {
// undo last move and emit error message
MoveClipCommand *command = new MoveClipCommand(this, info, m_dragItemInfo, true);
resizeinfo.track = m_document->tracksCount() - resizeinfo.track;
bool success = m_document->renderer()->mltResizeClipStart(resizeinfo, m_dragItem->startPos() - m_dragItemInfo.startPos);
if (success) {
+ QUndoCommand *resizeCommand = new QUndoCommand();
+ resizeCommand->setText(i18n("Resize clip"));
+
+ // Check if there is an automatic transition on that clip (lower track)
+ Transition *transition = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track);
+ if (transition && transition->isAutomatic()) {
+ ItemInfo trInfo = transition->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.startPos = m_dragItem->startPos();
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ }
+ // Check if there is an automatic transition on that clip (upper track)
+ transition = getTransitionItemAtStart(m_dragItemInfo.startPos, m_dragItemInfo.track - 1);
+ if (transition && transition->isAutomatic() && (m_document->tracksCount() - transition->transitionEndTrack()) == m_dragItemInfo.track) {
+ ItemInfo trInfo = transition->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.startPos = m_dragItem->startPos();
+ 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));
- ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false);
- m_commandStack->push(command);
+ new ResizeClipCommand(this, m_dragItemInfo, info, false, resizeCommand);
+ m_commandStack->push(resizeCommand);
} else {
m_dragItem->resizeStart((int) m_dragItemInfo.startPos.frames(m_document->fps()));
emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false);
m_commandStack->push(command);
Transition *transition = static_cast <Transition *>(m_dragItem);
- m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItemInfo.track), 0, m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
+ m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItemInfo.track), transition->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
}
//m_document->renderer()->doRefresh();
resizeinfo.track = m_document->tracksCount() - resizeinfo.track;
bool success = m_document->renderer()->mltResizeClipEnd(resizeinfo, resizeinfo.endPos - resizeinfo.startPos);
if (success) {
- ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false);
- m_commandStack->push(command);
+ QUndoCommand *resizeCommand = new QUndoCommand();
+ resizeCommand->setText(i18n("Resize clip"));
+
+ // Check if there is an automatic transition on that clip (lower track)
+ Transition *tr = getTransitionItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track);
+ if (tr && tr->isAutomatic()) {
+ ItemInfo trInfo = tr->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.endPos = m_dragItem->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 && tr->isAutomatic() && (m_document->tracksCount() - tr->transitionEndTrack()) == m_dragItemInfo.track) {
+ ItemInfo trInfo = tr->info();
+ ItemInfo newTrInfo = trInfo;
+ newTrInfo.endPos = m_dragItem->endPos();
+ ClipItem * upperClip = getClipItemAtEnd(m_dragItemInfo.endPos, m_dragItemInfo.track - 1);
+ if (!upperClip || !upperClip->baseClip()->isTransparent()) {
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ }
+ }
+
+ new ResizeClipCommand(this, m_dragItemInfo, info, false, resizeCommand);
+ m_commandStack->push(resizeCommand);
updateClipFade(static_cast <ClipItem *>(m_dragItem), true);
} else {
m_dragItem->resizeEnd((int) m_dragItemInfo.endPos.frames(m_document->fps()));
}
}
+ClipItem *CustomTrackView::getClipItemAtEnd(GenTime pos, int track) {
+ 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++) {
+ if (list.at(i)->type() == AVWIDGET) {
+ ClipItem *test = static_cast <ClipItem *>(list.at(i));
+ if (test->endPos() == pos) clip = test;
+ break;
+ }
+ }
+ return clip;
+}
+
+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++) {
+ if (list.at(i)->type() == AVWIDGET) {
+ ClipItem *test = static_cast <ClipItem *>(list.at(i));
+ if (test->startPos() == pos) clip = test;
+ break;
+ }
+ }
+ return clip;
+}
+
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;
return getTransitionItemAt(framepos, track);
}
+Transition *CustomTrackView::getTransitionItemAtEnd(GenTime pos, int track) {
+ 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++) {
+ if (list.at(i)->type() == TRANSITIONWIDGET) {
+ Transition *test = static_cast <Transition *>(list.at(i));
+ if (test->endPos() == pos) clip = test;
+ break;
+ }
+ }
+ return clip;
+}
+
+Transition *CustomTrackView::getTransitionItemAtStart(GenTime pos, int track) {
+ QList<QGraphicsItem *> list = scene()->items(QPointF(pos.frames(m_document->fps()), (track + 1) * m_tracksHeight));
+ Transition *clip = NULL;
+ for (int i = 0; i < list.size(); ++i) {
+ if (list.at(i)->type() == TRANSITIONWIDGET) {
+ Transition *test = static_cast <Transition *>(list.at(i));
+ if (test->startPos() == pos) clip = test;
+ break;
+ }
+ }
+ return clip;
+}
+
void CustomTrackView::moveClip(const ItemInfo start, const ItemInfo end) {
if (m_selectionGroup) resetSelectionGroup(false);
ClipItem *item = getClipItemAt((int) start.startPos.frames(m_document->fps()) + 1, start.track);
if (!item) {
emit displayMessage(i18n("Cannot move clip at time: %1 on track %2", m_document->timecode().getTimecodeFromFrames(start.startPos.frames(m_document->fps())), start.track), ErrorMessage);
- kDebug() << "---------------- ERROR, CANNOT find clip to move at.. ";// << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2;
+ kDebug() << "---------------- ERROR, CANNOT find clip to move at.. ";
return;
}
- //kDebug() << "---------------- Move CLIP FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << startPos.y() << " TO " << endPos.y();
-
bool success = m_document->renderer()->mltMoveClip((int)(m_document->tracksCount() - start.track), (int)(m_document->tracksCount() - end.track), (int) start.startPos.frames(m_document->fps()), (int)end.startPos.frames(m_document->fps()), item->baseClip()->producer(end.track));
if (success) {
+ bool snap = KdenliveSettings::snaptopoints();
+ KdenliveSettings::setSnaptopoints(false);
item->setPos((int) end.startPos.frames(m_document->fps()), (int)(end.track * m_tracksHeight + 1));
m_scene->clearSelection();
item->setSelected(true);
tr->setPos((int) end.startPos.frames(m_document->fps()), (int)(end.track * m_tracksHeight + 1));
}
}
+ KdenliveSettings::setSnaptopoints(snap);
} else {
// undo last move and emit error message
emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(end.startPos.frames(m_document->fps()))), ErrorMessage);
}
+ kDebug() << " // MOVED CLIP TO: " << end.startPos.frames(25) << ", ITEM START: " << item->startPos().frames(25);
}
void CustomTrackView::moveGroup(QList <ItemInfo> startClip, QList <ItemInfo> startTransition, const GenTime offset, const int trackOffset, bool reverseMove) {
QPointF pos = m_selectionGroup->pos();
qreal posx = pos.x() + offset.frames(m_document->fps());
qreal posy = pos.y() + trackOffset * (qreal) m_tracksHeight;
+ bool snap = KdenliveSettings::snaptopoints();
+ KdenliveSettings::setSnaptopoints(false);
+
m_selectionGroup->setPos(posx, posy);
QPointF top = m_selectionGroup->sceneBoundingRect().topLeft();
m_document->renderer()->mltAddTransition(tr->transitionTag(), newTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
}
}
+ KdenliveSettings::setSnaptopoints(snap);
}
}
return;
}
//kDebug() << "---------------- Move TRANSITION FROM: " << startPos.x() << ", END:" << endPos.x() << ",TRACKS: " << oldtrack << " TO " << newtrack;
-
+ bool snap = KdenliveSettings::snaptopoints();
+ KdenliveSettings::setSnaptopoints(false);
//kDebug()<<"/// RESIZE TRANS START: ("<< startPos.x()<<"x"<< startPos.y()<<") / ("<<endPos.x()<<"x"<< endPos.y()<<")";
if (end.endPos - end.startPos == start.endPos - start.startPos) {
// Transition was moved
} else if (end.endPos == start.endPos) {
// Transition start resize
item->resizeStart((int) end.startPos.frames(m_document->fps()));
- } else {
+ } else if (end.startPos == start.startPos) {
// Transition end resize;
item->resizeEnd((int) end.endPos.frames(m_document->fps()));
+ } else {
+ // Move & resize
+ item->setPos((int) end.startPos.frames(m_document->fps()), (end.track) * m_tracksHeight + 1);
+ item->resizeStart((int) end.startPos.frames(m_document->fps()));
+ item->resizeEnd((int) end.endPos.frames(m_document->fps()));
}
//item->moveTransition(GenTime((int) (endPos.x() - startPos.x()), m_document->fps()));
+ KdenliveSettings::setSnaptopoints(snap);
item->updateTransitionEndTrack(getPreviousVideoTrack(end.track));
m_document->renderer()->mltMoveTransition(item->transitionTag(), m_document->tracksCount() - start.track, m_document->tracksCount() - end.track, item->transitionEndTrack(), start.startPos, start.endPos, end.startPos, end.endPos);
}
kDebug() << "---------------- ERROR, CANNOT find clip to resize at... "; // << startPos;
return;
}
+ bool snap = KdenliveSettings::snaptopoints();
+ KdenliveSettings::setSnaptopoints(false);
if (resizeClipStart) {
ItemInfo clipinfo = item->info();
clipinfo.track = m_document->tracksCount() - clipinfo.track;
} else emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
}
m_document->renderer()->doRefresh();
+ KdenliveSettings::setSnaptopoints(snap);
}
void CustomTrackView::updateClipFade(ClipItem * item, bool updateFadeOut) {
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);
void CustomTrackView::clipEnd() {
ClipItem *item = getMainActiveClip();
if (item != NULL) {
- setCursorPos((int) item->endPos().frames(m_document->fps()));
+ setCursorPos((int) item->endPos().frames(m_document->fps()) - 1);
checkScrolling();
}
}
ItemInfo startInfo = clip->info();
ItemInfo endInfo = clip->info();
endInfo.startPos = GenTime(m_cursorPos, m_document->fps());
+ if (endInfo.startPos >= startInfo.endPos) {
+ // Check for invalid resize
+ emit displayMessage(i18n("Invalid action"), ErrorMessage);
+ return;
+ } else if (endInfo.startPos < startInfo.startPos) {
+ int length = m_document->renderer()->mltGetSpaceLength(endInfo.startPos, m_document->tracksCount() - startInfo.track, false);
+ if (length < (startInfo.startPos - endInfo.startPos).frames(m_document->fps())) {
+ emit displayMessage(i18n("Invalid action"), ErrorMessage);
+ return;
+ }
+ }
ResizeClipCommand *command = new ResizeClipCommand(this, startInfo, endInfo, true);
m_commandStack->push(command);
}
ItemInfo startInfo = clip->info();
ItemInfo endInfo = clip->info();
endInfo.endPos = GenTime(m_cursorPos, m_document->fps());
+ if (endInfo.endPos <= startInfo.startPos) {
+ // Check for invalid resize
+ emit displayMessage(i18n("Invalid action"), ErrorMessage);
+ return;
+ } else if (endInfo.endPos > startInfo.endPos) {
+ int length = m_document->renderer()->mltGetSpaceLength(endInfo.endPos, m_document->tracksCount() - startInfo.track, false);
+ if (length < (endInfo.endPos - startInfo.endPos).frames(m_document->fps())) {
+ emit displayMessage(i18n("Invalid action"), ErrorMessage);
+ return;
+ }
+ }
+
+
+
ResizeClipCommand *command = new ResizeClipCommand(this, startInfo, endInfo, true);
m_commandStack->push(command);
}
d.setWindowTitle(i18n("Insert Track"));
if (d.exec() == QDialog::Accepted) {
+ ix = view.track_nb->value();
if (view.before_select->currentIndex() == 1) {
ix++;
}
m_commandStack->push(changeTrack);
}
+void CustomTrackView::autoTransition() {
+ QList<QGraphicsItem *> itemList = scene()->selectedItems();
+ if (itemList.count() != 1 || itemList.at(0)->type() != TRANSITIONWIDGET) {
+ emit displayMessage(i18n("You must select one transition for this action"), ErrorMessage);
+ return;
+ }
+ Transition *tr = static_cast <Transition*>(itemList.at(0));
+ tr->setAutomatic(!tr->isAutomatic());
+ QDomElement transition = tr->toXML();
+ 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"