]> git.sesse.net Git - kdenlive/commitdiff
Fix adjusting clip crop start through edit widget (double click on clip)
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 12 Feb 2009 13:26:47 +0000 (13:26 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 12 Feb 2009 13:26:47 +0000 (13:26 +0000)
svn path=/branches/KDE4/; revision=3047

src/clipdurationdialog.cpp
src/clipdurationdialog.h
src/customtrackview.cpp
src/renderer.cpp
src/renderer.h

index 36e676064383590474d8a3a8259c5a01b5fea325..3948df27910074a207f0836116cf9dd99bdb9fb5 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <KDebug>
 
+#include "clipitem.h"
 #include "clipdurationdialog.h"
 #include "kdenlivesettings.h"
 #include <QWheelEvent>
@@ -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 <ClipItem *>(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));
     }
 }
 
index 17cfe06b5d139eb5a3ff4cc287dde1bc3d3efc91..f0fbcff9ca0a09fd6d715313c0cb07d6d36db029 100644 (file)
@@ -51,6 +51,7 @@ private slots:
     void slotCropDown();
     void slotCheckDuration();
     void slotCheckStart();
+    void slotCheckCrop();
 
 private:
     Ui::ClipDurationDialog_UI m_view;
index 52b3328ffd823132f1347ec0e4a22a68dedb4dd0..f948af70aa09da42c82599e723a376dc48ba36a4 100644 (file)
@@ -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);
 }
index 06782a6ddc7260c577fc07c434e7f1cb79788d58..dce3d0329b9d7a08c67fcf676e911bceb4f71785 100644 (file)
@@ -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: "<<info.startPos.frames(25)<<" to "<<diff.frames(25);
     Mlt::Service service(m_mltProducer->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;
index 557de898781a4c859eadfb6a73a138ceae175666..fd83a14e9f799e38ea9ec308f45c27b8f1c715e2 100644 (file)
@@ -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);