#include <QInputDialog>
#include <KMessageBox>
+#if QT_VERSION >= 0x040600
+#include <QGraphicsDropShadowEffect>
+#endif
+
bool sortGuidesList(const Guide *g1 , const Guide *g2)
{
return (*g1).position() < (*g2).position();
// virtual
-
void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
{
int pos = event->x();
}
bool collision = false;
for (int i = 0; i < collidingItems.count(); i++) {
+ if (!collidingItems.at(i)->isEnabled()) continue;
if (collidingItems.at(i)->type() == AVWIDGET) {
collision = true;
break;
// razor tool over a clip, display current frame in monitor
if (false && !m_blockRefresh && item->type() == AVWIDGET) {
//TODO: solve crash when showing frame when moving razor over clip
- emit showClipFrame(((ClipItem *) item)->baseClip(), mappedXPos - (clip->startPos() - clip->cropStart()).frames(m_document->fps()));
+ emit showClipFrame(((ClipItem *) item)->baseClip(), QPoint(), mappedXPos - (clip->startPos() - clip->cropStart()).frames(m_document->fps()));
}
event->accept();
return;
if (m_dragItem) emit clipItemSelected(NULL);
m_dragItem = NULL;
}
-
+#if QT_VERSION >= 0x040600
+ // Add shadow to dragged item, currently disabled because of painting artifacts
+ //TODO: re-enable when fixed
+ /*QGraphicsDropShadowEffect *eff = new QGraphicsDropShadowEffect();
+ eff->setBlurRadius(5);
+ eff->setOffset(3, 3);
+ m_dragItem->setGraphicsEffect(eff);*/
+#endif
if (m_dragItem && m_dragItem->type() == TRANSITIONWIDGET) {
// update transition menu action
m_autoTransition->setChecked(static_cast<Transition *>(m_dragItem)->isAutomatic());
if (event->modifiers() == Qt::ControlModifier) {
// Ctrl + click, select all items on track after click position
int track = (int)(mapToScene(m_clickEvent).y() / m_tracksHeight);
+ if (m_document->trackInfoAt(m_document->tracksCount() - track - 1).isLocked) {
+ // Cannot use spacer on locked track
+ emit displayMessage(i18n("Cannot use spacer in a locked track"), ErrorMessage);
+ return;
+ }
+
QRectF rect(mapToScene(m_clickEvent).x(), track * m_tracksHeight + m_tracksHeight / 2, sceneRect().width() - mapToScene(m_clickEvent).x(), m_tracksHeight / 2 - 2);
bool isOk;
for (int i = 0; i < selection.count(); i++) {
if (selection.at(i)->parentItem() == 0 && (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET)) {
AbstractClipItem *item = static_cast<AbstractClipItem *>(selection.at(i));
+ if (item->isItemLocked()) continue;
offsetList.append(item->startPos());
offsetList.append(item->endPos());
m_selectionGroup->addToGroup(selection.at(i));
selection.at(i)->setFlag(QGraphicsItem::ItemIsMovable, false);
} else if (selection.at(i)->parentItem() == 0 && selection.at(i)->type() == GROUPWIDGET) {
+ if (static_cast<AbstractGroupItem *>(selection.at(i))->isItemLocked()) continue;
QList<QGraphicsItem *> children = selection.at(i)->childItems();
for (int j = 0; j < children.count(); j++) {
AbstractClipItem *item = static_cast<AbstractClipItem *>(children.at(j));
m_selectionGroup->addToGroup(selection.at(i));
selection.at(i)->setFlag(QGraphicsItem::ItemIsMovable, false);
} else if (selection.at(i)->parentItem()) {
+ if (static_cast<AbstractGroupItem *>(selection.at(i)->parentItem())->isItemLocked()) continue;
m_selectionGroup->addToGroup(selection.at(i)->parentItem());
selection.at(i)->parentItem()->setFlag(QGraphicsItem::ItemIsMovable, false);
}
kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << list.at(0);
return false;
}
- const QPointF framePos = mapToScene(pos);
+ QPointF framePos = mapToScene(pos);
ItemInfo info;
info.startPos = GenTime();
info.cropStart = GenTime(list.at(1).toInt(), m_document->fps());
pasteInfo.startPos = GenTime((int)(framePos.x() + 0.5), m_document->fps());
pasteInfo.endPos = pasteInfo.startPos + info.endPos;
pasteInfo.track = (int)(framePos.y() / m_tracksHeight);
+ framePos.setX((int)(framePos.x() + 0.5));
+ framePos.setY(pasteInfo.track * m_tracksHeight);
if (!canBePastedTo(pasteInfo, AVWIDGET)) {
return true;
}
QList <GenTime> offsetList;
QList <ItemInfo> infoList;
- const QPointF framePos = mapToScene(pos);
+ QPointF framePos = mapToScene(pos);
GenTime start = GenTime((int)(framePos.x() + 0.5), m_document->fps());
int track = (int)(framePos.y() / m_tracksHeight);
+ framePos.setX((int)(framePos.x() + 0.5));
+ framePos.setY(track * m_tracksHeight);
// Check if clips can be inserted at that position
for (int i = 0; i < ids.size(); ++i) {
newPos.track = info.track;
newPos.cropDuration = newPos.endPos - newPos.startPos;
-
+ bool snap = KdenliveSettings::snaptopoints();
+ KdenliveSettings::setSnaptopoints(false);
ClipItem *dup = item->clone(newPos);
// remove unwanted effects (fade in) from 2nd part of cutted clip
int ix = dup->hasEffect(QString(), "fadein");
item->baseClip()->addReference();
m_document->updateClip(item->baseClip()->getId());
setDocumentModified();
+ KdenliveSettings::setSnaptopoints(snap);
return dup;
//kDebug() << "///////// CUTTING CLIP RESULT: (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), DUP: (" << dup->startPos().frames(25) << "-" << dup->endPos().frames(25) << ")" << ", CUT: " << cutTime.frames(25);
} else {
ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track);
ClipItem *dup = getClipItemAt((int) cutTime.frames(m_document->fps()), info.track);
+
if (!item || !dup || item == dup) {
emit displayMessage(i18n("Cannot find clip to uncut"), ErrorMessage);
m_blockRefresh = false;
kDebug() << "// UNCUTTING CLIPS, INFO (" << info.startPos.frames(25) << "x" << info.endPos.frames(25) << ") , CUT: " << cutTime.frames(25);;*/
//deleteClip(dup->info());
+ bool snap = KdenliveSettings::snaptopoints();
+ KdenliveSettings::setSnaptopoints(false);
if (dup->isSelected()) emit clipItemSelected(NULL);
dup->baseClip()->removeReference();
setDocumentModified();
} else
emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
+ KdenliveSettings::setSnaptopoints(snap);
return item;
}
if (m_document->renderer()->mltInsertClip(clipInfo, item->xml(), item->baseClip()->producer(item->track()), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT) == -1) {
emit displayMessage(i18n("Cannot insert clip in timeline"), ErrorMessage);
}
- adjustTimelineClips(m_scene->editMode(), item, addCommand);
+ adjustTimelineClips(m_scene->editMode(), item, ItemInfo(), addCommand);
new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->info(), item->effectList(), m_scene->editMode() == OVERWRITEEDIT, m_scene->editMode() == INSERTEDIT, false, false, addCommand);
}
m_commandStack->push(addCommand);
setDocumentModified();
+
+ /*
+ // debug info
+ QRectF rect(0, 1 * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), 2);
+ QList<QGraphicsItem *> selection = m_scene->items(rect);
+ QStringList timelineList;
+
+ kDebug()<<"// ITEMS on TRACK: "<<selection.count();
+ for (int i = 0; i < selection.count(); i++) {
+ if (selection.at(i)->type() == AVWIDGET) {
+ ClipItem *clip = static_cast <ClipItem *>(selection.at(i));
+ int start = clip->startPos().frames(m_document->fps());
+ int end = clip->endPos().frames(m_document->fps());
+ timelineList.append(QString::number(start) + "-" + QString::number(end));
+ }
+ }
+ kDebug() << "// COMPARE:\n" << timelineList << "\n-------------------";
+ */
+
m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
if (items.count() > 1) groupSelectedItems(true);
event->setDropAction(Qt::MoveAction);
setFocus();
}
-void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, QUndoCommand *command)
+void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, ItemInfo posinfo, QUndoCommand *command)
{
+ bool snap = KdenliveSettings::snaptopoints();
+ KdenliveSettings::setSnaptopoints(false);
if (mode == OVERWRITEEDIT) {
- // if we are in overwrite or push mode, move clips accordingly
- bool snap = KdenliveSettings::snaptopoints();
- KdenliveSettings::setSnaptopoints(false);
- ItemInfo info = item->info();
+ // if we are in overwrite mode, move clips accordingly
+ ItemInfo info;
+ if (item == NULL) info = posinfo;
+ else info = item->info();
QRectF rect(info.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight / 2, (info.endPos - info.startPos).frames(m_document->fps()) - 1, 5);
QList<QGraphicsItem *> selection = m_scene->items(rect);
- selection.removeAll(item);
+ if (item) selection.removeAll(item);
for (int i = 0; i < selection.count(); i++) {
+ if (!selection.at(i)->isEnabled()) continue;
if (selection.at(i)->type() == AVWIDGET) {
ClipItem *clip = static_cast<ClipItem *>(selection.at(i));
if (clip->startPos() < info.startPos) {
if (clip->endPos() > info.endPos) {
ItemInfo clipInfo = clip->info();
ItemInfo dupInfo = clipInfo;
- GenTime diff = info.startPos - clip->startPos();
+ GenTime diff = info.startPos - clipInfo.startPos;
dupInfo.startPos = info.startPos;
dupInfo.cropStart += diff;
dupInfo.cropDuration = clipInfo.endPos - info.startPos;
new ResizeClipCommand(this, dupInfo, newdupInfo, false, false, command);
ClipItem *dup = cutClip(clipInfo, info.startPos, true, false);
if (dup) dup->resizeStart(info.endPos.frames(m_document->fps()));
-
} else {
ItemInfo newclipInfo = clip->info();
newclipInfo.endPos = info.startPos;
}
}
}
- KdenliveSettings::setSnaptopoints(snap);
+ } else if (mode == INSERTEDIT) {
+ // if we are in push mode, move clips accordingly
+ ItemInfo info;
+ if (item == NULL) info = posinfo;
+ else info = item->info();
+ QRectF rect(info.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight / 2, (info.endPos - info.startPos).frames(m_document->fps()) - 1, 5);
+ QList<QGraphicsItem *> selection = m_scene->items(rect);
+ if (item) selection.removeAll(item);
+ for (int i = 0; i < selection.count(); i++) {
+ if (selection.at(i)->type() == AVWIDGET) {
+ ClipItem *clip = static_cast<ClipItem *>(selection.at(i));
+ if (clip->startPos() < info.startPos) {
+ if (clip->endPos() > info.startPos) {
+ ItemInfo clipInfo = clip->info();
+ ItemInfo dupInfo = clipInfo;
+ GenTime diff = info.startPos - clipInfo.startPos;
+ dupInfo.startPos = info.startPos;
+ dupInfo.cropStart += diff;
+ dupInfo.cropDuration = clipInfo.endPos - info.startPos;
+ new RazorClipCommand(this, clipInfo, info.startPos, false, command);
+ ClipItem *dup = cutClip(clipInfo, info.startPos, true, false);
+ }
+ }
+ // TODO: add insertspacecommand
+ }
+ }
}
+
+ KdenliveSettings::setSnaptopoints(snap);
}
QList<QGraphicsItem *> selection = m_scene->items(rect);
selection.removeAll(item);
for (int i = 0; i < selection.count(); i++) {
+ if (!selection.at(i)->isEnabled()) continue;
if (selection.at(i)->type() == TRANSITIONWIDGET) {
Transition *tr = static_cast<Transition *>(selection.at(i));
if (tr->startPos() < info.startPos) {
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);
+ 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;
}
if (m_moveOpMode == SEEK) m_moveOpMode = NONE;
QGraphicsView::mouseReleaseEvent(event);
setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);
+#if QT_VERSION >= 0x040600
+ if (m_dragItem) m_dragItem->setGraphicsEffect(NULL);
+#endif
if (m_scrollTimer.isActive()) m_scrollTimer.stop();
if (event->button() == Qt::MidButton) {
return;
if (success) {
QUndoCommand *moveCommand = new QUndoCommand();
moveCommand->setText(i18n("Move clip"));
- adjustTimelineClips(m_scene->editMode(), item, moveCommand);
+ adjustTimelineClips(m_scene->editMode(), item, ItemInfo(), moveCommand);
int tracknumber = m_document->tracksCount() - item->track() - 1;
bool isLocked = m_document->trackInfoAt(tracknumber).isLocked;
ClipItem *clip = static_cast <ClipItem*>(item);
info.track = m_document->tracksCount() - info.track;
Mlt::Producer *prod;
- adjustTimelineClips(m_scene->editMode(), clip, moveGroup);
+ adjustTimelineClips(m_scene->editMode(), clip, ItemInfo(), moveGroup);
if (clip->isAudioOnly()) prod = clip->baseClip()->audioProducer(info.track);
else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer();
else prod = clip->baseClip()->producer(info.track);
#if QT_VERSION >= 0x040600
// animate item deletion
item->closeAnimation();
+ /*if (refresh) item->closeAnimation();
+ else {
+ // no refresh, means we have several operations chained, we need to delete clip immediatly
+ // so that it does not get in the way of the other
+ delete item;
+ item = NULL;
+ }*/
#else
delete item;
item = NULL;
if (item->isAudioOnly()) prod = baseclip->audioProducer(info.track);
else if (item->isVideoOnly()) prod = baseclip->videoProducer();
else prod = baseclip->producer(info.track);
- m_document->renderer()->mltInsertClip(info, xml, prod);
+ m_document->renderer()->mltInsertClip(info, xml, prod, overwrite, push);
for (int i = 0; i < item->effectsCount(); i++) {
m_document->renderer()->mltAddEffect(info.track, info.startPos, item->getEffectArgs(item->effectAt(i)), false);
}
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)->isEnabled()) continue;
if (list.at(i)->type() == AVWIDGET) {
ClipItem *test = static_cast <ClipItem *>(list.at(i));
if (test->endPos() == pos) clip = test;
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)->isEnabled()) continue;
if (list.at(i)->type() == AVWIDGET) {
ClipItem *test = static_cast <ClipItem *>(list.at(i));
if (test->startPos() == pos) clip = test;
QList<QGraphicsItem *> list = scene()->items(p);
ClipItem *clip = NULL;
for (int i = 0; i < list.size(); i++) {
+ if (!list.at(i)->isEnabled()) continue;
if (list.at(i)->type() == AVWIDGET) {
clip = static_cast <ClipItem *>(list.at(i));
break;
QList<QGraphicsItem *> list = scene()->items(p);
Transition *clip = NULL;
for (int i = 0; i < list.size(); i++) {
+ if (!list.at(i)->isEnabled()) continue;
if (list.at(i)->type() == TRANSITIONWIDGET) {
clip = static_cast <Transition *>(list.at(i));
break;
QList<QGraphicsItem *> list = scene()->items(p);
Transition *clip = NULL;
for (int i = 0; i < list.size(); i++) {
+ if (!list.at(i)->isEnabled()) continue;
if (list.at(i)->type() == TRANSITIONWIDGET) {
Transition *test = static_cast <Transition *>(list.at(i));
if (test->endPos() == pos) clip = test;
QList<QGraphicsItem *> list = scene()->items(p);
Transition *clip = NULL;
for (int i = 0; i < list.size(); ++i) {
+ if (!list.at(i)->isEnabled()) continue;
if (list.at(i)->type() == TRANSITIONWIDGET) {
Transition *test = static_cast <Transition *>(list.at(i));
if (test->startPos() == pos) clip = test;
} else {
AbstractClipItem *item = NULL;
for (int i = 0; i < clips.count(); ++i) {
- if (clips.count() == 1 || clips.at(i)->type() == AVWIDGET) {
+ if (clips.at(i)->type() == AVWIDGET) {
item = static_cast < AbstractClipItem *>(clips.at(i));
if (clips.count() > 1 && item->startPos().frames(m_document->fps()) <= m_cursorPos && item->endPos().frames(m_document->fps()) >= m_cursorPos) break;
}
DocClipBase *clip = m_document->getBaseClip(data.at(0));
ItemInfo info;
info.startPos = GenTime(in, m_document->fps());
- info.cropDuration = GenTime(data.at(1).toInt(), m_document->fps());
- info.endPos = info.startPos + GenTime(data.at(2).toInt(), m_document->fps());;
+ info.cropStart = GenTime(data.at(1).toInt(), m_document->fps());
+ info.endPos = info.startPos + GenTime(data.at(2).toInt(), m_document->fps()) - info.cropStart;
+ info.cropDuration = info.endPos - info.startPos;
info.track = m_selectedTrack;
- AddTimelineClipCommand *add = new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), info, EffectsList(), true, false, true, false);
- m_commandStack->push(add);
+ QUndoCommand *addCommand = new QUndoCommand();
+ addCommand->setText(i18n("Insert clip"));
+ adjustTimelineClips(OVERWRITEEDIT, NULL, info, addCommand);
+ new AddTimelineClipCommand(this, clip->toXML(), clip->getId(), info, EffectsList(), true, false, true, false, addCommand);
+ m_commandStack->push(addCommand);
}