#include "addtransitioncommand.h"
#include "edittransitioncommand.h"
#include "editkeyframecommand.h"
+#include "changespeedcommand.h"
#include "addmarkercommand.h"
#include "razorclipcommand.h"
#include "kdenlivesettings.h"
// const int duration = animate ? 1500 : 1;
CustomTrackView::CustomTrackView(KdenliveDoc *doc, QGraphicsScene * projectscene, QWidget *parent)
- : QGraphicsView(projectscene, parent), m_cursorPos(0), m_dropItem(NULL), m_cursorLine(NULL), m_operationMode(NONE), m_dragItem(NULL), m_visualTip(NULL), m_moveOpMode(NONE), m_animation(NULL), m_projectDuration(0), m_scale(1.0), m_clickPoint(QPoint()), m_document(doc), m_autoScroll(KdenliveSettings::autoscroll()), m_tracksHeight(KdenliveSettings::trackheight()), m_tool(SELECTTOOL), m_dragGuide(NULL), m_findIndex(0), m_menuPosition(QPoint()) {
+ : QGraphicsView(projectscene, parent), m_cursorPos(0), m_dropItem(NULL), m_cursorLine(NULL), m_operationMode(NONE), m_dragItem(NULL), m_visualTip(NULL), m_moveOpMode(NONE), m_animation(NULL), m_projectDuration(0), m_scale(1.0), m_clickPoint(QPoint()), m_document(doc), m_autoScroll(KdenliveSettings::autoscroll()), m_tracksHeight(KdenliveSettings::trackheight()), m_tool(SELECTTOOL), m_dragGuide(NULL), m_findIndex(0), m_menuPosition(QPoint()), m_blockRefresh(false) {
if (doc) m_commandStack = doc->commandStack();
else m_commandStack == NULL;
setMouseTracking(true);
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
item = (ClipItem*) itemList.at(i);
- item->setRect(item->rect().x(), item->track() * m_tracksHeight, item->rect().width(), m_tracksHeight - 1);
+ item->setRect(0, 0, item->rect().width(), m_tracksHeight - 1);
+ item->setPos((qreal) item->startPos().frames(m_document->fps()) * m_scale, (qreal) item->track() * m_tracksHeight);
item->resetThumbs();
} else if (itemList.at(i)->type() == TRANSITIONWIDGET) {
transitionitem = (Transition*) itemList.at(i);
- transitionitem->setRect(transitionitem->rect().x(), transitionitem->track() * m_tracksHeight + m_tracksHeight / 2, transitionitem->rect().width(), m_tracksHeight - 1);
+ transitionitem->setRect(0, 0, transitionitem->rect().width(), m_tracksHeight / 3 * 2 - 1);
+ transitionitem->setPos((qreal) transitionitem->startPos().frames(m_document->fps()) * m_scale, (qreal) transitionitem->track() * m_tracksHeight + m_tracksHeight / 3 * 2);
}
}
m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), m_tracksHeight * m_tracksList.count());
} else if (m_operationMode == KEYFRAME) {
GenTime keyFramePos = GenTime((int)(mapToScene(event->pos()).x() / m_scale), m_document->fps()) - m_dragItem->startPos() + m_dragItem->cropStart();
double pos = mapToScene(event->pos()).toPoint().y();
- QRectF br = m_dragItem->rect();
+ QRectF br = m_dragItem->sceneBoundingRect();
double maxh = 100.0 / br.height();
pos = (br.bottom() - pos) * maxh;
m_dragItem->updateKeyFramePos(keyFramePos, pos);
}
if (item && event->buttons() == Qt::NoButton) {
- AbstractClipItem *clip = (AbstractClipItem*) item;
+ AbstractClipItem *clip = static_cast <AbstractClipItem*>(item);
if (m_tool == RAZORTOOL) {
// razor tool over a clip, display current frame in monitor
- if (item->type() == AVWIDGET) {
- emit showClipFrame(((ClipItem *) item)->baseClip(), mapToScene(event->pos()).x() / m_scale - (clip->startPos() - clip->cropStart()).frames(m_document->fps()));
+ if (!m_blockRefresh && item->type() == AVWIDGET) {
+ //TODO: solve crash when showing frame when moving razor over clip
+ //emit showClipFrame(((ClipItem *) item)->baseClip(), mapToScene(event->pos()).x() / m_scale - (clip->startPos() - clip->cropStart()).frames(m_document->fps()));
}
- QGraphicsView::mouseMoveEvent(event);
+ event->accept();
return;
}
opMode = clip->operationMode(mapToScene(event->pos()), m_scale);
} else if (opMode == RESIZESTART) {
setCursor(KCursor("left_side", Qt::SizeHorCursor));
if (m_visualTip == NULL) {
+ QRectF rect = clip->sceneBoundingRect();
QPolygon polygon;
- polygon << QPoint((int)clip->rect().x(), (int)(clip->rect().y() + clip->rect().height() / 2 - size * 2));
- polygon << QPoint((int)(clip->rect().x() + size * 2), (int)(clip->rect().y() + clip->rect().height() / 2));
- polygon << QPoint((int)clip->rect().x(), (int)(clip->rect().y() + clip->rect().height() / 2 + size * 2));
- polygon << QPoint((int)clip->rect().x(), (int)(clip->rect().y() + clip->rect().height() / 2 - size * 2));
+ polygon << QPoint((int)rect.x(), (int)(rect.y() + rect.height() / 2 - size * 2));
+ polygon << QPoint((int)(rect.x() + size * 2), (int)(rect.y() + rect.height() / 2));
+ polygon << QPoint((int)rect.x(), (int)(rect.y() + rect.height() / 2 + size * 2));
+ polygon << QPoint((int)rect.x(), (int)(rect.y() + rect.height() / 2 - size * 2));
m_visualTip = new QGraphicsPolygonItem(polygon);
((QGraphicsPolygonItem*) m_visualTip)->setBrush(m_tipColor);
m_visualTip->setPos(0, 0);
double scale = 2.0;
m_animation->setScaleAt(.5, scale, 1);
- m_animation->setPosAt(.5, QPointF(clip->rect().x() - clip->rect().x() * scale, 0));
+ m_animation->setPosAt(.5, QPointF(rect.x() - rect.x() * scale, 0));
scale = 1.0;
m_animation->setScaleAt(1, scale, 1);
- m_animation->setPosAt(1, QPointF(clip->rect().x() - clip->rect().x() * scale, 0));
+ m_animation->setPosAt(1, QPointF(rect.x() - rect.x() * scale, 0));
scene()->addItem(m_visualTip);
m_animationTimer->start();
}
} else if (opMode == RESIZEEND) {
setCursor(KCursor("right_side", Qt::SizeHorCursor));
if (m_visualTip == NULL) {
+ QRectF rect = clip->sceneBoundingRect();
QPolygon polygon;
- polygon << QPoint((int)(clip->rect().x() + clip->rect().width()), (int)(clip->rect().y() + clip->rect().height() / 2 - size * 2));
- polygon << QPoint((int)(clip->rect().x() + clip->rect().width() - size * 2), (int)(clip->rect().y() + clip->rect().height() / 2));
- polygon << QPoint((int)(clip->rect().x() + clip->rect().width()), (int)(clip->rect().y() + clip->rect().height() / 2 + size * 2));
- polygon << QPoint((int)(clip->rect().x() + clip->rect().width()), (int)(clip->rect().y() + clip->rect().height() / 2 - size * 2));
+ polygon << QPoint((int)(rect.x() + rect.width()), (int)(rect.y() + rect.height() / 2 - size * 2));
+ polygon << QPoint((int)(rect.x() + rect.width() - size * 2), (int)(rect.y() + rect.height() / 2));
+ polygon << QPoint((int)(rect.x() + rect.width()), (int)(rect.y() + rect.height() / 2 + size * 2));
+ polygon << QPoint((int)(rect.x() + rect.width()), (int)(rect.y() + rect.height() / 2 - size * 2));
m_visualTip = new QGraphicsPolygonItem(polygon);
((QGraphicsPolygonItem*) m_visualTip)->setBrush(m_tipColor);
m_visualTip->setPos(0, 0);
double scale = 2.0;
m_animation->setScaleAt(.5, scale, 1);
- m_animation->setPosAt(.5, QPointF(clip->rect().x() - clip->rect().x() * scale - clip->rect().width(), 0));
+ m_animation->setPosAt(.5, QPointF(rect.x() - rect.x() * scale - rect.width(), 0));
scale = 1.0;
m_animation->setScaleAt(1, scale, 1);
- m_animation->setPosAt(1, QPointF(clip->rect().x() - clip->rect().x() * scale, 0));
+ m_animation->setPosAt(1, QPointF(rect.x() - rect.x() * scale, 0));
scene()->addItem(m_visualTip);
m_animationTimer->start();
}
} else if (opMode == FADEIN) {
if (m_visualTip == NULL) {
ClipItem *item = (ClipItem *) clip;
- m_visualTip = new QGraphicsEllipseItem(item->rect().x() + item->fadeIn() * m_scale - size, item->rect().y() - 8, size * 2, 16);
+ m_visualTip = new QGraphicsEllipseItem(item->pos().x() + item->fadeIn() * m_scale - size, item->pos().y() - 8, size * 2, 16);
((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
m_visualTip->setZValue(100);
m_visualTip->setPos(0, 0);
double scale = 2.0;
m_animation->setScaleAt(.5, scale, scale);
- m_animation->setPosAt(.5, QPointF(item->rect().x() - item->rect().x() * scale - item->fadeIn() * m_scale, item->rect().y() - item->rect().y() * scale));
+ m_animation->setPosAt(.5, QPointF(item->pos().x() - item->pos().x() * scale - item->fadeIn() * m_scale, item->pos().y() - item->pos().y() * scale));
scale = 1.0;
m_animation->setScaleAt(1, scale, scale);
- m_animation->setPosAt(1, QPointF(item->rect().x() - item->rect().x() * scale, item->rect().y() - item->rect().y() * scale));
+ m_animation->setPosAt(1, QPointF(item->pos().x() - item->pos().x() * scale, item->pos().y() - item->pos().y() * scale));
scene()->addItem(m_visualTip);
m_animationTimer->start();
}
} else if (opMode == FADEOUT) {
if (m_visualTip == NULL) {
ClipItem *item = (ClipItem *) clip;
- m_visualTip = new QGraphicsEllipseItem(item->rect().x() + item->rect().width() - item->fadeOut() * m_scale - size, item->rect().y() - 8, size*2, 16);
+ m_visualTip = new QGraphicsEllipseItem(item->pos().x() + item->rect().width() - item->fadeOut() * m_scale - size, item->pos().y() - 8, size*2, 16);
((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
m_visualTip->setZValue(100);
m_visualTip->setPos(0, 0);
double scale = 2.0;
m_animation->setScaleAt(.5, scale, scale);
- m_animation->setPosAt(.5, QPointF(item->rect().x() - item->rect().x() * scale - item->rect().width() + item->fadeOut() * m_scale, item->rect().y() - item->rect().y() * scale));
+ m_animation->setPosAt(.5, QPointF(item->pos().x() - item->pos().x() * scale - item->rect().width() + item->fadeOut() * m_scale, item->pos().y() - item->pos().y() * scale));
scale = 1.0;
m_animation->setScaleAt(1, scale, scale);
- m_animation->setPosAt(1, QPointF(item->rect().x() - item->rect().x() * scale, item->rect().y() - item->rect().y() * scale));
+ m_animation->setPosAt(1, QPointF(item->pos().x() - item->pos().x() * scale, item->pos().y() - item->pos().y() * scale));
scene()->addItem(m_visualTip);
m_animationTimer->start();
}
setCursor(Qt::PointingHandCursor);
} else if (opMode == TRANSITIONSTART) {
if (m_visualTip == NULL) {
+ QRectF rect = clip->sceneBoundingRect();
m_visualTip = new QGraphicsEllipseItem(-5, -5 , 10, 10);
((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
m_animation = new QGraphicsItemAnimation;
m_animation->setItem(m_visualTip);
m_animation->setTimeLine(m_animationTimer);
- m_visualTip->setPos(clip->rect().x() + 10, clip->rect().y() + clip->rect().height() / 2 + 12);
+ m_visualTip->setPos(rect.x() + 10, rect.y() + rect.height() / 2 + 12);
double scale = 2.0;
m_animation->setScaleAt(.5, scale, scale);
scale = 1.0;
setCursor(Qt::PointingHandCursor);
} else if (opMode == TRANSITIONEND) {
if (m_visualTip == NULL) {
+ QRectF rect = clip->sceneBoundingRect();
m_visualTip = new QGraphicsEllipseItem(-5, -5 , 10, 10);
((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
m_animation = new QGraphicsItemAnimation;
m_animation->setItem(m_visualTip);
m_animation->setTimeLine(m_animationTimer);
- m_visualTip->setPos(clip->rect().x() + clip->rect().width() - 10 , clip->rect().y() + clip->rect().height() / 2 + 12);
+ m_visualTip->setPos(rect.x() + rect.width() - 10 , rect.y() + rect.height() / 2 + 12);
double scale = 2.0;
m_animation->setScaleAt(.5, scale, scale);
scale = 1.0;
}
} // no clip under mouse
else if (m_tool == RAZORTOOL) {
- QGraphicsView::mouseMoveEvent(event);
+ event->accept();
return;
} else if (opMode == MOVEGUIDE) {
m_moveOpMode = opMode;
// virtual
void CustomTrackView::mousePressEvent(QMouseEvent * event) {
m_menuPosition = QPoint();
- activateMonitor();
+ m_blockRefresh = true;
+ if (m_tool != RAZORTOOL) activateMonitor();
m_clickEvent = event->pos();
QList<QGraphicsItem *> collisionList = items(event->pos());
if (event->button() == Qt::MidButton) {
m_document->renderer()->switchPlay();
+ m_blockRefresh = false;
return;
}
if (event->modifiers() == Qt::ControlModifier && collisionList.count() == 0) {
setDragMode(QGraphicsView::ScrollHandDrag);
QGraphicsView::mousePressEvent(event);
+ m_blockRefresh = false;
return;
} else if (event->modifiers() == Qt::ShiftModifier && collisionList.count() == 0) {
setDragMode(QGraphicsView::RubberBandDrag);
QGraphicsView::mousePressEvent(event);
+ m_blockRefresh = false;
return;
} else {
bool collision = false;
QGraphicsItem *item = collisionList.at(i);
if (item->type() == AVWIDGET || item->type() == TRANSITIONWIDGET) {
if (m_tool == RAZORTOOL) {
+ m_dragItem = NULL;
if (item->type() == TRANSITIONWIDGET) {
emit displayMessage(i18n("Cannot cut a transition"), ErrorMessage);
+ event->accept();
return;
}
- AbstractClipItem *clip = (AbstractClipItem *) item;
- ItemInfo info;
- info.startPos = clip->startPos();
- info.endPos = clip->endPos();
- info.track = clip->track();
- RazorClipCommand* command = new RazorClipCommand(this, info, GenTime((int)(mapToScene(event->pos()).x() / m_scale), m_document->fps()), true);
+ AbstractClipItem *clip = static_cast <AbstractClipItem *>(item);
+ RazorClipCommand* command = new RazorClipCommand(this, clip->info(), GenTime((int)(mapToScene(event->pos()).x() / m_scale), m_document->fps()), true);
m_commandStack->push(command);
m_document->setModified(true);
+ event->accept(); //QGraphicsView::mousePressEvent(event);
return;
}
// select item
m_dragItem = (AbstractClipItem *) item;
- m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps()) * m_scale), (int)(event->pos().y() - m_dragItem->rect().top()));
+ m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps()) * m_scale), (int)(event->pos().y() - m_dragItem->pos().y()));
m_dragItemInfo.startPos = m_dragItem->startPos();
m_dragItemInfo.endPos = m_dragItem->endPos();
m_dragItemInfo.track = m_dragItem->track();
m_selectedClipList.append(static_cast <AbstractClipItem *>(selected.at(i)));
}
- m_operationMode = m_dragItem->operationMode(item->mapFromScene(mapToScene(event->pos())), m_scale);
+ m_operationMode = m_dragItem->operationMode(mapToScene(event->pos()), m_scale);
if (m_operationMode == KEYFRAME) {
m_dragItem->updateSelectedKeyFrame();
+ m_blockRefresh = false;
return;
} else if (m_operationMode == MOVE) setCursor(Qt::ClosedHandCursor);
else if (m_operationMode == TRANSITIONSTART) {
if (m_dragItem && m_dragItem->type() == AVWIDGET) emit clipItemSelected((ClipItem*) m_dragItem);
else emit clipItemSelected(NULL);
}
+ m_blockRefresh = false;
//kDebug()<<pos;
//QGraphicsView::mousePressEvent(event);
}
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;
}
void CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut) {
if (cut) {
// cut clip
- ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()), info.track);
- if (!item) {
+ ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()) + 1, info.track);
+ if (!item || cutTime >= item->endPos() || cutTime <= item->startPos()) {
emit displayMessage(i18n("Cannot find clip to cut"), ErrorMessage);
+ kDebug() << "///////// ERROR CUTTING CLIP : (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), INFO: (" << info.startPos.frames(25) << "-" << info.endPos.frames(25) << ")" << ", CUT: " << cutTime.frames(25);
+ m_blockRefresh = false;
return;
}
+ kDebug() << "///////// CUTTING CLIP : (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), INFO: (" << info.startPos.frames(25) << "-" << info.endPos.frames(25) << ")" << ", CUT: " << cutTime.frames(25);
+
+ m_document->renderer()->mltCutClip(m_tracksList.count() - info.track, cutTime);
int cutPos = (int) cutTime.frames(m_document->fps());
ItemInfo newPos;
newPos.startPos = cutTime;
newPos.endPos = info.endPos;
newPos.cropStart = item->cropStart() + (cutTime - info.startPos);
newPos.track = info.track;
+ ClipItem *dup = item->clone(m_scale, newPos);
+ kDebug() << "// REsizing item to: " << cutPos;
item->resizeEnd(cutPos, m_scale);
- ClipItem *dup = new ClipItem(item->baseClip(), newPos, m_scale, m_document->fps());
- dup->setEffectList(item->effectList());
scene()->addItem(dup);
- m_document->renderer()->mltCutClip(m_tracksList.count() - info.track, cutTime);
item->baseClip()->addReference();
m_document->updateClip(item->baseClip()->getId());
+ 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);
+ kDebug() << "// CUTTING CLIP dONE";
} else {
// uncut clip
+
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) {
+ ClipItem *dup = getClipItemAt((int) cutTime.frames(m_document->fps()) + 1, info.track);
+ if (!item || !dup || item == dup) {
emit displayMessage(i18n("Cannot find clip to uncut"), ErrorMessage);
+ m_blockRefresh = false;
return;
}
+
+ kDebug() << "// UNCUTTING CLIPS: ITEM 1 (" << item->startPos().frames(25) << "x" << item->endPos().frames(25) << ")";
+ kDebug() << "// UNCUTTING CLIPS: ITEM 2 (" << dup->startPos().frames(25) << "x" << dup->endPos().frames(25) << ")";
+ kDebug() << "// UNCUTTING CLIPS, INFO (" << info.startPos.frames(25) << "x" << info.endPos.frames(25) << ") , CUT: " << cutTime.frames(25);;
+ //deleteClip(dup->info());
+
+
+ if (dup->isSelected()) emit clipItemSelected(NULL);
+ dup->baseClip()->removeReference();
+ m_document->updateClip(dup->baseClip()->getId());
+ scene()->removeItem(dup);
delete dup;
- item->baseClip()->removeReference();
- m_document->updateClip(item->baseClip()->getId());
- item->resizeEnd((int) info.endPos.frames(m_document->fps()), m_scale);
m_document->renderer()->mltRemoveClip(m_tracksList.count() - info.track, cutTime);
- m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - info.track, info.startPos, item->cropStart(), item->cropStart() + info.endPos - info.startPos);
+
+ ItemInfo clipinfo = item->info();
+ clipinfo.track = m_tracksList.count() - clipinfo.track;
+ bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, info.endPos - info.startPos);
+ if (success) {
+ item->resizeEnd((int) info.endPos.frames(m_document->fps()), m_scale);
+ } else
+ emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
+
}
+ QTimer::singleShot(3000, this, SLOT(slotEnableRefresh()));
}
+void CustomTrackView::slotEnableRefresh() {
+ m_blockRefresh = false;
+}
void CustomTrackView::slotAddTransitionToSelectedClips(QDomElement transition) {
QList<QGraphicsItem *> itemList = scene()->selectedItems();
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);
}
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();
+ //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;
}
void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
+ QGraphicsView::mouseReleaseEvent(event);
if (event->button() == Qt::MidButton) {
return;
}
- QGraphicsView::mouseReleaseEvent(event);
setDragMode(QGraphicsView::NoDrag);
if (m_operationMode == MOVEGUIDE) {
setCursor(Qt::ArrowCursor);
emit transitionItemSelected(NULL);
return;
}
- ItemInfo info;
- info.startPos = m_dragItem->startPos();
- info.endPos = m_dragItem->endPos();
- info.track = m_dragItem->track();
+ ItemInfo info = m_dragItem->info();
if (m_operationMode == MOVE) {
setCursor(Qt::OpenHandCursor);
} 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);
+ ItemInfo resizeinfo = m_dragItemInfo;
+ resizeinfo.track = m_tracksList.count() - resizeinfo.track;
+ bool success = m_document->renderer()->mltResizeClipStart(resizeinfo, m_dragItem->startPos() - m_dragItemInfo.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);
} else if (m_operationMode == RESIZEEND && m_dragItem->endPos() != m_dragItemInfo.endPos) {
// resize end
if (m_dragItem->type() == AVWIDGET) {
- ResizeClipCommand *command = new ResizeClipCommand(this, m_dragItemInfo, info, false);
- m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - m_dragItem->track(), m_dragItem->startPos(), m_dragItem->cropStart(), m_dragItem->cropStart() + m_dragItem->endPos() - m_dragItem->startPos());
- m_commandStack->push(command);
+ ItemInfo resizeinfo = info;
+ resizeinfo.track = m_tracksList.count() - 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);
+ } else {
+ m_dragItem->resizeEnd((int) m_dragItemInfo.endPos.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);
Transition *transition = (Transition *) m_dragItem;
- m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_tracksList.count() - m_dragItemInfo.track), (int)(m_tracksList.count() - m_dragItemInfo.track), 0, m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
+// m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_tracksList.count() - m_dragItemInfo.track), (int)(m_tracksList.count() - m_dragItemInfo.track), 0, m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos);
}
//m_document->renderer()->doRefresh();
} else if (m_operationMode == FADEIN) {
if (item->isSelected()) emit clipItemSelected(NULL);
item->baseClip()->removeReference();
m_document->updateClip(item->baseClip()->getId());
+ scene()->removeItem(item);
delete item;
m_document->renderer()->mltRemoveClip(m_tracksList.count() - info.track, info.startPos);
m_document->renderer()->doRefresh();
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());
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET) {
- ClipItem *item = (ClipItem *) itemList.at(i);
- ItemInfo info;
- info.startPos = item->startPos();
- info.endPos = item->endPos();
- if (currentPos > info.startPos && currentPos < info.endPos) {
- info.track = item->track();
- RazorClipCommand *command = new RazorClipCommand(this, info, currentPos, true);
+ ClipItem *item = static_cast <ClipItem *>(itemList.at(i));
+ if (currentPos > item->startPos() && currentPos < item->endPos()) {
+ RazorClipCommand *command = new RazorClipCommand(this, item->info(), currentPos, true);
m_commandStack->push(command);
}
}
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);
+ ItemInfo clipinfo = item->info();
+ clipinfo.track = m_tracksList.count() - clipinfo.track;
+ bool success = m_document->renderer()->mltResizeClipStart(clipinfo, item->startPos() - 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);
- updateClipFade(item, true);
+ ItemInfo clipinfo = item->info();
+ clipinfo.track = m_tracksList.count() - clipinfo.track;
+ bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, end.endPos - clipinfo.startPos);
+ if (success) {
+ item->resizeEnd((int) end.endPos.frames(m_document->fps()), m_scale);
+ updateClipFade(item, true);
+ } else emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
}
m_document->renderer()->doRefresh();
}
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) {
AbstractClipItem *clip = (AbstractClipItem *)itemList.at(i);
- clip->setRect(clip->startPos().frames(m_document->fps()) * m_scale, clip->rect().y(), clip->duration().frames(m_document->fps()) * m_scale, clip->rect().height());
+ clip->setRect(0, 0, (qreal) clip->duration().frames(m_document->fps()) * m_scale - .5, clip->rect().height());
+ clip->setPos((qreal) clip->startPos().frames(m_document->fps()) * m_scale, clip->pos().y());
}
}
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));
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 )
{