#include "addtransitioncommand.h"
#include "edittransitioncommand.h"
#include "editkeyframecommand.h"
+#include "changespeedcommand.h"
#include "addmarkercommand.h"
#include "razorclipcommand.h"
#include "kdenlivesettings.h"
void CustomTrackView::deleteEffect(int track, GenTime pos, QDomElement effect) {
QString index = effect.attribute("kdenlive_ix");
- if (!m_document->renderer()->mltRemoveEffect(track, pos, index)) {
+ if (effect.attribute("disabled") != "1" && !m_document->renderer()->mltRemoveEffect(track, pos, index)) {
emit displayMessage(i18n("Problem deleting effect"), ErrorMessage);
return;
}
newPos.cropStart = item->cropStart() + (cutTime - info.startPos);
newPos.track = info.track;
item->resizeEnd(cutPos, m_scale);
- ClipItem *dup = new ClipItem(item->baseClip(), newPos, m_scale, m_document->fps());
+ ClipItem *dup = item->clone(m_scale, newPos);
scene()->addItem(dup);
m_document->renderer()->mltCutClip(m_tracksList.count() - info.track, cutTime);
item->baseClip()->addReference();
info.startPos = GenTime((int)(mapToScene(pos).x() / m_scale), m_document->fps());
info.endPos = info.startPos + clip->duration();
info.track = (int)(pos.y() / m_tracksHeight);
- //kDebug()<<"------------ ADDING CLIP ITEM----: "<<info.startPos.frames(25)<<", "<<info.endPos.frames(25)<<", "<<info.track;
+ kDebug() << "------------ ADDING CLIP ITEM----: " << info.startPos.frames(25) << ", " << info.endPos.frames(25) << ", " << info.track;
m_dropItem = new ClipItem(clip, info, m_scale, m_document->fps());
scene()->addItem(m_dropItem);
}
void CustomTrackView::dropEvent(QDropEvent * event) {
if (m_dropItem) {
- AddTimelineClipCommand *command = new AddTimelineClipCommand(this, m_dropItem->xml(), m_dropItem->clipProducer(), m_dropItem->info(), false, false);
+ AddTimelineClipCommand *command = new AddTimelineClipCommand(this, m_dropItem->xml(), m_dropItem->clipProducer(), m_dropItem->info(), m_dropItem->effectList(), false, false);
m_commandStack->push(command);
m_dropItem->baseClip()->addReference();
m_document->updateClip(m_dropItem->baseClip()->getId());
- // kDebug()<<"IIIIIIIIIIIIIIIIIIIIIIII TRAX CNT: "<<m_tracksList.count()<<", DROP: "<<m_dropItem->track();
- m_document->renderer()->mltInsertClip(m_tracksList.count() - m_dropItem->track(), m_dropItem->startPos(), m_dropItem->cropStart(), m_dropItem->xml());
+ ItemInfo info;
+ info = m_dropItem->info();
+ info.track = m_tracksList.count() - m_dropItem->track();
+ //kDebug()<<"IIIIIIIIIIIIIIIIIIIIIIII TRAX CNT: "<<m_tracksList.count()<<", DROP: "<<m_dropItem->track();
+ m_document->renderer()->mltInsertClip(info, m_dropItem->xml(), m_dropItem->baseClip()->producer());
+ //if (m_dropItem->baseClip()->isTransparent()) m_document->renderer()->mltAddClipTransparency(info, getPreviousVideoTrack(m_dropItem->track()), m_dropItem->baseClip()->getId());
+ m_dropItem = NULL;
m_document->setModified(true);
} else QGraphicsView::dropEvent(event);
m_dropItem = NULL;
if (itemList.at(i)->type() == AVWIDGET) {
ClipItem *item = (ClipItem *)itemList.at(i);
if (item->clipProducer() == clipId) {
- AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), true, true);
+ AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), true, true);
m_commandStack->push(command);
//delete item;
}
info.track = info.track - trackOffset;
if (item->type() == AVWIDGET) {
ClipItem *clip = static_cast <ClipItem*>(item);
- new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, false, true, moveClips);
+ new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), false, true, moveClips);
m_document->renderer()->mltRemoveClip(m_tracksList.count() - info.track, info.startPos);
} else {
Transition *tr = static_cast <Transition*>(item);
AbstractClipItem *item = m_selectedClipList.at(i);
if (item->type() == AVWIDGET) {
ClipItem *clip = static_cast <ClipItem*>(item);
- new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), item->info(), false, false, moveClips);
- m_document->renderer()->mltInsertClip(m_tracksList.count() - item->track(), item->startPos(), item->cropStart(), clip->xml());
+ new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), item->info(), clip->effectList(), false, false, moveClips);
+ ItemInfo info = item->info();
+ info.track = m_tracksList.count() - item->track();
+ m_document->renderer()->mltInsertClip(info, clip->xml(), clip->baseClip()->producer());
} else {
Transition *tr = static_cast <Transition*>(item);
ItemInfo transitionInfo = tr->info();
} else if (m_operationMode == RESIZESTART && m_dragItem->startPos() != m_dragItemInfo.startPos) {
// resize start
if (m_dragItem->type() == AVWIDGET) {
- m_document->renderer()->mltResizeClipStart(m_tracksList.count() - m_dragItem->track(), m_dragItem->endPos(), m_dragItem->startPos(), m_dragItemInfo.startPos, m_dragItem->cropStart(), m_dragItem->cropStart() + m_dragItem->endPos() - m_dragItem->startPos());
- updateClipFade((ClipItem *) m_dragItem);
- ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false);
- m_commandStack->push(command);
+ bool success = m_document->renderer()->mltResizeClipStart(m_tracksList.count() - m_dragItem->track(), m_dragItem->endPos(), m_dragItem->startPos(), m_dragItemInfo.startPos, m_dragItem->cropStart(), m_dragItem->cropStart() + m_dragItem->endPos() - m_dragItem->startPos());
+ if (success) {
+ updateClipFade((ClipItem *) m_dragItem);
+ ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false);
+ m_commandStack->push(command);
+ }
+ else {
+ m_dragItem->resizeStart((int) m_dragItemInfo.startPos.frames(m_document->fps()), m_scale);
+ 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);
deleteSelected->setText("Delete selected items");
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
- ClipItem *item = static_cast <ClipItem *> (itemList.at(i));
- new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), true, true, deleteSelected);
+ ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
+ new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), true, true, deleteSelected);
} else if (itemList.at(i)->type() == TRANSITIONWIDGET) {
- Transition *item = static_cast <Transition *> (itemList.at(i));
+ Transition *item = static_cast <Transition *>(itemList.at(i));
ItemInfo info;
info.startPos = item->startPos();
info.endPos = item->endPos();
m_commandStack->push(deleteSelected);
}
+void CustomTrackView::changeClipSpeed() {
+ QList<QGraphicsItem *> itemList = scene()->selectedItems();
+ if (itemList.count() == 0) {
+ emit displayMessage(i18n("Select clip to change speed"), ErrorMessage);
+ return;
+ }
+ QUndoCommand *changeSelected = new QUndoCommand();
+ changeSelected->setText("Edit clip speed");
+ 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)"), 100, 1, 300);
+ double speed = (double) percent / 100.0;
+ if (item->speed() != speed)
+ new ChangeSpeedCommand(this, info, item->speed(), speed, item->clipProducer(), true, changeSelected);
+ }
+ }
+ m_commandStack->push(changeSelected);
+}
+
+void CustomTrackView::doChangeClipSpeed(ItemInfo info, double speed, int id) {
+ DocClipBase *baseclip = m_document->clipManager()->getClipById(id);
+ ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()) + 1, info.track);
+ info.track = m_tracksList.count() - item->track();
+ m_document->renderer()->mltChangeClipSpeed(info, speed, baseclip->producer());
+ item->setSpeed(speed);
+ GenTime maxDuration = item->maxDuration();
+ if (maxDuration < item->duration()) {
+ info = item->info();
+ ItemInfo endInfo = info;
+ endInfo.endPos = info.startPos + maxDuration;
+ ResizeClipCommand *command = new ResizeClipCommand(this, info, endInfo, true);
+ m_commandStack->push(command);
+ }
+}
+
void CustomTrackView::cutSelectedClips() {
QList<QGraphicsItem *> itemList = scene()->selectedItems();
GenTime currentPos = GenTime(m_cursorPos, m_document->fps());
}
}
-void CustomTrackView::addClip(QDomElement xml, int clipId, ItemInfo info) {
+void CustomTrackView::addClip(QDomElement xml, int clipId, ItemInfo info, EffectsList effects) {
DocClipBase *baseclip = m_document->clipManager()->getClipById(clipId);
ClipItem *item = new ClipItem(baseclip, info, m_scale, m_document->fps());
+ item->setEffectList(effects);
scene()->addItem(item);
baseclip->addReference();
m_document->updateClip(baseclip->getId());
- m_document->renderer()->mltInsertClip(m_tracksList.count() - info.track, info.startPos, info.cropStart, xml);
+ info.track = m_tracksList.count() - info.track;
+ m_document->renderer()->mltInsertClip(info, xml, baseclip->producer());
+ for (int i = 0; i < item->effectsCount(); i++) {
+ m_document->renderer()->mltAddEffect(info.track, info.startPos, item->getEffectArgs(item->effectAt(i)), false);
+ }
m_document->renderer()->doRefresh();
}
clip = static_cast <ClipItem *>(list.at(i));
if (clip->clipProducer() == clipId) {
clip->refreshClip();
- m_document->renderer()->mltUpdateClip(m_tracksList.count() - clip->track(), clip->startPos(), clip->cropStart(), clip->xml());
+ ItemInfo info = clip->info();
+ info.track = m_tracksList.count() - clip->track();
+ m_document->renderer()->mltUpdateClip(info, clip->xml(), clip->baseClip()->producer());
}
}
}
return;
}
if (resizeClipStart) {
- m_document->renderer()->mltResizeClipStart(m_tracksList.count() - item->track(), item->endPos(), end.startPos, item->startPos(), item->cropStart() + end.startPos - start.startPos, item->cropStart() + end.startPos - start.startPos + item->endPos() - end.startPos);
- item->resizeStart((int) end.startPos.frames(m_document->fps()), m_scale);
- updateClipFade(item);
+ bool success = m_document->renderer()->mltResizeClipStart(m_tracksList.count() - item->track(), item->endPos(), end.startPos, item->startPos(), item->cropStart() + end.startPos - start.startPos, item->cropStart() + end.startPos - start.startPos + item->endPos() - end.startPos);
+ if (success) {
+ item->resizeStart((int) end.startPos.frames(m_document->fps()), m_scale);
+ updateClipFade(item);
+ }
+ else emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
} else {
m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - item->track(), item->startPos(), item->cropStart(), item->cropStart() + end.endPos - item->startPos());
item->resizeEnd((int) end.endPos.frames(m_document->fps()), m_scale);
}
if (!found) emit displayMessage(i18n("No guide at cursor time"), ErrorMessage);
}
+ m_document->syncGuides(m_guides);
}
bool CustomTrackView::addGuide(const GenTime pos, const QString &comment) {
Guide *g = new Guide(this, pos, comment, m_scale, m_document->fps(), m_tracksHeight * m_tracksList.count());
scene()->addItem(g);
m_guides.append(g);
+ m_document->syncGuides(m_guides);
return true;
}
painter->fillRect(QRectF(rectInView.left(), lowerLimit, rectInView.width(), height() - lowerLimit), QBrush(base));
}
-QDomElement CustomTrackView::xmlInfo() {
- QDomDocument doc;
- QDomElement e;
- QDomElement guides = doc.createElement("guides");
- for (int i = 0; i < m_guides.count(); i++) {
- e = doc.createElement("guide");
- e.setAttribute("time", m_guides.at(i)->position().ms() / 1000);
- e.setAttribute("comment", m_guides.at(i)->label());
- guides.appendChild(e);
- }
- return guides;
-}
-
bool CustomTrackView::findString(const QString &text) {
QString marker;
for (int i = 0; i < m_searchPoints.size(); ++i) {
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
ClipItem *dup = static_cast <ClipItem *>(itemList.at(i));
- m_copiedItems.append(dup->clone(m_scale));
+ m_copiedItems.append(dup->clone(m_scale, dup->info()));
} else if (itemList.at(i)->type() == TRANSITIONWIDGET) {
Transition *dup = static_cast <Transition *>(itemList.at(i));
m_copiedItems.append(dup->clone(m_scale));
info.cropStart = clip->cropStart();
info.track = clip->track() + trackOffset;
if (canBePastedTo(info, AVWIDGET)) {
- new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, true, false, pasteClips);
+ new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), true, false, pasteClips);
} else emit displayMessage(i18n("Cannot paste clip to selected place"), ErrorMessage);
} else if (m_copiedItems.at(i) && m_copiedItems.at(i)->type() == TRANSITIONWIDGET) {
Transition *tr = static_cast <Transition *>(m_copiedItems.at(i));
m_commandStack->push(pasteClips);
}
+void CustomTrackView::pasteClipEffects() {
+ if (m_copiedItems.count() != 1 || m_copiedItems.at(0)->type() != AVWIDGET) {
+ emit displayMessage(i18n("You must copy exactly one clip before pasting effects"), ErrorMessage);
+ return;
+ }
+ ClipItem *clip = static_cast < ClipItem *>(m_copiedItems.at(0));
+ EffectsList effects = clip->effectList();
+
+ QUndoCommand *paste = new QUndoCommand();
+ paste->setText("Paste effects");
+
+ QList<QGraphicsItem *> clips = scene()->selectedItems();
+ for (int i = 0; i < clips.count(); ++i) {
+ if (clips.at(i)->type() == AVWIDGET) {
+ ClipItem *item = static_cast < ClipItem *>(clips.at(i));
+ for (int i = 0; i < clip->effectsCount(); i++) {
+ new AddEffectCommand(this, m_tracksList.count() - item->track(), item->startPos(), clip->effectAt(i), true, paste);
+ }
+ }
+ }
+ m_commandStack->push(paste);
+}
+
+
/*
void CustomTrackView::drawForeground ( QPainter * painter, const QRectF & rect )
{