}
}
+void CustomTrackView::slotAlignPlayheadToMousePos()
+{
+ /* get curser point ref in screen coord */
+ QPoint ps = QCursor::pos();
+ /* get xPos in scene coord */
+ int mappedXPos = qMax((int)(mapToScene(mapFromGlobal(ps)).x() + 0.5), 0);
+ /* move playhead to new xPos*/
+ seekCursorPos(mappedXPos);
+}
// virtual
void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
{
int pos = event->x();
int mappedXPos = qMax((int)(mapToScene(event->pos()).x() + 0.5), 0);
-
double snappedPos = getSnapPointForPos(mappedXPos);
emit mousePosition(mappedXPos);
+ if (m_operationMode == SCROLLTIMELINE) {
+ QGraphicsView::mouseMoveEvent(event);
+ return;
+ }
+
if (event->buttons() & Qt::MidButton) return;
if (dragMode() == QGraphicsView::RubberBandDrag || (event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL && m_operationMode != RESIZESTART && m_operationMode != RESIZEEND)) {
event->setAccepted(true);
if (parent)
parent->resizeStart((int)(snappedPos - m_dragItemInfo.startPos.frames(m_document->fps())));
} else {
- m_dragItem->resizeStart((int)(snappedPos));
+ m_dragItem->resizeStart((int)(snappedPos), true, false);
}
QString crop = m_document->timecode().getDisplayTimecode(m_dragItem->cropStart(), KdenliveSettings::frametimecode());
QString duration = m_document->timecode().getDisplayTimecode(m_dragItem->cropDuration(), KdenliveSettings::frametimecode());
if (parent)
parent->resizeEnd((int)(snappedPos - m_dragItemInfo.endPos.frames(m_document->fps())));
} else {
- m_dragItem->resizeEnd((int)(snappedPos));
+ m_dragItem->resizeEnd((int)(snappedPos), false);
}
QString duration = m_document->timecode().getDisplayTimecode(m_dragItem->cropDuration(), KdenliveSettings::frametimecode());
QString offset = m_document->timecode().getDisplayTimecode(m_dragItem->cropDuration() - m_dragItemInfo.cropDuration, KdenliveSettings::frametimecode());
if (m_tool == RAZORTOOL) {
setCursor(m_razorCursor);
- //QGraphicsView::mouseMoveEvent(event);
- //return;
} else if (m_tool == SPACERTOOL) {
setCursor(m_spacerCursor);
- return;
}
QList<QGraphicsItem *> itemList = items(event->pos());
if (itemList.count() == 1 && itemList.at(0)->type() == GUIDEITEM) {
opMode = MOVEGUIDE;
+ setCursor(Qt::SplitHCursor);
} else for (int i = 0; i < itemList.count(); i++) {
- if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) {
- item = (QGraphicsRectItem*) itemList.at(i);
- break;
- }
- }
+ if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) {
+ item = (QGraphicsRectItem*) itemList.at(i);
+ break;
+ }
+ }
+
+ if (m_tool == SPACERTOOL) {
+ event->accept();
+ return;
+ }
if (item && event->buttons() == Qt::NoButton) {
AbstractClipItem *clip = static_cast <AbstractClipItem*>(item);
return;
} else if (opMode == MOVEGUIDE) {
m_moveOpMode = opMode;
- setCursor(Qt::SplitHCursor);
} else {
removeTipAnimation();
setCursor(Qt::ArrowCursor);
if (event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL && collisionList.count() == 0) {
// Pressing Ctrl + left mouse button in an empty area scrolls the timeline
setDragMode(QGraphicsView::ScrollHandDrag);
- QGraphicsView::mousePressEvent(event);
m_blockRefresh = false;
- m_operationMode = NONE;
+ m_operationMode = SCROLLTIMELINE;
+ QGraphicsView::mousePressEvent(event);
return;
}
// No item under click
if (m_dragItem == NULL || m_tool == SPACERTOOL) {
resetSelectionGroup(false);
- setCursor(Qt::ArrowCursor);
m_scene->clearSelection();
//event->accept();
updateClipTypeActions(NULL);
}
m_operationMode = SPACER;
} else {
+ setCursor(Qt::ArrowCursor);
seekCursorPos((int)(mapToScene(event->x(), 0).x()));
}
QGraphicsView::mousePressEvent(event);
if (selected == false) {
m_dragItem = NULL;
}
- groupSelectedItems();
+ groupSelectedItems(QList <QGraphicsItem*>(), false, false, true);
if (m_dragItem) {
ClipItem *clip = static_cast <ClipItem *>(m_dragItem);
updateClipTypeActions(dragGroup == NULL ? clip : NULL);
new RazorClipCommand(this, clipInfo, info.startPos, false, command);
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()));
+ if (dup) {
+ dup->resizeStart(info.endPos.frames(m_document->fps()));
+ }
} else {
ItemInfo newclipInfo = clip->info();
newclipInfo.endPos = info.startPos;
void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
{
if (m_moveOpMode == SEEK) m_moveOpMode = NONE;
+ if (m_operationMode == SCROLLTIMELINE) {
+ m_operationMode = NONE;
+ setDragMode(QGraphicsView::NoDrag);
+ QGraphicsView::mouseReleaseEvent(event);
+ return;
+ }
if (!m_controlModifier && m_operationMode != RUBBERSELECTION) {
//event->accept();
+ setDragMode(QGraphicsView::NoDrag);
if (m_clipDrag) QGraphicsView::mouseReleaseEvent(event);
}
m_clipDrag = false;
}
} else {
prepareResizeClipStart(m_dragItem, m_dragItemInfo, m_dragItem->startPos().frames(m_document->fps()));
+ if (m_dragItem->type() == AVWIDGET) static_cast <ClipItem*>(m_dragItem)->slotUpdateRange();
}
} else if (m_operationMode == RESIZEEND && m_dragItem->endPos() != m_dragItemInfo.endPos) {
// resize end
}
} else {
prepareResizeClipEnd(m_dragItem, m_dragItemInfo, m_dragItem->endPos().frames(m_document->fps()));
+ if (m_dragItem->type() == AVWIDGET) static_cast <ClipItem*>(m_dragItem)->slotUpdateRange();
}
} else if (m_operationMode == FADEIN) {
// resize fade in effect
//clip->setSelected(true);
}
}
- groupSelectedItems(list, false, true);
+ groupSelectedItems(list, false, true, true);
setDocumentModified();
}
ItemInfo clipinfo = item->info();
clipinfo.track = m_document->tracksCount() - clipinfo.track;
bool success = m_document->renderer()->mltResizeClipStart(clipinfo, end.startPos - clipinfo.startPos);
- if (success)
+ if (success) {
item->resizeStart((int) end.startPos.frames(m_document->fps()));
+ }
else
emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
} else {
void CustomTrackView::setTool(PROJECTTOOL tool)
{
m_tool = tool;
+ switch (m_tool) {
+ case RAZORTOOL:
+ setCursor(m_razorCursor);
+ break;
+ case SPACERTOOL:
+ setCursor(m_spacerCursor);
+ break;
+ default:
+ unsetCursor();
+ }
}
void CustomTrackView::setScale(double scaleFactor, double verticalScale)
void CustomTrackView::slotSelectClipsInTrack()
{
QRectF rect(0, m_selectedTrack * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), m_tracksHeight / 2 - 1);
+ resetSelectionGroup();
QList<QGraphicsItem *> selection = m_scene->items(rect);
m_scene->clearSelection();
QList<QGraphicsItem *> list;
list.append(selection.at(i));
}
}
- resetSelectionGroup();
- groupSelectedItems(list);
+ groupSelectedItems(list, false, false, true);
}
void CustomTrackView::slotSelectAllClips()
{
- QList<QGraphicsItem *> selection = m_scene->items();
m_scene->clearSelection();
resetSelectionGroup();
- groupSelectedItems(selection);
+ groupSelectedItems(m_scene->items(), false, false, true);
}
void CustomTrackView::selectClip(bool add, bool group, int track, int pos)
return;
}
QString keyframeData = ui.data_list->itemData(ui.data_list->currentIndex()).toString();
- QStringList keyframeList = keyframeData.split(';', QString::SkipEmptyParts);
+
+ int offset = item->cropStart().frames(m_document->fps());
+ Mlt::Geometry geometry(keyframeData.toUtf8().data(), item->baseClip()->maxDuration().frames(m_document->fps()), m_document->mltProfile().width, m_document->mltProfile().height);
+ Mlt::Geometry newGeometry(QString().toUtf8().data(), item->baseClip()->maxDuration().frames(m_document->fps()), m_document->mltProfile().width, m_document->mltProfile().height);
+ Mlt::GeometryItem gitem;
+ geometry.fetch(&gitem, offset);
+ gitem.frame(0);
+ newGeometry.insert(gitem);
+ int pos = offset + 1;
+ while (!geometry.next_key(&gitem, pos)) {
+ pos = gitem.frame();
+ gitem.frame(pos - offset);
+ pos++;
+ newGeometry.insert(gitem);
+ }
+ QStringList keyframeList = QString(newGeometry.serialise()).split(';', QString::SkipEmptyParts);
+
QString result;
if (ui.import_position->isChecked()) {
if (ui.import_size->isChecked()) {
result.append(';');
}
}
- emit importKeyframes(type, result);
+ emit importKeyframes(type, result, ui.limit_keyframes->isChecked() ? ui.max_keyframes->value() : -1);
delete d;
}