From 86329423d0ea65f95da4d745fd2ac94a416aa27c Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Thu, 12 Feb 2009 13:26:47 +0000 Subject: [PATCH] Fix adjusting clip crop start through edit widget (double click on clip) svn path=/branches/KDE4/; revision=3047 --- src/clipdurationdialog.cpp | 28 ++++++++++++++++++++++++---- src/clipdurationdialog.h | 1 + src/customtrackview.cpp | 36 ++++++++++++++++++++---------------- src/renderer.cpp | 33 +++++++++++++++++++++++++++++---- src/renderer.h | 1 + 5 files changed, 75 insertions(+), 24 deletions(-) diff --git a/src/clipdurationdialog.cpp b/src/clipdurationdialog.cpp index 36e67606..3948df27 100644 --- a/src/clipdurationdialog.cpp +++ b/src/clipdurationdialog.cpp @@ -20,6 +20,7 @@ #include +#include "clipitem.h" #include "clipdurationdialog.h" #include "kdenlivesettings.h" #include @@ -29,7 +30,14 @@ ClipDurationDialog::ClipDurationDialog(AbstractClipItem *clip, Timecode tc, QWid m_fps = m_tc.fps(); m_view.setupUi(this); - if (clip->type() == TRANSITIONWIDGET) { + bool allowCrop = true; + if (clip->type() == AVWIDGET) { + ClipItem *item = static_cast (clip); + int t = item->clipType(); + if (t == COLOR || t == IMAGE || t == TEXT) allowCrop = false; + } + + if (!allowCrop || clip->type() == TRANSITIONWIDGET) { m_view.crop_up->hide(); m_view.crop_down->hide(); m_view.crop_position->hide(); @@ -45,7 +53,7 @@ ClipDurationDialog::ClipDurationDialog(AbstractClipItem *clip, Timecode tc, QWid connect(m_view.crop_down, SIGNAL(clicked()), this, SLOT(slotCropDown())); connect(m_view.duration_up, SIGNAL(clicked()), this, SLOT(slotDurUp())); connect(m_view.duration_down, SIGNAL(clicked()), this, SLOT(slotDurDown())); - + connect(m_view.crop_position, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckCrop())); adjustSize(); } @@ -76,8 +84,20 @@ void ClipDurationDialog::slotCheckDuration() { int dur = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps); GenTime start(pos, m_fps); GenTime duration(dur, m_fps); - if (start + duration > m_max) { - m_view.clip_duration->setText(m_tc.getTimecode(m_max - start, m_fps)); + GenTime maxDuration = m_max == GenTime() ? start + m_clip->maxDuration() : qMin(m_max, start + m_clip->maxDuration()); + if (start + duration > maxDuration) { + m_view.clip_duration->setText(m_tc.getTimecode(maxDuration - start, m_fps)); + } +} + +void ClipDurationDialog::slotCheckCrop() { + int dur = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps); + int crop = m_tc.getFrameCount(m_view.crop_position->text(), m_fps); + GenTime duration(dur, m_fps); + GenTime cropStart(crop, m_fps); + GenTime maxDuration = m_clip->maxDuration(); + if (cropStart + duration > maxDuration) { + m_view.crop_position->setText(m_tc.getTimecode(maxDuration - duration, m_fps)); } } diff --git a/src/clipdurationdialog.h b/src/clipdurationdialog.h index 17cfe06b..f0fbcff9 100644 --- a/src/clipdurationdialog.h +++ b/src/clipdurationdialog.h @@ -51,6 +51,7 @@ private slots: void slotCropDown(); void slotCheckDuration(); void slotCheckStart(); + void slotCheckCrop(); private: Ui::ClipDurationDialog_UI m_view; diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 52b3328f..f948af70 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -888,23 +888,18 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event) { // move and resize clip QUndoCommand *moveCommand = new QUndoCommand(); moveCommand->setText(i18n("Edit clip")); - ItemInfo clipInfo; - clipInfo.startPos = m_dragItem->startPos(); - clipInfo.endPos = m_dragItem->endPos(); - clipInfo.track = m_dragItem->track(); - if (d.startPos() != m_dragItem->startPos()) { + ItemInfo clipInfo = m_dragItem->info(); + if (d.startPos() != clipInfo.startPos) { ItemInfo startInfo = clipInfo; clipInfo.startPos = d.startPos(); clipInfo.endPos = m_dragItem->endPos() + (clipInfo.startPos - startInfo.startPos); - clipInfo.track = m_dragItem->track(); new MoveClipCommand(this, startInfo, clipInfo, true, moveCommand); } - if (d.duration() != m_dragItem->duration()) { - ItemInfo endInfo; - endInfo.startPos = clipInfo.startPos; - endInfo.endPos = endInfo.startPos + d.duration(); - endInfo.track = m_dragItem->track(); - new ResizeClipCommand(this, clipInfo, endInfo, true, moveCommand); + if (d.duration() != m_dragItem->duration() || d.cropStart() != clipInfo.cropStart) { + ItemInfo startInfo = clipInfo; + clipInfo.endPos = clipInfo.startPos + d.duration(); + clipInfo.cropStart = d.cropStart(); + new ResizeClipCommand(this, startInfo, clipInfo, true, moveCommand); } m_commandStack->push(moveCommand); } @@ -2630,12 +2625,11 @@ void CustomTrackView::moveTransition(const ItemInfo start, const ItemInfo end) { } void CustomTrackView::resizeClip(const ItemInfo start, const ItemInfo end) { - int offset = 0; bool resizeClipStart = true; if (start.startPos == end.startPos) resizeClipStart = false; /*if (resizeClipStart) offset = 1; else offset = -1;*/ - ClipItem *item = getClipItemAt((int)(start.startPos.frames(m_document->fps()) + offset), start.track); + ClipItem *item = getClipItemAt((int)(start.startPos.frames(m_document->fps())), start.track); if (!item) { emit displayMessage(i18n("Cannot move clip at time: %1 on track %2", m_document->timecode().getTimecodeFromFrames(start.startPos.frames(m_document->fps())), start.track), ErrorMessage); kDebug() << "----------------  ERROR, CANNOT find clip to resize at... "; // << startPos; @@ -2643,7 +2637,7 @@ void CustomTrackView::resizeClip(const ItemInfo start, const ItemInfo end) { } bool snap = KdenliveSettings::snaptopoints(); KdenliveSettings::setSnaptopoints(false); - if (resizeClipStart) { + if (resizeClipStart && start.startPos != end.startPos) { ItemInfo clipinfo = item->info(); clipinfo.track = m_document->tracksCount() - clipinfo.track; bool success = m_document->renderer()->mltResizeClipStart(clipinfo, end.startPos - item->startPos()); @@ -2651,7 +2645,7 @@ void CustomTrackView::resizeClip(const ItemInfo start, const ItemInfo end) { item->resizeStart((int) end.startPos.frames(m_document->fps())); updateClipFade(item); } else emit displayMessage(i18n("Error when resizing clip"), ErrorMessage); - } else { + } else if (!resizeClipStart) { ItemInfo clipinfo = item->info(); clipinfo.track = m_document->tracksCount() - clipinfo.track; bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, end.endPos - clipinfo.startPos); @@ -2660,6 +2654,16 @@ void CustomTrackView::resizeClip(const ItemInfo start, const ItemInfo end) { updateClipFade(item, true); } else emit displayMessage(i18n("Error when resizing clip"), ErrorMessage); } + if (end.cropStart != start.cropStart) { + kDebug() << "// RESIZE CROP, DIFF: " << (end.cropStart - start.cropStart).frames(25); + ItemInfo clipinfo = end; + clipinfo.track = m_document->tracksCount() - end.track; + bool success = m_document->renderer()->mltResizeClipCrop(clipinfo, end.cropStart - start.cropStart); + if (success) { + item->setCropStart(end.cropStart); + item->resetThumbs(); + } + } m_document->renderer()->doRefresh(); KdenliveSettings::setSnaptopoints(snap); } diff --git a/src/renderer.cpp b/src/renderer.cpp index 06782a6d..dce3d032 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -2147,6 +2147,35 @@ void Render::mltChangeTrackState(int track, bool mute, bool blind) { refresh(); } + +bool Render::mltResizeClipCrop(ItemInfo info, GenTime diff) { + Mlt::Service service(m_mltProducer->parent().get_service()); + int frameOffset = (int) diff.frames(m_fps); + Mlt::Tractor tractor(service); + Mlt::Producer trackProducer(tractor.track(info.track)); + Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service()); + if (trackPlaylist.is_blank_at(info.startPos.frames(m_fps))) { + kDebug() << "//////// ERROR RSIZING BLANK CLIP!!!!!!!!!!!"; + return false; + } + mlt_service_lock(service.get_service()); + int clipIndex = trackPlaylist.get_clip_index_at(info.startPos.frames(m_fps)); + Mlt::Producer *clip = trackPlaylist.get_clip(clipIndex); + if (clip == NULL) { + kDebug() << "//////// ERROR RSIZING NULL CLIP!!!!!!!!!!!"; + mlt_service_unlock(service.get_service()); + return false; + } + int previousStart = clip->get_in(); + int previousDuration = trackPlaylist.clip_length(clipIndex) - 1; + m_isBlocked = true; + trackPlaylist.resize_clip(clipIndex, previousStart + frameOffset, previousStart + previousDuration + frameOffset); + m_isBlocked = false; + mlt_service_unlock(service.get_service()); + m_mltConsumer->set("refresh", 1); + return true; +} + bool Render::mltResizeClipStart(ItemInfo info, GenTime diff) { //kDebug() << "//////// RSIZING CLIP from: "<parent().get_service()); @@ -2160,16 +2189,12 @@ bool Render::mltResizeClipStart(ItemInfo info, GenTime diff) { } mlt_service_lock(service.get_service()); int clipIndex = trackPlaylist.get_clip_index_at(info.startPos.frames(m_fps)); - /*int previousStart = trackPlaylist.clip_start(clipIndex); - int previousDuration = trackPlaylist.clip_length(clipIndex) - 1;*/ - //kDebug() << " ** RESIZING CLIP START:" << clipIndex << " on track:" << track << ", mid pos: " << pos.frames(25) << ", moving: " << moveFrame << ", in: " << in.frames(25) << ", out: " << out.frames(25); Mlt::Producer *clip = trackPlaylist.get_clip(clipIndex); if (clip == NULL) { kDebug() << "//////// ERROR RSIZING NULL CLIP!!!!!!!!!!!"; mlt_service_unlock(service.get_service()); return false; } - //m_mltConsumer->set("refresh", 0); int previousStart = clip->get_in(); int previousDuration = trackPlaylist.clip_length(clipIndex) - 1; m_isBlocked = true; diff --git a/src/renderer.h b/src/renderer.h index 557de898..fd83a14e 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -154,6 +154,7 @@ Q_OBJECT public: int mltGetSpaceLength(const GenTime pos, int track, bool fromBlankStart); bool mltResizeClipEnd(ItemInfo info, GenTime clipDuration); bool mltResizeClipStart(ItemInfo info, GenTime diff); + bool mltResizeClipCrop(ItemInfo info, GenTime diff); bool mltMoveClip(int startTrack, int endTrack, GenTime pos, GenTime moveStart, Mlt::Producer *prod); bool mltMoveClip(int startTrack, int endTrack, int pos, int moveStart, Mlt::Producer *prod); bool mltRemoveClip(int track, GenTime position); -- 2.39.2