info.cropStart = GenTime(list.at(1).toInt(), m_document->fps());
info.endPos = info.startPos + GenTime(list.at(2).toInt() - list.at(1).toInt(), m_document->fps());
info.track = (int)(pos.y() / m_tracksHeight);
- ClipItem *item = new ClipItem(clip, info, m_document->fps());
+ ClipItem *item = new ClipItem(clip, info, m_document->fps(), 1.0);
m_selectionGroup->addToGroup(item);
//TODO: check if we do not overlap another clip when first dropping in timeline
// if (insertPossible(m_selectionGroup, event->pos()))
info.startPos = GenTime(pos.x(), m_document->fps());
info.endPos = info.startPos + clip->duration();
info.track = (int)(pos.y() / m_tracksHeight);
- ClipItem *item = new ClipItem(clip, info, m_document->fps());
+ ClipItem *item = new ClipItem(clip, info, m_document->fps(), 1.0);
pos.setX(pos.x() + clip->duration().frames(m_document->fps()));
m_selectionGroup->addToGroup(item);
}
}
void CustomTrackView::slotAddTransition(ClipItem* clip, ItemInfo transitionInfo, int endTrack, QDomElement transition) {
+ if (transitionInfo.startPos >= transitionInfo.endPos) {
+ emit displayMessage(i18n("Invalid transition"), ErrorMessage);
+ return;
+ }
AddTransitionCommand* command = new AddTransitionCommand(this, transitionInfo, endTrack, transition, false, true);
m_commandStack->push(command);
m_document->setModified(true);
void CustomTrackView::addTransition(ItemInfo transitionInfo, int endTrack, QDomElement params) {
Transition *tr = new Transition(transitionInfo, endTrack, m_document->fps(), params, true);
- scene()->addItem(tr);
-
//kDebug() << "---- ADDING transition " << params.attribute("value");
- m_document->renderer()->mltAddTransition(tr->transitionTag(), endTrack, m_document->tracksCount() - transitionInfo.track, transitionInfo.startPos, transitionInfo.endPos, tr->toXML());
- m_document->setModified(true);
+ if (m_document->renderer()->mltAddTransition(tr->transitionTag(), endTrack, m_document->tracksCount() - transitionInfo.track, transitionInfo.startPos, transitionInfo.endPos, tr->toXML())) {
+ scene()->addItem(tr);
+ m_document->setModified(true);
+ } else {
+ emit displayMessage(i18n("Cannot add transition"), ErrorMessage);
+ delete tr;
+ }
}
void CustomTrackView::deleteTransition(ItemInfo transitionInfo, int endTrack, QDomElement params) {
// add transparency transition
int endTrack = getPreviousVideoTrack(info.track);
Transition *tr = new Transition(info, endTrack, m_document->fps(), MainWindow::transitions.getEffectByTag("composite", "alphatransparency"), true);
- scene()->addItem(tr);
- m_document->renderer()->mltAddTransition(tr->transitionTag(), endTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
+ if (m_document->renderer()->mltAddTransition(tr->transitionTag(), endTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML())) {
+ scene()->addItem(tr);
+ } else {
+ emit displayMessage(i18n("Cannot add transition"), ErrorMessage);
+ delete tr;
+ }
}
info.track = m_document->tracksCount() - item->track();
m_document->renderer()->mltInsertClip(info, item->xml(), item->baseClip()->producer(item->track()));
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 (newTrInfo.startPos < newTrInfo.endPos) 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));
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);
+ if (newTrInfo.startPos < newTrInfo.endPos)
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
}
}
// Also move automatic transitions (on upper track)
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);
+ }
+ if (newTrInfo.startPos < newTrInfo.endPos) new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
}
- 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
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);
+ }
+ if (newTrInfo.startPos < newTrInfo.endPos) new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
}
- new MoveTransitionCommand(this, trInfo, newTrInfo, true, moveCommand);
}
}
m_commandStack->push(moveCommand);
}
}
if (m_dragItem->type() == TRANSITIONWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) {
- MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false);
- m_commandStack->push(command);
- Transition *transition = (Transition *) m_dragItem;
- transition->updateTransitionEndTrack(getPreviousVideoTrack(m_dragItem->track()));
- m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItem->track()), transition->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
+ Transition *transition = static_cast <Transition *>(m_dragItem);
+ if (!m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItem->track()), transition->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos)) {
+ // Moving transition failed, revert to previous position
+ emit displayMessage(i18n("Cannot move transition"), ErrorMessage);
+ transition->setPos((int) m_dragItemInfo.startPos.frames(m_document->fps()), (m_dragItemInfo.track) * m_tracksHeight + 1);
+ } else {
+ MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false);
+ m_commandStack->push(command);
+ transition->updateTransitionEndTrack(getPreviousVideoTrack(m_dragItem->track()));
+ }
}
} else {
// Moving several clips. We need to delete them and readd them to new position,
ItemInfo trInfo = transition->info();
ItemInfo newTrInfo = trInfo;
newTrInfo.startPos = m_dragItem->startPos();
- new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ if (newTrInfo.startPos < newTrInfo.endPos)
+ 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);
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()) && newTrInfo.startPos < newTrInfo.endPos) {
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
+ }
}
updateClipFade(static_cast <ClipItem *>(m_dragItem));
new ResizeClipCommand(this, m_dragItemInfo, info, false, resizeCommand);
emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
}
} else if (m_dragItem->type() == TRANSITIONWIDGET) {
- 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), transition->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
+ if (!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)) {
+ // Cannot resize transition
+ transition->resizeStart((int) m_dragItemInfo.startPos.frames(m_document->fps()));
+ emit displayMessage(i18n("Cannot resize transition"), ErrorMessage);
+ } else {
+ MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false);
+ m_commandStack->push(command);
+ }
+
}
//m_document->renderer()->doRefresh();
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);
+ if (newTrInfo.endPos > newTrInfo.startPos) 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()) && newTrInfo.endPos > newTrInfo.startPos) {
+ new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
}
- new MoveTransitionCommand(this, trInfo, newTrInfo, true, resizeCommand);
}
new ResizeClipCommand(this, m_dragItemInfo, info, false, resizeCommand);
emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
}
} else if (m_dragItem->type() == TRANSITIONWIDGET) {
- 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);
+ if (!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)) {
+ // Cannot resize transition
+ transition->resizeEnd((int) m_dragItemInfo.endPos.frames(m_document->fps()));
+ emit displayMessage(i18n("Cannot resize transition"), ErrorMessage);
+ } else {
+ MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false);
+ m_commandStack->push(command);
+ }
}
//m_document->renderer()->doRefresh();
} else if (m_operationMode == FADEIN) {
}
QUndoCommand *changeSelected = new QUndoCommand();
changeSelected->setText("Edit clip speed");
+ int count = 0;
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
ItemInfo info = item->info();
- int percent = QInputDialog::getInteger(this, i18n("Edit Clip Speed"), i18n("New speed (percents)"), item->speed() * 100, 1, 300);
+ bool ok;
+ int percent = QInputDialog::getInteger(this, i18n("Edit Clip Speed"), i18n("New speed (percents)"), item->speed() * 100, 1, 300, 1, &ok);
double speed = (double) percent / 100.0;
- if (item->speed() != speed)
+ if (ok && item->speed() != speed) {
+ count++;
new ChangeSpeedCommand(this, info, item->speed(), speed, item->clipProducer(), true, changeSelected);
+ }
}
}
- m_commandStack->push(changeSelected);
+ if (count > 0) m_commandStack->push(changeSelected);
+ else delete changeSelected;
}
void CustomTrackView::doChangeClipSpeed(ItemInfo info, const double speed, const double oldspeed, const QString &id) {
emit displayMessage(i18n("No clip copied"), ErrorMessage);
return;
}
- ClipItem *item = new ClipItem(baseclip, info, m_document->fps());
+ ClipItem *item = new ClipItem(baseclip, info, m_document->fps(), xml.attribute("speed", "1").toDouble());
item->setEffectList(effects);
scene()->addItem(item);
if (item->baseClip()->isTransparent()) {
// add transparency transition
int endTrack = getPreviousVideoTrack(info.track);
Transition *tr = new Transition(info, endTrack, m_document->fps(), MainWindow::transitions.getEffectByTag("composite", "alphatransparency"), true);
- scene()->addItem(tr);
- m_document->renderer()->mltAddTransition(tr->transitionTag(), endTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML());
+ if (m_document->renderer()->mltAddTransition(tr->transitionTag(), endTrack, m_document->tracksCount() - info.track, info.startPos, info.endPos, tr->toXML())) scene()->addItem(tr);
+ else {
+ emit displayMessage(i18n("Cannot add transition"), ErrorMessage);
+ delete tr;
+ }
+
}
baseclip->addReference();
}
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;
return;
}
QPoint position;
- if (m_menuPosition.isNull()) position = mapFromGlobal(QCursor::pos());
- else position = m_menuPosition;
+ if (m_menuPosition.isNull()) {
+ position = mapFromGlobal(QCursor::pos());
+ if (!underMouse() || position.y() > m_tracksHeight * m_document->tracksCount()) {
+ emit displayMessage(i18n("Cannot paste selected clips"), ErrorMessage);
+ return;
+ }
+ } else position = m_menuPosition;
GenTime pos = GenTime((int)(mapToScene(position).x()), m_document->fps());
int track = (int)(position.y() / m_tracksHeight);
ItemInfo first = m_copiedItems.at(0)->info();
info.endPos = tr->endPos() + offset;
info.track = tr->track() + trackOffset;
if (canBePastedTo(info, TRANSITIONWIDGET)) {
- new AddTransitionCommand(this, info, tr->transitionEndTrack() + trackOffset, tr->toXML(), false, true, pasteClips);
+ if (info.startPos >= info.endPos) {
+ emit displayMessage(i18n("Invalid transition"), ErrorMessage);
+ } else new AddTransitionCommand(this, info, tr->transitionEndTrack() + trackOffset, tr->toXML(), false, true, pasteClips);
} else emit displayMessage(i18n("Cannot paste transition to selected place"), ErrorMessage);
}
}