#include <KDebug>
+#include "clipitem.h"
#include "clipdurationdialog.h"
#include "kdenlivesettings.h"
#include <QWheelEvent>
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();
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();
}
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));
}
}
void slotCropDown();
void slotCheckDuration();
void slotCheckStart();
+ void slotCheckCrop();
private:
Ui::ClipDurationDialog_UI m_view;
// 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);
}
}
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;
}
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());
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);
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);
}
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());
}
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;
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);