X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcustomtrackview.cpp;h=9a53b99526d588cf8492cc707f5fdad1a4a3bc54;hb=6c819d9cd57a199efc99ec3f6a4a54eae9a232c0;hp=addd479fc335faed2f50d77d86aba51fa321aab8;hpb=5c6ce89e927a16109a48c68134ffe8c38a348c39;p=kdenlive diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index addd479f..9a53b995 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -63,6 +63,7 @@ #include "commands/configtrackscommand.h" #include "commands/rebuildgroupcommand.h" #include "commands/razorgroupcommand.h" +#include "commands/refreshmonitorcommand.h" #include "profilesdialog.h" #include "lib/audio/audioEnvelope.h" @@ -404,16 +405,29 @@ void CustomTrackView::slotCheckPositionScrolling() } } +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); @@ -445,7 +459,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) 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()); @@ -458,7 +472,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) 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()); @@ -592,11 +606,8 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) if (m_tool == RAZORTOOL) { setCursor(m_razorCursor); - //QGraphicsView::mouseMoveEvent(event); - //return; } else if (m_tool == SPACERTOOL) { setCursor(m_spacerCursor); - return; } QList itemList = items(event->pos()); @@ -605,12 +616,18 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) 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 (item); @@ -706,7 +723,6 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) return; } else if (opMode == MOVEGUIDE) { m_moveOpMode = opMode; - setCursor(Qt::SplitHCursor); } else { removeTipAnimation(); setCursor(Qt::ArrowCursor); @@ -769,9 +785,9 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) 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; } @@ -878,7 +894,6 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) // No item under click if (m_dragItem == NULL || m_tool == SPACERTOOL) { resetSelectionGroup(false); - setCursor(Qt::ArrowCursor); m_scene->clearSelection(); //event->accept(); updateClipTypeActions(NULL); @@ -951,6 +966,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) } m_operationMode = SPACER; } else { + setCursor(Qt::ArrowCursor); seekCursorPos((int)(mapToScene(event->x(), 0).x())); } QGraphicsView::mousePressEvent(event); @@ -1017,7 +1033,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) if (selected == false) { m_dragItem = NULL; } - groupSelectedItems(); + groupSelectedItems(QList (), false, false, true); if (m_dragItem) { ClipItem *clip = static_cast (m_dragItem); updateClipTypeActions(dragGroup == NULL ? clip : NULL); @@ -2711,7 +2727,7 @@ void CustomTrackView::dropEvent(QDropEvent * event) m_dragItem = static_cast (items.at(0)); emit clipItemSelected((ClipItem*) m_dragItem, false); } - m_document->renderer()->doRefresh(); + m_document->renderer()->refreshIfActive(); event->setDropAction(Qt::MoveAction); event->accept(); @@ -2754,7 +2770,9 @@ void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, ItemInf 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; @@ -3428,8 +3446,10 @@ void CustomTrackView::deleteClip(const QString &clipId) delete deleteCommand; } else { updateTrackDuration(-1, deleteCommand); + new RefreshMonitorCommand(this, false, deleteCommand); m_commandStack->push(deleteCommand); } + m_document->renderer()->doRefresh(); } void CustomTrackView::seekCursorPos(int pos) @@ -3494,8 +3514,15 @@ void CustomTrackView::checkScrolling() 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; @@ -3918,6 +3945,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) } } else { prepareResizeClipStart(m_dragItem, m_dragItemInfo, m_dragItem->startPos().frames(m_document->fps())); + if (m_dragItem->type() == AVWIDGET) static_cast (m_dragItem)->slotUpdateRange(); } } else if (m_operationMode == RESIZEEND && m_dragItem->endPos() != m_dragItemInfo.endPos) { // resize end @@ -3943,6 +3971,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) } } else { prepareResizeClipEnd(m_dragItem, m_dragItemInfo, m_dragItem->endPos().frames(m_document->fps())); + if (m_dragItem->type() == AVWIDGET) static_cast (m_dragItem)->slotUpdateRange(); } } else if (m_operationMode == FADEIN) { // resize fade in effect @@ -4197,7 +4226,9 @@ void CustomTrackView::deleteSelectedClips() deleteSelected->setText(i18np("Delete selected transition", "Delete selected transitions", transitionCount)); else deleteSelected->setText(i18n("Delete selected items")); updateTrackDuration(-1, deleteSelected); + new RefreshMonitorCommand(this, false, deleteSelected); m_commandStack->push(deleteSelected); + m_document->renderer()->doRefresh(); } @@ -4404,7 +4435,7 @@ void CustomTrackView::doGroupClips(QList clipInfos, QList //clip->setSelected(true); } } - groupSelectedItems(list, false, true); + groupSelectedItems(list, false, true, true); setDocumentModified(); } @@ -4854,8 +4885,9 @@ void CustomTrackView::resizeClip(const ItemInfo &start, const ItemInfo &end, boo 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 { @@ -5678,6 +5710,16 @@ void CustomTrackView::slotDeleteAllGuides() 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) @@ -6011,6 +6053,7 @@ void CustomTrackView::pasteClip() } } updateTrackDuration(-1, pasteClips); + new RefreshMonitorCommand(this, false, pasteClips); m_commandStack->push(pasteClips); } @@ -6823,6 +6866,11 @@ void CustomTrackView::setAudioAndVideo() m_commandStack->push(videoCommand); } +void CustomTrackView::monitorRefresh() +{ + m_document->renderer()->doRefresh(); +} + void CustomTrackView::doChangeClipType(const GenTime &pos, int track, bool videoOnly, bool audioOnly) { ClipItem *clip = getClipItemAt(pos, track); @@ -7047,6 +7095,7 @@ void CustomTrackView::slotSelectTrack(int ix) void CustomTrackView::slotSelectClipsInTrack() { QRectF rect(0, m_selectedTrack * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), m_tracksHeight / 2 - 1); + resetSelectionGroup(); QList selection = m_scene->items(rect); m_scene->clearSelection(); QList list; @@ -7055,16 +7104,14 @@ void CustomTrackView::slotSelectClipsInTrack() list.append(selection.at(i)); } } - resetSelectionGroup(); - groupSelectedItems(list); + groupSelectedItems(list, false, false, true); } void CustomTrackView::slotSelectAllClips() { - QList 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) @@ -7594,7 +7641,23 @@ void CustomTrackView::slotImportClipKeyframes(GRAPHICSRECTITEM type) 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()) { @@ -7617,7 +7680,7 @@ void CustomTrackView::slotImportClipKeyframes(GRAPHICSRECTITEM type) result.append(';'); } } - emit importKeyframes(type, result); + emit importKeyframes(type, result, ui.limit_keyframes->isChecked() ? ui.max_keyframes->value() : -1); delete d; }