#include "tracksconfigdialog.h"
#include "commands/configtrackscommand.h"
#include "commands/rebuildgroupcommand.h"
-#include "commands/razorgroupcommand.h"
#include "commands/refreshmonitorcommand.h"
#include "profilesdialog.h"
if (m_dragItem->parentItem() && m_dragItem->parentItem() != m_selectionGroup) {
razorGroup((AbstractGroupItem *)m_dragItem->parentItem(), cutPos);
} else {
- AbstractClipItem *clip = static_cast <AbstractClipItem *>(m_dragItem);
- RazorClipCommand* command = new RazorClipCommand(this, clip->info(), cutPos);
+ ClipItem *clip = static_cast <ClipItem *>(m_dragItem);
+ RazorClipCommand* command = new RazorClipCommand(this, clip->info(), clip->effectList(), cutPos);
m_commandStack->push(command);
}
setDocumentModified();
} else*/ {
// add keyframe
GenTime keyFramePos = GenTime((int)(mapToScene(event->pos()).x()), m_document->fps()) - m_dragItem->startPos() + m_dragItem->cropStart();
+ int single = m_dragItem->checkForSingleKeyframe();
int val = m_dragItem->addKeyFrame(keyFramePos, mapToScene(event->pos()).toPoint().y());
ClipItem * item = static_cast <ClipItem *>(m_dragItem);
+ QDomElement oldEffect = item->selectedEffect().cloneNode().toElement();
+ if (single > -1) {
+ item->insertKeyframe(item->getEffectAtIndex(item->selectedEffectIndex()), (item->cropStart() + item->cropDuration()).frames(m_document->fps()) - 1, single);
+ }
//QString previous = item->keyframes(item->selectedEffectIndex());
- QDomElement oldEffect = item->selectedEffect().cloneNode().toElement();
item->insertKeyframe(item->getEffectAtIndex(item->selectedEffectIndex()), keyFramePos.frames(m_document->fps()), val);
//item->updateKeyframeEffect();
//QString next = item->keyframes(item->selectedEffectIndex());
{
QPointF framePos = mapToScene(pos);
int track = framePos.y() / KdenliveSettings::trackheight();
- m_scene->clearSelection();
- m_dragItem = NULL;
- resetSelectionGroup(false);
m_clipDrag = data->hasFormat("kdenlive/clip") || data->hasFormat("kdenlive/producerslist");
// This is not a clip drag, maybe effect or other...
if (!m_clipDrag) return false;
+ m_scene->clearSelection();
+ m_dragItem = NULL;
+ resetSelectionGroup(false);
if (track < 0 || track > m_document->tracksCount() - 1 || m_document->trackInfoAt(m_document->tracksCount() - track - 1).isLocked) return true;
if (data->hasFormat("kdenlive/clip")) {
QStringList list = QString(data->data("kdenlive/clip")).split(';');
if (!m_document->renderer()->mltAddEffect(track, pos, params))
emit displayMessage(i18n("Problem adding effect to clip"), ErrorMessage);
clip->setSelectedEffect(params.paramValue("kdenlive_ix").toInt());
- if (clip->isSelected()) emit clipItemSelected(clip);
+ if (clip->isMainSelectedClip()) emit clipItemSelected(clip);
} else emit displayMessage(i18n("Cannot find clip to add effect"), ErrorMessage);
}
}
ClipItem *clip = getClipItemAt((int)pos.frames(m_document->fps()), m_document->tracksCount() - track);
if (clip) {
- clip->deleteEffect(index);
- emit clipItemSelected(clip);
+ clip->deleteEffect(index);
+ if (clip->isMainSelectedClip()) emit clipItemSelected(clip);
}
}
else effectName = i18n("effect");
effectCommand->setText(i18n("Add %1", effectName));
for (int i = 0; i < itemList.count(); i++) {
+ if (itemList.at(i)->type() == GROUPWIDGET) {
+ itemList << itemList.at(i)->childItems();
+ }
if (itemList.at(i)->type() == AVWIDGET) {
ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
if (effect.tagName() == "effectgroup") {
if (clip) slotAddEffect(effect, clip->startPos(), clip->track());
}
+void CustomTrackView::slotDropEffect(ClipItem *clip, QDomElement effect, GenTime pos, int track)
+{
+ if (clip == NULL) return;
+ slotAddEffect(effect, pos, track);
+ if (clip->parentItem()) {
+ // Clip is in a group, should not happen
+ kDebug()<<"/// DROPPED ON ITEM IN GRP";
+ }
+ else if (clip != m_dragItem) {
+ clearSelection(false);
+ m_dragItem = clip;
+ clip->setSelected(true);
+ emit clipItemSelected(clip);
+ }
+}
+
void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track)
{
QList<QGraphicsItem *> itemList;
QUndoCommand *effectCommand = new QUndoCommand();
QString effectName;
-
int offset = effect.attribute("clipstart").toInt();
if (effect.tagName() == "effectgroup") {
effectName = effect.attribute("name");
if (effectCommand->childCount() > 0) {
m_commandStack->push(effectCommand);
setDocumentModified();
- if (effectCommand->childCount() == 1) {
+ /*if (effectCommand->childCount() == 1) {
// Display newly added clip effect
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
ClipItem *clip = static_cast<ClipItem *>(itemList.at(i));
clip->setSelectedEffect(clip->effectsCount());
- if (!clip->isSelected()) {
+ if (!clip->isSelected() && (!m_dragItem || !itemList.contains(m_dragItem))) {
+ kDebug()<<"// CLIP WAS NO SELECTED, DRG: "<<(m_dragItem == NULL);
clearSelection(false);
clip->setSelected(true);
m_dragItem = clip;
+ emit clipItemSelected(clip);
+ break;
}
- emit clipItemSelected(clip);
- break;
}
}
}
}
}
}
- }
+ }*/
} else delete effectCommand;
}
m_commandStack->push(command);
}
-ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, bool execute)
+ClipItem *CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut, EffectsList oldStack, bool execute)
{
if (cut) {
// cut clip
item->resizeEnd(cutPos);
scene()->addItem(dup);
- if (item->checkKeyFrames())
+
+ if (item->checkKeyFrames(m_document->width(), m_document->height(), info.cropDuration.frames(m_document->fps())))
slotRefreshEffects(item);
- if (dup->checkKeyFrames())
+
+ if (dup->checkKeyFrames(m_document->width(), m_document->height(), info.cropDuration.frames(m_document->fps()), cutTime.frames(m_document->fps())))
slotRefreshEffects(dup);
item->baseClip()->addReference();
bool snap = KdenliveSettings::snaptopoints();
KdenliveSettings::setSnaptopoints(false);
- // join fade effects again
- int ix = dup->hasEffect(QString(), "fadeout");
- if (ix != -1) {
- QDomElement effect = dup->effectAtIndex(ix);
- item->addEffect(effect);
- }
- ix = dup->hasEffect(QString(), "fade_to_black");
- if (ix != -1) {
- QDomElement effect = dup->effectAtIndex(ix);
- item->addEffect(effect);
- }
-
m_waitingThumbs.removeAll(dup);
bool selected = item->isSelected();
if (dup->isSelected()) {
bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, info.endPos - info.startPos, false);
if (success) {
item->resizeEnd((int) info.endPos.frames(m_document->fps()));
+ item->setEffectList(oldStack);
setDocumentModified();
} else {
emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
newdupInfo.startPos = info.endPos;
newdupInfo.cropStart += diff2;
newdupInfo.cropDuration = clipInfo.endPos - info.endPos;
- new RazorClipCommand(this, clipInfo, info.startPos, false, command);
+ new RazorClipCommand(this, clipInfo, clip->effectList(), info.startPos, false, command);
new ResizeClipCommand(this, dupInfo, newdupInfo, false, false, command);
- ClipItem *dup = cutClip(clipInfo, info.startPos, true, false);
+ ClipItem *dup = cutClip(clipInfo, info.startPos, true, EffectsList(), false);
if (dup) {
dup->resizeStart(info.endPos.frames(m_document->fps()));
}
dupInfo.startPos = info.startPos;
dupInfo.cropStart += diff;
dupInfo.cropDuration = clipInfo.endPos - info.startPos;
- new RazorClipCommand(this, clipInfo, info.startPos, false, command);
+ new RazorClipCommand(this, clipInfo, clip->effectList(), info.startPos, true, command);
// Commented out; variable dup unused. --granjow
//ClipItem *dup = cutClip(clipInfo, info.startPos, true, false);
- cutClip(clipInfo, info.startPos, true, false);
+ //cutClip(clipInfo, info.startPos, true, false);
}
}
// TODO: add insertspacecommand
void CustomTrackView::setDuration(int duration)
{
+ if (m_projectDuration == duration) return;
int diff = qAbs(duration - sceneRect().width());
if (diff * matrix().m11() > -50) {
if (matrix().m11() < 0.4) setSceneRect(0, 0, (duration + 100 / matrix().m11()), sceneRect().height());
if (!groups.contains(group))
groups << group;
} else if (currentPos > item->startPos() && currentPos < item->endPos()) {
- RazorClipCommand *command = new RazorClipCommand(this, item->info(), currentPos);
+ RazorClipCommand *command = new RazorClipCommand(this, item->info(), item->effectList(), currentPos);
m_commandStack->push(command);
}
} else if (itemList.at(i)->type() == GROUPWIDGET && itemList.at(i) != m_selectionGroup) {
{
if (group) {
QList <QGraphicsItem *> children = group->childItems();
+ QUndoCommand *command = new QUndoCommand;
+ command->setText(i18n("Cut Group"));
+ groupClips(false, children, command);
QList <ItemInfo> clips1, transitions1;
- QList <ItemInfo> clipsCut, transitionsCut;
+ QList <ItemInfo> transitionsCut;
QList <ItemInfo> clips2, transitions2;
+ QList <QGraphicsItem *> clipsToCut;
+
+ // Collect info
for (int i = 0; i < children.count(); ++i) {
children.at(i)->setSelected(false);
AbstractClipItem *child = static_cast <AbstractClipItem *>(children.at(i));
clips1 << child->info();
else if (cutPos < child->startPos())
clips2 << child->info();
- else
- clipsCut << child->info();
+ else {
+ clipsToCut << child;
+ }
} else {
if (cutPos > child->endPos())
transitions1 << child->info();
else if (cutPos < child->startPos())
transitions2 << child->info();
- else
- transitionsCut << child->info();
+ else {
+ //transitionsCut << child->info();
+ // Transition cut not implemented, leave it in first group...
+ transitions1 << child->info();
+ }
}
}
- if (clipsCut.isEmpty() && transitionsCut.isEmpty() && ((clips1.isEmpty() && transitions1.isEmpty()) || (clips2.isEmpty() && transitions2.isEmpty())))
+ if (clipsToCut.isEmpty() && transitionsCut.isEmpty() && ((clips1.isEmpty() && transitions1.isEmpty()) || (clips2.isEmpty() && transitions2.isEmpty()))) {
+ delete command;
return;
- RazorGroupCommand *command = new RazorGroupCommand(this, clips1, transitions1, clipsCut, transitionsCut, clips2, transitions2, cutPos);
+ }
+ // Process the cut
+ for (int i = 0; i < clipsToCut.count(); i++) {
+ ClipItem *clip = static_cast<ClipItem *>(clipsToCut.at(i));
+ new RazorClipCommand(this, clip->info(), clip->effectList(), cutPos, false, command);
+ ClipItem *secondClip = cutClip(clip->info(), cutPos, true);
+ clips1 << clip->info();
+ clips2 << secondClip->info();
+ }
+ new GroupClipsCommand(this, clips1, transitions1, true, command);
+ new GroupClipsCommand(this, clips2, transitions2, true, command);
m_commandStack->push(command);
}
}
-void CustomTrackView::slotRazorGroup(QList <ItemInfo> clips1, QList <ItemInfo> transitions1, QList <ItemInfo> clipsCut, QList <ItemInfo> transitionsCut, QList <ItemInfo> clips2, QList <ItemInfo> transitions2, GenTime cutPos, bool cut)
-{
- if (cut) {
- for (int i = 0; i < clipsCut.count(); ++i) {
- ClipItem *clip = getClipItemAt(clipsCut.at(i).startPos.frames(m_document->fps()), clipsCut.at(i).track);
- if (clip) {
- ClipItem *clipBehind = cutClip(clipsCut.at(i), cutPos, true);
- clips1 << clip->info();
- if (clipBehind != NULL)
- clips2 << clipBehind->info();
- }
- }
- /* TODO: cut transitionsCut
- * For now just append them to group1 */
- transitions1 << transitionsCut;
- doGroupClips(clips1, transitions1, true);
- doGroupClips(clips2, transitions2, true);
- } else {
- /* we might also just use clipsCut.at(0)->parentItem().
- * Do this loop just in case something went wrong during cut */
- for (int i = 0; i < clipsCut.count(); ++i) {
- ClipItem *clip = getClipItemAt(cutPos.frames(m_document->fps()), clipsCut.at(i).track);
- if (clip && clip->parentItem() && clip->parentItem()->type() == GROUPWIDGET) {
- AbstractGroupItem *group = static_cast <AbstractGroupItem *>(clip->parentItem());
- QList <QGraphicsItem *> children = group->childItems();
- QList <ItemInfo> groupClips;
- QList <ItemInfo> groupTrans;
- for (int j = 0; j < children.count(); ++j) {
- if (children.at(j)->type() == AVWIDGET)
- groupClips << ((AbstractClipItem *)children.at(j))->info();
- else if (children.at(j)->type() == TRANSITIONWIDGET)
- groupTrans << ((AbstractClipItem *)children.at(j))->info();
- }
- doGroupClips(groupClips, groupTrans, false);
- break;
- }
- }
- for (int i = 0; i < clipsCut.count(); ++i)
- cutClip(clipsCut.at(i), cutPos, false);
- // TODO: uncut transitonsCut
- doGroupClips(QList <ItemInfo>() << clips1 << clipsCut << clips2, QList <ItemInfo>() << transitions1 << transitionsCut << transitions2, true);
- }
-}
-
-void CustomTrackView::groupClips(bool group)
+void CustomTrackView::groupClips(bool group, QList<QGraphicsItem *> itemList, QUndoCommand *command)
{
- QList<QGraphicsItem *> itemList = scene()->selectedItems();
+ if (itemList.isEmpty()) itemList = scene()->selectedItems();
QList <ItemInfo> clipInfos;
QList <ItemInfo> transitionInfos;
}
}
if (clipInfos.count() > 0) {
- GroupClipsCommand *command = new GroupClipsCommand(this, clipInfos, transitionInfos, group);
- m_commandStack->push(command);
+ if (command) {
+ new GroupClipsCommand(this, clipInfos, transitionInfos, group, command);
+ } else {
+ GroupClipsCommand *command = new GroupClipsCommand(this, clipInfos, transitionInfos, group);
+ m_commandStack->push(command);
+ }
}
}
void CustomTrackView::slotAddClipMarker(const QString &id, QList <CommentedTime> newMarkers, QUndoCommand *groupCommand)
{
- QUndoCommand *subCommand = NULL;
+ DocClipBase *base = m_document->clipManager()->getClipById(id);
+ if (!base) return;
+ QUndoCommand *subCommand = NULL;
if (newMarkers.count() > 1 && groupCommand == NULL) {
subCommand = new QUndoCommand;
subCommand->setText("Add markers");
}
for (int i = 0; i < newMarkers.count(); i++) {
- CommentedTime oldMarker = m_document->clipManager()->getClipById(id)->markerAt(newMarkers.at(i).time());
+ CommentedTime oldMarker = base->markerAt(newMarkers.at(i).time());
if (oldMarker == CommentedTime()) {
oldMarker = newMarkers.at(i);
oldMarker.setMarkerType(-1);
KFileDialog fd(KUrl("kfiledialog:///projectfolder"), "text/plain", this, cbox);
fd.setMode(KFile::File);
fd.setOperationMode(KFileDialog::Saving);
- fd.exec();
+ if (fd.exec() != QDialog::Accepted) return;
QString url = fd.selectedFile();
//QString url = KFileDialog::getSaveFileName(KUrl("kfiledialog:///projectfolder"), "text/plain", this, i18n("Save markers"));
if (url.isEmpty()) return;
KFileDialog fd(KUrl("kfiledialog:///projectfolder"), "text/plain", this, cbox);
fd.setMode(KFile::File);
fd.setOperationMode(KFileDialog::Opening);
- fd.exec();
+ if (fd.exec() != QDialog::Accepted) return;
QString url = fd.selectedFile();
//KUrl url = KFileDialog::getOpenUrl(KUrl("kfiledialog:///projectfolder"), "text/plain", this, i18n("Load marker file"));