From: Jean-Baptiste Mardelle Date: Wed, 11 Feb 2009 10:00:15 +0000 (+0000) Subject: Fix clip and transition move / resize through the double click move / resize widget X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=14a427fb91b1f43f7260f6d274e57c67f6c5b3c6;p=kdenlive Fix clip and transition move / resize through the double click move / resize widget svn path=/branches/KDE4/; revision=3043 --- diff --git a/src/clipdurationdialog.cpp b/src/clipdurationdialog.cpp index 73afbec7..36e67606 100644 --- a/src/clipdurationdialog.cpp +++ b/src/clipdurationdialog.cpp @@ -52,6 +52,35 @@ ClipDurationDialog::ClipDurationDialog(AbstractClipItem *clip, Timecode tc, QWid ClipDurationDialog::~ClipDurationDialog() { } +void ClipDurationDialog::setMargins(GenTime min, GenTime max) { + m_min = min; + m_max = max; + connect(m_view.clip_position, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckStart())); + connect(m_view.clip_duration, SIGNAL(textChanged(const QString &)), this, SLOT(slotCheckDuration())); +} + +void ClipDurationDialog::slotCheckStart() { + int pos = m_tc.getFrameCount(m_view.clip_position->text(), m_fps); + int dur = m_tc.getFrameCount(m_view.clip_duration->text(), m_fps); + GenTime start(pos, m_fps); + GenTime duration(dur, m_fps); + if (start < m_min) { + m_view.clip_position->setText(m_tc.getTimecode(m_min, m_fps)); + } else if (start + duration > m_max) { + m_view.clip_position->setText(m_tc.getTimecode(m_max - duration, m_fps)); + } +} + +void ClipDurationDialog::slotCheckDuration() { + int pos = m_tc.getFrameCount(m_view.clip_position->text(), m_fps); + 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)); + } +} + void ClipDurationDialog::slotPosUp() { int position = m_tc.getFrameCount(m_view.clip_position->text(), m_fps); //if (duration >= m_clip->duration().frames(m_fps)) return; diff --git a/src/clipdurationdialog.h b/src/clipdurationdialog.h index 7791f7c7..17cfe06b 100644 --- a/src/clipdurationdialog.h +++ b/src/clipdurationdialog.h @@ -37,9 +37,11 @@ public: GenTime startPos() const; GenTime cropStart() const; GenTime duration() const; + void setMargins(GenTime min, GenTime max); protected: void wheelEvent(QWheelEvent * event); + private slots: void slotPosUp(); void slotPosDown(); @@ -47,13 +49,16 @@ private slots: void slotDurDown(); void slotCropUp(); void slotCropDown(); + void slotCheckDuration(); + void slotCheckStart(); private: Ui::ClipDurationDialog_UI m_view; AbstractClipItem *m_clip; Timecode m_tc; double m_fps; - + GenTime m_min; + GenTime m_max; }; diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 26dca383..f6655168 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -862,38 +862,51 @@ void CustomTrackView::mouseDoubleClickEvent(QMouseEvent *event) { } } else if (m_dragItem) { ClipDurationDialog d(m_dragItem, m_document->timecode(), this); + GenTime minimum; + GenTime maximum; + if (m_dragItem->type() == TRANSITIONWIDGET) { + getTransitionAvailableSpace(m_dragItem, minimum, maximum); + } else { + getClipAvailableSpace(m_dragItem, minimum, maximum); + } + //kDebug()<<"// GOT MOVE POS: "<startPos()) { - if (m_dragItem->type() == AVWIDGET) { - ItemInfo startInfo; - startInfo.startPos = m_dragItem->startPos(); - startInfo.endPos = m_dragItem->endPos(); - startInfo.track = m_dragItem->track(); - ItemInfo endInfo; - endInfo.startPos = d.startPos(); - endInfo.endPos = m_dragItem->endPos() + (endInfo.startPos - startInfo.startPos); - endInfo.track = m_dragItem->track(); - MoveClipCommand *command = new MoveClipCommand(this, startInfo, endInfo, true); - m_commandStack->push(command); - } else { - //TODO: move transition + if (m_dragItem->type() == TRANSITIONWIDGET) { + // move & resize transition + ItemInfo startInfo; + startInfo.startPos = m_dragItem->startPos(); + startInfo.endPos = m_dragItem->endPos(); + startInfo.track = m_dragItem->track(); + ItemInfo endInfo; + endInfo.startPos = d.startPos(); + endInfo.endPos = endInfo.startPos + d.duration(); + endInfo.track = m_dragItem->track(); + MoveTransitionCommand *command = new MoveTransitionCommand(this, startInfo, endInfo, true); + m_commandStack->push(command); + } else { + // 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 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()) { - if (m_dragItem->type() == AVWIDGET) { - ItemInfo startInfo; - startInfo.startPos = m_dragItem->startPos(); - startInfo.endPos = m_dragItem->endPos(); - startInfo.track = m_dragItem->track(); + if (d.duration() != m_dragItem->duration()) { ItemInfo endInfo; - endInfo.startPos = startInfo.startPos; + endInfo.startPos = clipInfo.startPos; endInfo.endPos = endInfo.startPos + d.duration(); endInfo.track = m_dragItem->track(); - ResizeClipCommand *command = new ResizeClipCommand(this, startInfo, endInfo, true); - m_commandStack->push(command); - } else { - //TODO: resize transition + new ResizeClipCommand(this, clipInfo, endInfo, true, moveCommand); } + m_commandStack->push(moveCommand); } } } else { @@ -3538,4 +3551,34 @@ void CustomTrackView::clipNameChanged(const QString id, const QString name) { viewport()->update(); } +void CustomTrackView::getClipAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum) { + minimum = GenTime(); + maximum = GenTime(); + QList selection; + selection = m_scene->items(0, item->track() * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), 2); + selection.removeAll(item); + for (int i = 0; i < selection.count(); i++) { + AbstractClipItem *clip = static_cast (selection.at(i)); + if (clip && clip->type() == AVWIDGET) { + if (clip->endPos() <= item->startPos() && clip->endPos() > minimum) minimum = clip->endPos(); + if (clip->startPos() > item->startPos() && (clip->startPos() < maximum || maximum == GenTime())) maximum = clip->startPos(); + } + } +} + +void CustomTrackView::getTransitionAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum) { + minimum = GenTime(); + maximum = GenTime(); + QList selection; + selection = m_scene->items(0, (item->track() + 1) * m_tracksHeight, sceneRect().width(), 2); + selection.removeAll(item); + for (int i = 0; i < selection.count(); i++) { + AbstractClipItem *clip = static_cast (selection.at(i)); + if (clip && clip->type() == TRANSITIONWIDGET) { + if (clip->endPos() <= item->startPos() && clip->endPos() > minimum) minimum = clip->endPos(); + if (clip->startPos() > item->startPos() && (clip->startPos() < maximum || maximum == GenTime())) maximum = clip->startPos(); + } + } +} + #include "customtrackview.moc" diff --git a/src/customtrackview.h b/src/customtrackview.h index 951abb53..3b25d901 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -223,6 +223,11 @@ private: bool insertPossible(AbstractGroupItem *group, const QPoint &pos) const; void resetSelectionGroup(bool selectItems = true); void groupSelectedItems(bool force = false); + /** Get available space for clip move (min and max free positions) */ + void getClipAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum); + /** Get available space for transition move (min and max free positions) */ + void getTransitionAvailableSpace(AbstractClipItem *item, GenTime &minimum, GenTime &maximum); + private slots: void slotRefreshGuides();